彩图和灰图(调板)
彩图和灰图(调板)
从以下几个方面谈谈灰度化,什么是灰度化?为什么要灰度化?灰度化的方法?
之前老不理解王克师兄的基于全画面是啥意思,今天看了李雪梅.唐万有《印刷品缺陷检测的方法研究》终于似乎有些明白。“密度检测和度检测虽然是有效的印刷质量控制方式,但这种控制方式主要依赖检测局部块(测控条),缺陷检测要求操作者积累的经验和主观判断。” 可以看得出以前的检测方式是基于局部的,机器视觉的检测是基于整个画面的。
20190104更新:昨天终于结束了开题报告,齐春老师的两个学生分别做的是图像去雾和2D转D,李杰老师的两个学生做的是相机硬件那一块。开完题终于可以安心弄自己的了,离放假还有三周时间,不仰望星空,只脚踏实地。0104 - 0111这一周的时间主要还是沿着开题前的灰度化做。主要研究下彩图和灰图的种种吧。
一,一些科普吧。
人类能辨别的彩:人类可以辨别几千种不同的彩而只能辨别几十种不同的灰度。
颜的本质:颜的本质是牛顿最早系统研究和发现的,牛顿真是个人才。物质之所以呈现出某种颜,一般是由于物质有选择地吸收了白光中的某种波长的光,从而呈现出与之互补的那种光的颜。
灰:灰的一个极端白反射了所有的光,另一个极端黑则吸收了所有的光。中间的灰能够同样吸收所有波长的光,只不过同时也会反射所有波长的光,反射的光多显浅灰,反射的光少显深灰。
彩图像处理技术:分为伪彩处理技术和真彩处理技术,前者是将灰度图像转化为彩图像的处理,后者是对彩图像不同分量的分别处理。都不是我要研究的重点,了解即可。
二,彩模型:从应用的角度看,人们所提出的众多彩模型可分成两类。一类面向诸如彩显示器或彩打印机之类的硬设备,另一类面向视觉感知或者说以彩处理分析为目的的应用,如各种图像处理算法。颜通常用三个相对独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜空间。而颜可以由不同的角度,用三个一组的不同属性加以描述,就产生了不同的颜空间。但被描述的颜对象本身是客观的,不同颜空间只是从不同的角度去衡量同一个对象。颜空间按照基本结构可以分两大类:基颜空间和、亮分离颜空间。前者的典型是 RGB,还包括 CMY、CMYK、CIE XYZ 等;后者包括 YCC/YUV、Lab、以及一批“相类颜空间”。
1,RGB模型
2,CMY模型,利用三基光叠加产生的光的三补:蓝绿(cyan,蓝加绿),品红(magenta,红加蓝),黄(yellow,红加绿)。也是颜料的三基,故主要用于彩打印。
,YUV模型,Y是亮度分量,也就是灰度。UV是度分量,疑问1。跟视觉有关,人类对绿敏感。
4,前面三种都是面向硬设备的彩模型,还有一大类是面向视觉感知的彩模型。最基本的是HSI模型和LAB模型。
三,谈谈为什么要灰度化吧,相机也是有黑白相机的,CCD也是能自带灰度图的,这也是我的疑问,也是开题的时候李杰老师问我的。黑白CCD摄像机获得的图像经过彩图像采集卡模数转换后,得到的是24位真彩数字图像。存疑。
四,编程过程中的重点操作:
1,将逻辑调板选入系统调板:
HPALETTE m_hPalette;
::SelectPalette(pDC -> GetSafeHdc(), m_hPalette, TRUE);
pDC -> SetStretchBltMode(COLOROCOLOR); // 是否必要?
五,具体方法,分为直接法和间接法,其中直接法又按照是否生成调板分为两种方式。
1,直接法不生成调板。直接操作原像素的RGB,注意位图数据中是以BGR,BGR的形式依次排列的。
步骤如下:
(1) 取真彩图像每个象素的R、G、B三个字节分量;
(2) 计算加权灰度值GrayValue=0.B0.59G0.11R;
() 令R=G=B=GrayValue,并替换原图中每个象素的RGB分量。
其中,GrayValue的值有多种取法,这里采用的是最符合人眼视觉的方法。以下面图像为例。采用按行按列的循环方式方法1的灰度化需要12ms.
用不同的循环方式遍历像素耗时竟然相差10倍以上!!!
// 用如下这种for循环计算时跳不过因为要补齐4字节整数倍的空字节,会出现不理想的效果/* 以下这种循环用时很少,基本在5ms以内for(int i = 0; i < n/; i){*(m__lpData i*) = *(m__lpData i* 2 );*(m__lpData i*1) = *(m__lpData i* 2 );}*/ // 以下这种循环用时很长,基本在50ms以上for(int i = 0; i < m_Dib.GetHeight(); i)for(int j = 0; j < m_Dib.GetWidth(); j){*( m__lpData i*m_Dib.GetLineByte() j* 2 ) = *( m__lpData i*m_Dib.GetLineByte() j* );*( m__lpData i*m_Dib.GetLineByte() j* 1 ) = *( m__lpData i*m_Dib.GetLineByte() j* );}
用第一种循环方式遍历每个像素,即不考虑行和列,而是直接看作一个连续的整体,耗时虽然很短,但是如果实验图的每行最后需要补0以成为4的整数倍时,容易出现失真。如下图所示:
解决方案为:
首先,如果CCD相机拍的图每行字节数正好是4的整数倍(一般是的)就不用解决这个问题了,相机拍出的图像是跟相机相关的,比如王蒙师实验室用的CCD面阵相机采的图都是1500*1000像素,每行有4500字节,自然是4的整数倍,因此不用考虑该问题。
以下是具体解决方案:
if(m_Dib.GetLineByte() / == 0) // 每行像素刚好是4字节整数倍,末尾不用补零{for(int i = 0; i < n/; i){*(m__lpData i*) = *(m__lpData i* 2 );*(m__lpData i*1) = *(m__lpData i* 2 );}}
else // 每行末尾需要补零凑齐4字节整数倍的情况
{int nJumpByte = m_Dib.GetLineByte() - m_Dib.GetWidth() * ; // 每行补零字节数为nJumpByteint nCount = 0; // 计数,追踪处理到每行第几个像素for(int j = 0; j < m_Dib.GetWidth() * m_Dib.GetHeight();j){*(m__lpData j*) = *(m__lpData j* 2 );*(m__lpData j*1) = *(m__lpData j* 2 );nCount;if(nCount == m_Dib.GetWidth())j = nJumpByte;}
}
用了一个if-else结构判断是否存在末尾补零的情况。具体思想就是遇到末尾零字节自动跳过。因为RGB的分量灰度化不用计算灰度值,所以基于主的真彩图灰度化是否是一种行之有效的方法?
2,直接法生成调板
产生256级灰度调板。直接将24位位图转化为带调板的256级灰度位图。
步骤如下:
(1) 创建256位图的颜表,顺序排列为(0,0,0),(1,1,1)、⋯(255,255,255);
(2) 据这个颜表来创建逻辑调板;计算每个象素像第一种方法一样;
() 改写图像象素数据。此时分配内存是原图像的三分之一,计算每个象素的加权灰度值GrayValue=0.B0.59G0.11R,压缩三个象素为只用一个字节记录,计算灰度后再将这个灰度值直接每字节顺序填入到分配的内存中;
(4) 改变文件信息头中相关信息,此时该图像文件大小变为:信息头结构大小颜表结构大小256(RGBQUAD)结构大小图像大小。其信息头中的biSizelmage应为原来的1/;biBitCount应为8。
2.1 调板的作用??
显示图像的时候发现有没有选入设备环境新的调板结果都是一样的。。。。
创建调板的一般步骤:
1 建立一个LOGPALETTE结构和PALETTEETRY数组
2 对PALETTEETRY数组进行赋值,即创建调板颜表
建立CPalette对象并使用CreatePalette函数初始化调板对象
4 使用SelectPalette函数将设备描述表和调板联系起来
5 使用CDC中的RealizePalette函数使调板生效
// 设置调板DWORD dwSize = 2*sizeof(WORD) m_Dib.GetumOfColor() * sizeof(PALETTEETRY);// 调板大小LPLOGPALETTE lpLogPalette = (LPLOGPALETTE)new BYTE[dwSize]; // 为调板申请内存memset(lpLogPalette,0,dwSize);// 生成新的逻辑调板lpLogPalette->palVersion = 0x00;lpLogPalette->palumEntries = (unsigned short)m_Dib.GetumOfColor();for(int i = 0; i < (int)m_Dib.GetumOfColor(); i){lpLogPalette->palPalEntry[i].peBlue = i;lpLogPalette->palPalEntry[i].peGreen = i;lpLogPalette->palPalEntry[i].peRed = i;lpLogPalette->palPalEntry[i].peFlags = 0;m__lpRgbQuad;}// 创建调板CPalette m_palette;m_palette.CreatePalette(lpLogPalette);dc.SelectPalette(&m_palette,TRUE);dc.RealizePalette();
以上代码设置的调板起不到作用,怎样才能让设置的调板起作用呢?
虽然设置调板行不通了,但可以通过改造数据进行操作。这也是书梦用到的方法。以上三种方法对猩猩图的灰度化分别为5,17,12毫秒。
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 14 条评论) |
本站网友 石家庄皮肤病医院 | 7分钟前 发表 |
三,谈谈为什么要灰度化吧,相机也是有黑白相机的,CCD也是能自带灰度图的,这也是我的疑问,也是开题的时候李杰老师问我的 | |
本站网友 大国丰臣 | 30分钟前 发表 |
⋯(255 | |
本站网友 构图方法 | 7分钟前 发表 |
Lab | |
本站网友 比较器 | 0秒前 发表 |
一类面向诸如彩显示器或彩打印机之类的硬设备,另一类面向视觉感知或者说以彩处理分析为目的的应用,如各种图像处理算法 | |
本站网友 天坛医院神经内科 | 28分钟前 发表 |
存疑 | |
本站网友 生活常识问答 | 27分钟前 发表 |
如下图所示: 解决方案为: 首先,如果CCD相机拍的图每行字节数正好是4的整数倍(一般是的)就不用解决这个问题了,相机拍出的图像是跟相机相关的,比如王蒙师实验室用的CCD面阵相机采的图都是1500*1000像素,每行有4500字节,自然是4的整数倍,因此不用考虑该问题 | |
本站网友 西安华仁医院 | 13分钟前 发表 |
步骤如下: (1) 取真彩图像每个象素的R | |
本站网友 于爱荣 | 29分钟前 发表 |
此时分配内存是原图像的三分之一,计算每个象素的加权灰度值GrayValue=0.B0.59G0.11R,压缩三个象素为只用一个字节记录,计算灰度后再将这个灰度值直接每字节顺序填入到分配的内存中; (4) 改变文件信息头中相关信息,此时该图像文件大小变为:信息头结构大小颜表结构大小256(RGBQUAD)结构大小图像大小 | |
本站网友 大连爆炸 | 1分钟前 发表 |
本站网友 ctrl是什么意思 | 13分钟前 发表 |
其中,GrayValue的值有多种取法,这里采用的是最符合人眼视觉的方法 | |
本站网友 刘家豪 | 22分钟前 发表 |
彩图像处理技术:分为伪彩处理技术和真彩处理技术,前者是将灰度图像转化为彩图像的处理,后者是对彩图像不同分量的分别处理 | |
本站网友 cc防火墙 | 18分钟前 发表 |
创建调板的一般步骤 | |
本站网友 点光源 | 24分钟前 发表 |
彩图像处理技术:分为伪彩处理技术和真彩处理技术,前者是将灰度图像转化为彩图像的处理,后者是对彩图像不同分量的分别处理 |