灰度图像的ASCII图像生成
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计实验报告
设计题目:灰度图像的ASCII图像生成
学院:电子工程学院
专业:电子信息工程
班级:
学号:
姓名:
电子邮件:
日期: 2013 年 9 月
成绩:
指导教师:
电子工程学院
课程设计任务书
学生姓名指导教师邓成
学生学号专业电子工程学院
题目灰度图像的ASCII图像生成
一.设计概述
1.课程设计题目:灰度图像的ASCII图像生成
2.相关知识:
灰度图像:一幅完整的图像,是由红色绿色蓝色三个通道组成的。红色、绿色、蓝色三个通道的缩览图都是以灰度显示的。用不同的灰度色阶来表示“红,绿,兰”在图像中的比重。通道中的纯白,代表了该色光在此处为最高亮度,亮度级别是255。通道是整个Photoshop显示图像的基础。色彩的变动,实际上就是间接在对通道灰度图进行调整。通道是Photoshop处理图像的核心部分,所有的色彩调整工具都是围绕在这个核心周围使用的在计算机领域中,灰度数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;灰度图像在黑色与白色之间还有许多级的颜色深度。但是,在数字图像领域之外,“黑白图像”也表示“灰度图像”,例如灰度的照片通常叫做“黑白照片”。在一些关于数字图像的文章中单色图像等同于灰度图像,在另外一些文章中又等同于黑白图像
ASCII 字符图”这一术语指的是图像的文本表示形式,即使用等宽字体字符(如Courier New 字符)的网格来绘制图像
3设计思路:
将图像内容用ASCII码显示出来主要就是用不同的字符表示灰度,以此来区分不同的灰度值达到将内容可视化的目的,这个道理很简单,实现起来其实也不难,如果是直接输入到控制台或者txt文件的则比较简单,主要是需要设置一下字体的宽高,最好是正方形的,否则看起来会比较别扭。下面一个是将lena缩放到100*100之后在控制台窗口直接显示的截图,采用的字符是标点,字体设置的宽
高相等为8*8:
二:相关程序
用OpenCV来将字符写到图像上,使用putText函数,不过OpenCV中的字体好像不能设置为等宽高,没办法,就取了折中的方法,将用来代替灰度的所有字符的宽度和高度取了个平均作为字符宽高,这样就将原图像中的一个像素替换为这样一个字符,而且还设置了几个选项:可以选择标点,字母或者数字来代替灰度,并且可以选择输出二值,灰度或者彩色ascii图像-----文中只使用了8个灰度级,即将整幅图像量化为了8个灰度级,这样的缺点就是对灰度分布比较集中的图像失真比较大,可以先对图像进行灰度均衡化处理之后再转换,这里没有考虑这些,下面是主要的函数代码。
[cpp] view plaincopyprint?
charascii_code_symbol[CODE_SIZE-7] = {'#','&','$','*','+',';','.',' ',0};
char ascii_code_letter[CODE_SIZE-7] = {'m','n','e','f','t','l','i',' ',0};
char ascii_code_number[CODE_SIZE-7] = {'8','9','5','3','2','7','1',' ',0};
char *ascii_code_8[3] = { ascii_code_symbol, ascii_code_letter, ascii_code_number}; //check the input image size and return a defined size,
// that's the max one of width and height is not bigger than 100;
cv::Size get_board_size(Mat &image)
{
if(image.empty())
return Size(0,0);
int f = 0;
float big=(float)image.rows, smal=(float)image.cols;
if(image.cols>image.rows)
{
f = 1;
big = float(image.cols);
smal = float(image.rows);
}
cv::Size board_size;
if(big <= 100.f)
{
board_size = cv::Size(image.cols, image.rows);
}
else
{
board_size = cv::Size(int(f==1?100:(100*image.cols/big)), int(f==1?(100*image.rows/big):100));
}
returnboard_size;
}
//get the char code step
intget_char_size(const string &asciiStr)
{
//init font
intfontFace = FONT_HERSHEY_PLAIN;
doublefontScale = 0.5;
int thickness = 1;
//max_size is the max of all the char code width and height,
//or return the average size of all the char code width and height;
intmax_size = 0;
inttotal_size = 0;
for (size_ti=0; i { int baseline = 0; stringstr(1, asciiStr[i]); cv::Sizetextsize = getTextSize(str, fontFace, fontScale, thickness, &baseline); if(max_size max_size = textsize.height+baseline; if(max_size max_size = textsize.width; total_size += (textsize.height+textsize.width+baseline); } returntotal_size/(asciiStr.size()*2); // returnmax_size; } /* convert image to ascii image; code_type: 0-symbol,1-letter,2-number color_type: 0-binary,1-gray,2-color