何东健-彩色位图转黑白位图代码
学习脚本制作:用按键精灵找图找色 RGB分量之偏色与彩色图片转黑白

学习脚本制作:用按键精灵找图找色RGB分量之偏色与彩色图片转黑白来源:按键学院【按键精灵】颜色对于制作脚本来说是至关重要的,找图找字找色都需要使用到颜色。
所以,对颜色的认识是也是非常重要的。
颜色知识大解剖【颜色是由三原色混合形成的】* 即红、绿、蓝。
三原色可以混合出所有的颜色。
* 我们通常把三原色简称为RGB(R、G、B是红(Red)、绿(Green)、蓝(Blue)的缩写)* R的值区间是0~255 这是十进制,转换成十六进制就是:00-FF (G、B也是一样)【RGB】*我们前面说,一个颜色是由三原色RGB构成的,例如白色(R、G、B值都为255时显示白色):*十六进制表示:FFFFFF (十六进制一共有六位,每两位表示一个原色)*十进制表示:255,255,255【按键精灵颜色表示格式BGR】应该有很多童鞋都知道,其实,我们按键的颜色表示并不是RGB的顺序来表示的,按键使用的表示方式是BGR,把R和B的位置互换了。
所以,有的时候,我们可能会遇到这样的情况:甲:“为什么!为什么我用XX颜色工具获取到的颜色不能识别!”乙:“哎呀,你看看你代码啊,那么乱说不定哪里错了。
”甲:“滚!给我圆滚滚的滚!哥的代码虽乱但那都是精华,怎么会错。
"甲因为不知道颜色知识,不知道按键颜色排列是BGR,也不知道xx颜色工具获取的颜色排列是RGB,所以苦恼了很久都没有找到问题所在。
【 RGB颜色格式转换为BGR】如果我们遇到这样的情况怎么办呢?其实,解决方法不麻烦,你看,一个BGR一个RGB,就是把RB的位置调换了而已,那再把它调回来不就得了么?问题是……要怎么个调法?例如:FF0033我们的思维很快,一秒钟就换过来了,RGB变成BGR 前后两位互调,那就是3300FF换成代码思路也不麻烦:1、获取颜色值:FF00332、用字符处理函数分割获取到的颜色值:FF|00|33 分别赋值给变量R、G、B3、将RGB三个字符变量合成,顺序为BGR那么生成代码就是这个样子:sColor = "FF0033"LenRGB = Len(sColor)R= Mid(sColor, 1, 2)G= Mid(sColor, 3, 2)B= Mid(sColor, 5, 2)MessageBox "BGR:" &B & G&R按键中还有个更方便的命令,不过这个命令,分出来的值是十进制的值:GetColor ="FF0033"Call Plugin.Color.ColorToRGB(GetColor, R, G, B)Msgbox " R:" & R & vbcrlf & " G:" & G & vbcrlf & " B:" & BRGB分量之偏色【大漠找字中的偏色】上面说到,把颜色分割成RGB三原色(分割颜色又称为分量),那么,分割颜色除了转换RGB,BGR还有其它的功用吗?答案是肯定的,应该有很多童鞋都使用过大漠工具,在大漠工具找字里,可以设置偏色。
精品文档-数字图像处理(第三版)(何东健)-第1章

第1章 概论
5. 图像分析(Image Analysis 图像处理应用的目标几乎均涉及图像分析, 即对图像中 的不同对象进行分割、 特征提取和表示, 从而有利于计算机 对图像进行分类、 识别和理解。 在工业产品零件无缺陷且正确装配检测中, 图像分析是 把图像中的像素转化成一个“合格”或“不合格”的判定。 在医学图像处理中, 不仅要检测出异变(如肿瘤)的存在, 而且还要检查其尺寸大小。
第1章 概论 图像自动分割是图像处理中最困难的问题之一。 人类视 觉系统能够将所观察的复杂场景中的对象分开并识别出每个物 体。 但对计算机来说, 却是一个非常困难的问题。 由于解 决和分割有关的基本问题是特定领域中图像分析实用化的关键 一步, 因此, 将各种方法融合在一起并使用知识来提高处理 的可靠性和有效性是图像分割的研究热点。
第1章 概论 4. 图像分割(Image Segmentation 把图像分成区域的过程即图像分割。 图像中通常包含多 个对象, 例如, 一幅医学图像中显示出正常的或有病变的各 种器官和组织。 为达到识别和理解的目的, 必须按照一定的 规则将图像分割成区域, 每个区域代表被成像的一个物体 (或部分)。
第1章 概论
(4) 图像数据量庞大。 图像中包含有丰富的信息, 可以通过图像处理技术获取图像中包含的有用信息。 但是, 数字图像的数据量巨大。 一幅数字图像是由图像矩阵中的像 素(Pixel )组成的, 通常每个像素用红、 绿、 蓝三种颜 色表示, 每种颜色用8bit表示灰度级。 那么一幅1024×768 不经压缩的真彩色图像, 数据量达2.25 MB (1024×768×8×3/8), 一幅遥感图像的数据量达3240× 2340×4=30Mb 。 如此庞大的数据量给存储、 传输和处理 都带来巨大的困难。 如果再提高颜色位数及分辨率, 数据量 将大幅度增加。
用抖动法处理黑白位图转换

用抖动法处理黑白位图转换foenix把256级灰度图转变为单色位图,最简单的方法是使用阀值法,先定义一个阀值(一般取128,256级灰度图的一个像素取值范围从0到255,表示这个点从黑到白的256级灰度),如果一个点的灰度值小于该阀值,则输出一个黑点,反之则输出一个白点。
参考源码如下:intsegX= cx%8 == 0 ? cx/8 : cx/8+1 ;// 阀值法(阀值取127)// 灰度值大于阀值,则该点置位,否则置否for ( int y=0; y<cy; y++ ){LPBYTE lpbPnt=(LPBYTE)lpvDIBits+y*nBytesPerLine;LPBYTE lpbmonoPnt=(LPBYTE)lpvMonoDIBits+y*nMonoBytesPerLine; for ( int x=0; x<segX; x++ ){int i=8;BYTE val=0;while ( i-- ) // 循环8次,在单色位图中,一个字节表示8个像素{if ( *lpbPnt++ > 127 )val|=1<<i; // 如果该像素灰度值大于阀值,则输出一个白点.if ( (8-i)+x*8 == cx ) // 是否到达每行的最后一个点break;}*lpbmonoPnt++=val;}}使用上面的转换方法,可以很方便的转换一个256级的灰度图到单色位图,不过该方法的输出效果不是很好,下面介绍一种抖动优化算法,改善位图的输出效果。
在单色位图中只有两种颜色,如何才能表现位图的灰度呢?这里介绍的方法是用一个8*8个像素的矩阵来模拟这种的灰度,通过改变矩阵内黑点和白点的比例,就可以很好的表现出灰度图的灰度变化了,我们把这样的一个矩阵称为一个图案。
当然了,用256种图案来表现源图的256级灰度是不现实的,也是没有必要的,通常我们可以使用32级或者16级灰度方案。
数字图像处理代码大全

1.图像反转MATLAB 程序实现如下:I=imread('xian.bmp');J=double(I);J=-J+(256-1);% 图像反转线性变换H=uint8(J);subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(H);2.灰度线性变换MATLAB 程序实现如下:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title(' 原始图像 ');axis([50,250,50,200]);axis on;% 显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title(' 灰度图像 ');axis([50,250,50,200]);axis on;% 显示坐标系J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1]subplot(2,2,3),imshow(J);title(' 线性变换图像 [0.1 0.5]');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系K=imadjust(I1,[0.30.7],[]);% 局部拉伸,把[0.30.7] 内的灰度拉伸为 [0 1]subplot(2,2,4),imshow(K);title(' 线性变换图像 [0.3 0.7]');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系3. 非线性变换MATLAB 程序实现如下:I=imread('xian.bmp');I1=rgb2gray(I);subplot(1,2,1),imshow(I1);title(' 灰度图像 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系J=double(I1);J=40*(log(J+1));H=uint8(J);subplot(1,2,2),imshow(H);title(' 对数变换图像 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系4. 直方图均衡化MATLAB 程序实现如下:I=imread('xian.bmp');I=rgb2gray(I);figure;subplot(2,2,1);imshow(I);subplot(2,2,2);imhist(I);I1=histeq(I);figure;subplot(2,2,1);imshow(I1);subplot(2,2,2);imhist(I1);5.线性平滑滤波器用 MATLAB 实现领域平均法抑制噪声程序:I=imread('xian.bmp');subplot(231)imshow(I)title(' 原始图像 ')I=rgb2gray(I);I1=imnoise(I,'salt & pepper',0.02);subplot(232)imshow(I1)title(' 添加椒盐噪声的图像')k1=filter2(fspecial('average',3),I1)/255;% 进行 3*3 模板平滑滤波k2=filter2(fspecial('average',5),I1)/255;% 进行 5*5 模板平滑滤波k3=filter2(fspecial('average',7),I1)/255;% 进行 7*7 模板平滑滤波k4=filter2(fspecial('average',9),I1)/255;% 进行 9*9 模板平滑滤波subplot(233),imshow(k1);title('3*3 模板平滑滤波 ');subplot(234),imshow(k2);title('5*5 模板平滑滤波 ');subplot(235),imshow(k3);title('7*7 模板平滑滤波 ');subplot(236),imshow(k4);title('9*9 模板平滑滤波 ');6.中值滤波器用 MATLAB 实现中值滤波程序如下:I=imread('xian.bmp');I=rgb2gray(I);J=imnoise(I,'salt&pepper',0.02);subplot(231),imshow(I);title(' 原图像 ');subplot(232),imshow(J);title(' 添加椒盐噪声图像'); k1=medfilt2(J);% 进行 3*3 模板中值滤波k2=medfilt2(J,[5,5]);% 进行 5*5 模板中值滤波k3=medfilt2(J,[7,7]);% 进行 7*7 模板中值滤波k4=medfilt2(J,[9,9]);% 进行 9*9 模板中值滤波subplot(233),imshow(k1);title('3*3 模板中值滤波 '); subplot(234),imshow(k2);title('5*5 模板中值滤波'); subplot(235),imshow(k3);title('7*7 模板中值滤波 '); subplot(236),imshow(k4);title('9*9 模板中值滤波 '); 7.用 Sobel 算子和拉普拉斯对图像锐化:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title(' 原始图像 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系I1=im2bw(I);subplot(2,2,2),imshow(I1);title(' 二值图像');axis([50,250,50,200]);grid on; axis on;% 显示网格线%显示坐标系H=fspecial('sobel'); J=filter2(H,I1);% 选择 sobel 算子% 卷积运算subplot(2,2,3),imshow(J);title('sobel 算子锐化图像 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系h=[0 1 0,1 -4 1,0 1 0];% 拉普拉斯算子J1=conv2(I1,h,'same');% 卷积运算subplot(2,2,4),imshow(J1);title(' 拉普拉斯算子锐化图像 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系8.梯度算子检测边缘用 MATLAB 实现如下:I=imread('xian.bmp');subplot(2,3,1);imshow(I);title(' 原始图像 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系I1=im2bw(I);subplot(2,3,2);imshow(I1);title(' 二值图像 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系I2=edge(I1,'roberts');figure;subplot(2,3,3);imshow(I2);title('roberts算子分割结果');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系I3=edge(I1,'sobel');subplot(2,3,4);imshow(I3);title('sobel算子分割结果 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系I4=edge(I1,'Prewitt');subplot(2,3,5);imshow(I4);title('Prewitt算子分割结果 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系9.LOG 算子检测边缘用 MATLAB 程序实现如下:I=imread('xian.bmp');subplot(2,2,1);imshow(I);title(' 原始图像 ');I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title(' 灰度图像 ');I2=edge(I1,'log');subplot(2,2,3);imshow(I2);title('log 算子分割结果 '); 10.Canny 算子检测边缘用 MATLAB 程序实现如下:I=imread('xian.bmp'); subplot(2,2,1);imshow(I);title(' 原始图像 ')I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title(' 灰度图像 ');I2=edge(I1,'canny'); subplot(2,2,3);imshow(I2);title('canny 算子分割结果 ');11. 边界跟踪(bwtraceboundary函数)clcclear allI=imread('xian.bmp');figureimshow(I);title('原始图像');I1=rgb2gray(I); threshold=graythresh(I1);% 将彩色图像转化灰度图像% 计算将灰度图像转化为二值图像所需的门限BW=im2bw(I1,threshold);% 将灰度图像转化为二值图像figureimshow(BW);title('二值图像');dim=size(BW);col=round(dim(2)/2)-90;% 计算起始点列坐标row=find(BW(:,col),1);% 计算起始点行坐标connectivity=8;num_points=180;contour=bwtraceboundary(BW,[row,col],'N',connectivity,num_p oints);%提取边界figureimshow(I1);hold on;plot(contour(:,2),contour(:,1), 'g','LineWidth' ,2); title(' 边界跟踪图像 ');12.Hough 变换I= imread('xian.bmp');rotI=rgb2gray(I);subplot(2,2,1);imshow(rotI);title(' 灰度图像 ');axis([50,250,50,200]);grid on;axis on;BW=edge(rotI,'prewitt');subplot(2,2,2);imshow(BW);title('prewitt算子边缘检测后图像');axis([50,250,50,200]);grid on;axis on;[H,T,R]=hough(BW);subplot(2,2,3);imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit'); title(' 霍夫变换图 ');xlabel('\theta'),ylabel('\rho');axis on , axis normal, hold on;P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));x=T(P(:,2));y=R(P(:,1));plot(x,y,'s','color','white');lines=houghlines(BW,T,R,P ,'FillGap',5,'MinLength',7); subplot(2,2,4);,imshow(rotI);title(' 霍夫变换图像检测');axis([50,250,50,200]);grid on;axis on;hold on;max_len=0;for k=1:length(lines)xy=[lines(k).point1;lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');len=norm(lines(k).point1-lines(k).point2);if(len>max_len)max_len=len;xy_long=xy;endendplot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');13.直方图阈值法用 MATLAB 实现直方图阈值法:I=imread('xian.bmp');I1=rgb2gray(I);figure;subplot(2,2,1);imshow(I1);title(' 灰度图像 ')axis([50,250,50,200]);grid on;% 显示网格线axis on;%显示坐标系[m,n]=size(I1);% 测量图像尺寸参数GP=zeros(1,256);% 预创建存放灰度出现概率的向量for k=0:255GP(k+1)=length(find(I1==k))/(m*n);% 计算每级灰度出现的概率,将其存入GP 中相应位置endsubplot(2,2,2),bar(0:255,GP ,'g')% 绘制直方图title(' 灰度直方图 ')xlabel(' 灰度值 ')ylabel(' 出现概率 ')I2=im2bw(I,150/255);subplot(2,2,3),imshow(I2);title(' 阈值 150 的分割图像 ')axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系I3=im2bw(I,200/255);%subplot(2,2,4),imshow(I3);title(' 阈值 200 的分割图像 ')axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系14. 自动阈值法: Otsu 法用MATLAB 实现 Otsu 算法:clcclear allI=imread('xian.bmp');subplot(1,2,1),imshow(I);title(' 原始图像 ')axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系level=graythresh(I);% 确定灰度阈值BW=im2bw(I,level);subplot(1,2,2),imshow(BW);title('Otsu 法阈值分割图像 ')axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系15. 膨胀操作I=imread('xian.bmp');% 载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title(' 灰度图像 ')axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系se=strel('disk',1);% 生成圆形结构元素I2=imdilate(I1,se);% 用生成的结构元素对图像进行膨胀subplot(1,2,2);imshow(I2);title(' 膨胀后图像 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系16. 腐蚀操作MATLAB 实现腐蚀操作I=imread('xian.bmp');% 载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title(' 灰度图像 ')axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系se=strel('disk',1);% 生成圆形结构元素I2=imerode(I1,se);% 用生成的结构元素对图像进行腐蚀subplot(1,2,2);imshow(I2);title(' 腐蚀后图像 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系17.开启和闭合操作用 MATLAB 实现开启和闭合操作I=imread('xian.bmp');% 载入图像subplot(2,2,1),imshow(I);title(' 原始图像 ');axis([50,250,50,200]);axis on;% 显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title(' 灰度图像');axis([50,250,50,200]);axis on;% 显示坐标系se=strel('disk',1);% 采用半径为1的圆作为结构元素I3=imclose(I1,se);% 闭合操作subplot(2,2,3),imshow(I2);title(' 开启运算后图像 ');axis([50,250,50,200]);axis on;% 显示坐标系subplot(2,2,4),imshow(I3);title(' 闭合运算后图像 ');axis([50,250,50,200]);axis on;% 显示坐标系18.开启和闭合组合操作I=imread('xian.bmp');% 载入图像subplot(3,2,1),imshow(I);title(' 原始图像 ');axis([50,250,50,200]);axis on;% 显示坐标系I1=rgb2gray(I);subplot(3,2,2),imshow(I1);title(' 灰度图像 ');axis([50,250,50,200]);axis on;% 显示坐标系se=strel('disk',1);I3=imclose(I1,se);%闭合操作subplot(3,2,3),imshow(I2);title(' 开启运算后图像 ');axis([50,250,50,200]);axis on;% 显示坐标系subplot(3,2,4),imshow(I3);title(' 闭合运算后图像 ');axis([50,250,50,200]);axis on;% 显示坐标系se=strel('disk',1);I4=imopen(I1,se);I5=imclose(I4,se);subplot(3,2,5),imshow(I5);% 开—闭运算图像title(' 开—闭运算图像 ');axis([50,250,50,200]);axis on;% 显示坐标系I6=imclose(I1,se);I7=imopen(I6,se);subplot(3,2,6),imshow(I7);% 闭—开运算图像title(' 闭—开运算图像 ');axis([50,250,50,200]);axis on;% 显示坐标系19. 形态学边界提取利用 MATLAB 实现如下:I=imread('xian.bmp');% 载入图像subplot(1,3,1),imshow(I);title(' 原始图像 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系I1=im2bw(I);subplot(1,3,2),imshow(I1);title(' 二值化图像 ');axis([50,250,50,200]);grid on;% 显示网格线axis on;% 显示坐标系I2=bwperim(I1);% 获取区域的周长subplot(1,3,3),imshow(I2);title(' 边界周长的二值图像 ');axis([50,250,50,200]);grid on;axis on;20.形态学骨架提取利用 MATLAB 实现如下:I=imread('xian.bmp'); subplot(2,2,1),imshow(I); title(' 原始图像 ');axis([50,250,50,200]); axis on;I1=im2bw(I);subplot(2,2,2),imshow(I1); title(' 二值图像 ');axis([50,250,50,200]); axis on;I2=bwmorph(I1,'skel',1); subplot(2,2,3),imshow(I2); title('1 次骨架提取 ');axis([50,250,50,200]); axis on;I3=bwmorph(I1,'skel',2); subplot(2,2,4),imshow(I3); title('2 次骨架提取 ');axis([50,250,50,200]); axis on;21.直接提取四个顶点坐标I = imread('xian.bmp');I = I(:,:,1);BW=im2bw(I);figureimshow(~BW)[x,y]=getpts。
何东健-数字图像处理-第4章

4.1 直方图4.2 灰度变换4.3 图像噪声4.4 去除噪声4.5 图像锐化4.6 图像的伪彩色处理4.7 编程实例第四章图像增强与平滑4.1 直方图4.1.1直方图的基本概念如果将图像中像素亮度(灰度级别)看成是一个随机变量,则其分布情况就反映了图像的统计特性,这可用Probability Density Function(PDF)来刻画和描述,表现为灰度直方图(Histogram)。
灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中每种灰度出现的频率,如图4-1所示。
灰度直方图的横坐标是灰度级,纵坐标是该灰度级出现的频度,它是图像最基本的统计特征。
图4-1 图像灰度直方图6646313266416665436646611223466543211426545654321设r代表图像中像素灰度级,作归一化处理后,r将被限定在[0,1]之内。
在灰度级中,r=0代表黑,r=1代表白。
对于一幅给定的图像来说,每一个像素取得[0,1]区间内的灰度级是随机的,也就是说r是一个随机变量。
假定对每一瞬间,它们是连(r)来表示原始图像续的随机变量,那么就可以用概率密度函数pr的灰度分布。
如果用直角坐标系的横轴代表灰度级r,用纵轴代(r),这样就可以针对一幅图像在这个表灰度级的概率密度函数pr坐标系中作出一条曲线来。
这条曲线在概率论中就是概率密度曲线,如图4-2所示。
图4-2 图像灰度分布概率密度函数Pr(r)r1Pr(r)10r(a)(b)从图像灰度级的分布可以看出一幅图像的灰度分布特性。
例如,从图4-2中的(a)和(b)两个灰度分布概率密度函数中可以看出:(a)的大多数像素灰度值取在较暗的区域,所以这幅图像肯定较暗,一般在摄影过程中曝光过强就会造成这种结果;(b)图像的像素灰度值集中在亮区,因此,图像(b)将偏亮,一般在摄影中曝光太弱将导致这种结果。
当然,从两幅图像的灰度分布来看图像的质量均不理想。
毕业设计--基于模式识别的水果智能分类系统[管理资料]
![毕业设计--基于模式识别的水果智能分类系统[管理资料]](https://img.taocdn.com/s3/m/fcd8d79527d3240c8547ef9b.png)
毕业设计基于模式识别的水果智能分类系统基于模式识别的水果智能分类系统摘要本论文综合运用了数字图像处理,模式识别的理论来构建起一个简单的水果智能分类系统。
实现了在相同条件下拍摄的水果图片的特征提取和种类识别,在此基础上设计出了基于人工神经网络的水果智能分类器,由计算机自动调整神经网络中各个权值,达到水果种类识别的自动化。
数字图像处理对源位图进行了加工,是特征提取的基础。
数字图像处理的理论涉及到彩色图像的灰度化、中值滤波、二值化、轮廓提取、种子填充、轮廓跟踪等。
其中,二值化采用了基本自适应门限的方法。
模式识别包括了特征提取和分类器的设计,是种类识别的关键。
特征提取主要利用了水果的几何特征,反映了水果的大小和形状。
分类器的设计主要采用了人工神经网络的方式来实现,具体说来是利用了神经网络中反向传播算法来进行网络训练,并利用训练结果完成了水果种类的智能识别。
关键词:特征提取人工神经网络二值化基本自适应门限反向传播算法A Intellective System for Fruit ClassificationBased on Pattern RecognitionAbstractIn this paper, we apply the theory of digital image processing and pattern recognition to construct a simply and intellective system for fruit classification based on pattern recognition. We have already fulfilled characteristic withdrew and type recognition for the pictures of fruit which are photographed under the same condition .We have also designed a categorize machine based on artificial neuro-network , which can adjust the weights of neuro-network automatically by computer in order to recognize the type of the fruit.Digital image processing deals with the original bitmap ,which is the basis of characteristic withdrew .The theory of digital image processing refers to the gradation of color image ,median filter ,image binary, outline withdrew ,the seed fills ,outline track and so on. Among them, image binary makes use of the basic auto-adapted threshold method.Pattern recognition involves characteristic withdrew and the design of categorize machine, which are the keys of type recognition. The characteristic withdrew has mainly used fruit's geometry characteristics ,which reflect fruit’s size and shape .The categorize machine is designed by means of artificial neuro-network, which uses the algorithm of Back-Propogation in detail and completes the fruit type intelligent recognition by using the training results. Keywords:characteristic withdrew, artificial neuro-network, image binary, basic auto-adapted threshold, the algorithm of Back-Propogation.目录摘要 (I)Abstract (III)第1章绪论 (6)模式识别的发展情况 (6)模式识别和模式的概念 (6)模式识别的应用 (7)水果智能分类系统的研究情况 (7)国内研究现状 (7)国外研究现状 (8)第2章图像采集 (9)图像采集的几种方法 (9)本课题所采用的图像采集方法 (9)第3章图像预处理 (11)数字图像处理的基本内容 (11)常用的几种图像文件 (11)与设备无关位图 (12)位图的显示 (14)彩色图像的颜色空间转换 (15)彩色图像的灰度化处理 (17)将伪彩色图像转化为灰度图 (17)将24位真彩位图转化为灰度图 (17)中值滤波 (18)图像的二值化处理 (18)基本全局门限 (19)基本自适应门限 (20)第4章图像分割与特征提取 (21)消除小杂质区域面积 (21)二值图像的区域标记 (21)二值图像的小区域消除 (22)消除大杂质区域 (22)轮廓提取 (23)种子填充 (24)消除杂质区域 (25)特征提取简介 (25)本系统的特征提取 (26)特征形成 (26)特征获取 (26)第5章分类器的设计 (28)人工神经网络基础 (28)人工神经元 (28)前馈神经网络 (29)反向传播算法的应用(BP法) (29)数据归一化 (29)BP算法 (30)神经网络设计思路 (32)结论 (34)致谢 (36)参考文献 (35)附录 (32)第1章绪论1.1模式识别的发展情况模式识别[1]诞生于20世纪20年代,随着40年代计算机的出现,50年代人工智能的兴起,模式识别在60年代初迅速发展成一门学科。
c#如何将一个彩色图像转换成黑白图像

c#如 何 将 一 个 彩 色 图 像 转 换 成 黑 白 图 像
彩色图像转换为黑白图像时需要计算图像中每像素有效的亮度值,通过匹配像素 亮度值可以轻松转换为黑白图像。 计算像素有效的亮度值可以使用下面的公式: Y=0.3RED+0.59GREEN+0.11Blue 然后使用 Color.FromArgb(Y,Y,Y) 来把计算后的值转换 转换代码可以使用下面的方法来实现:
[C#] public Bitmap ConvertToGrayscale(Bitmap source) { Bitmap bm = new Bitmap(source.Width,source.Height); for(int y=0;y<bm.Height;y++) { for(int x=0;x<bm.Width;x++) { Color c=source.GetPixel(x,y); int luma = (int)(c.R*0.3 + c.G*0.59+ c.B*0.11); bm.SetPixel(x,y,Color.FromArgb(luma,luma,luma)); } } bm; }
计算机视觉之图像特效(实现图像灰度处理、颜色反转、马赛克、毛玻璃、图片融合等功能)

计算机视觉之图像特效(实现图像灰度处理、颜⾊反转、马赛克、⽑玻璃、图⽚融合等功能)1.图像灰度处理下⾯介绍四种图像灰度处理的⽅法:⽅法1:cv2中的imread(参数:0表⽰为灰度图⽚,1表⽰为彩⾊图⽚)测试代码如下:1import cv22# ⽅法1 imread3 img0 = cv2.imread('image0.jpg', 0) # 0 为灰度图⽚ 1 为彩⾊图⽚4 img1 = cv2.imread('image0.jpg', 1)5print(img0.shape)6print(img1.shape)7 cv2.imshow('src0',img0)8 cv2.imshow('src1',img1)9 cv2.waitKey(0)运⾏结果如下:src0为灰度图像:src1为彩⾊图像:⽅法 2:cvtColor测试代码如下:1# ⽅法2 cvtColor2import cv23 img = cv2.imread('image0.jpg', 1)4 dst = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 完成颜⾊空间的转换从bgr模式转化为灰度模式5 cv2.imshow('dst', dst)6 cv2.waitKey(0)运⾏结果如下:同样的可以转化为灰度图像:⽅法3:对RGB三个分量取均值1# ⽅法3 RGB R=G=B gray=(R+G+B)/32import cv23import numpy as np4 img = cv2.imread('image0.jpg', 1)5 cv2.imshow('src',img)6 imgInfo = img.shape7 height = imgInfo[0]8 width = imgInfo[1]9 dst = np.zeros((height,width,3),np.uint8)10for i in range(0,height):11for j in range(0,width):12 (b,g,r) = img[i,j]13 gray = (int(b)+int(g)+int(r))/3 # 防⽌数据溢出14 dst[i,j] = np.uint8(gray)15 cv2.imshow('dst',dst)16 cv2.waitKey(0)运⾏结果:略⽅法4:对rbg加权 gray = r*0.299+g*0.587+b*0.114 1# ⽅法4 对rbg加权2# gray = r*0.299+g*0.587+b*0.1143import cv24import numpy as np5 img = cv2.imread('image0.jpg', 1)6 cv2.imshow('src',img)7 imgInfo = img.shape8 height = imgInfo[0]9 width = imgInfo[1]10 dst = np.zeros((height,width,3),np.uint8)11 w = [0.299, 0.587, 0.114]12for i in range(0,height):13for j in range(0,width):14 (b,g,r) = img[i,j]15 gray = r*0.299+g*0.587+b*0.11416 dst[i,j] = np.uint8(gray)17 cv2.imshow('dst',dst)18 cv2.waitKey(0)运⾏结果:略图像转灰度算法优化:原因:重要基础实时性优化⽅法:定点运算优于浮点运算减法优于乘除移位运算优于乘除测试代码如下:1import cv22import numpy as np3 img = cv2.imread('image0.jpg', 1)4 cv2.imshow('src',img)5 imgInfo = img.shape6 height = imgInfo[0]7 width = imgInfo[1]8 dst = np.zeros((height,width,3),np.uint8)9for i in range(0,height):10for j in range(0,width):11 (b,g,r) = img[i,j]12 b = int(b)13 g = int(g)14 r = int(r)15# gray = (int(b) + int(g) + int(r)) / 3 # 防⽌数据溢出16 gray = (r+(g << 1)+b) >> 2 # 浮点转化成了定点 r和b乘以1省略掉乘除转化为移位运算但是会损失⼀点精度17 dst[i,j] = np.uint8(gray)18 cv2.imshow('dst',dst)19 cv2.waitKey(0)运⾏结果如下:src为彩⾊的原始图像:dst为转化为灰度的⽬标图像:其实可以通过算法优化的图像对⽐前⾯四种⽅法处理后的图像,可以知道,其实效果都差不多,但是性能显著提升!2.颜⾊反转颜⾊反转分为:灰度图的颜⾊反转和RGB图的颜⾊反转,但是本质上都是⼀样的,取反操作即对每个像素点进⾏取反得到新的像素值,或者⽤255-当前像素值(⼋位的时候)。
24位真彩色转换为8位灰度图片(完整代码)

24位真彩色转换为8位灰度图片(完整代码)分类:C#2011-03-04 09:29 4343人阅读评论(5) 收藏举报nullfloatgdi+byte图像处理image图像的灰度与二值化/maozefa/archive/2011/12/09/2281656.html图像的灰度化与二值化是图像处理中最常见的处理方法,也是很多图像处理方法的基础,如图像灰度统计、图像识别等。
图像的灰度化与二值化方法较多,处理过程也比较简单。
但切不可因其简单而忽视效率。
如常用的图像灰度计算公式:gray = red * 0.299 + green * 0.587 + blue * 0.114,如果在程序代码中直接套用了这个公式,因浮点数的缘故导致代码执行效率较低,如改为定点整数运算,可使执行效率大大提高。
下面是图像的灰度与二值化代码:// 定义ARGB像素结构typedef union{ARGB Color;struct{BYTE Blue;BYTE Green;BYTE Red;BYTE Alpha;};}ARGBQuad, *PARGBQuad;//---------------------------------------------------------------------------// 图像数据data灰度化VOID Gray(BitmapData *data){PARGBQuad p = (PARGBQuad)data->Scan0;INT offset = data->Stride - data->Width * sizeof(ARGBQuad);for (UINT y = 0; y < data->Height; y ++, (BYTE*)p += offset){for (UINT x = 0; x < data->Width; x ++, p ++)p->Blue = p->Green = p->Red =(UINT)(p->Blue * 29 + p->Green * 150 + p->Red * 77 + 128) >> 8;}}//---------------------------------------------------------------------------// 图像数据data灰度同时二值化,threshold阀值VOID GrayAnd2Values(BitmapData *data, BYTE threshold){PARGBQuad p = (PARGBQuad)data->Scan0;INT offset = data->Stride - data->Width * sizeof(ARGBQuad);for (UINT y = 0; y < data->Height; y ++, (BYTE*)p += offset){for (UINT x = 0; x < data->Width; x ++, p ++){if (((p->Blue * 29 + p->Green * 150 + p->Red * 77 + 128) >> 8) < threshold) p->Color &= 0xff000000;elsep->Color |= 0x00ffffff;}}}//---------------------------------------------------------------------------因本文使用的是32位图像数据,所以图像的二值化没有采用通常的赋值操作p->Blue = p->Green = p->Red = 0(或者255),而是采用了位运算。
数字图像处理2-真彩色,灰度图像,索引色图像等的相互转化

timg 真彩色timg1 灰度图像timg2 索引色图像(64色)timg3 二值图像(阈值为0.5)这里从网上找到了timg真彩色图像作为本次作业中进行数字处理的图像。
首先在ps中调整了图像模式,并进行了另存为,生成了timg1与timg2,又在MATLAB中将灰度图像转化为了二值图像timg3,其中阈值为0.5。
这一步操作的代码如下:A = imread('timg1.jpg');B = im2bw(A, 0.5);imshow(B)imwrite(B,'timg3.jpg');随后我们来对每个图像imread的返回值进行观察。
对于timg处理的程序如下:A = imread('timg.jpg');disp(A);whos Aimshow(A)由于disp显示数据过多,这里不放原始数据了。
其具体内容为3个数组,每个数组都是320*200的,分别代表图片中每个像素的rgb值。
而whos语句显示出的内容如下:Bytes Class Name Size192000 uint8A 200x320x3其中200*320*3说明图像像素为200*320而且为rgb格式,有3个矩阵。
192000为图片大小,而其rgb值是用unit8即8位无符号整数存储,0-255的值代表了某一点像素某一颜色分量的强度。
同理,若将上述程序中的timg改为timg1灰度图像,显示出来的矩阵则只有一个,大小仍为200*320但是每个点的数值则代表对应像素的灰度值。
whos语句显示出的内容如下:Name SizeBytes Class64000 u int8A 200x320由于灰度图像只需要存储灰度而不是rgb3个分量,其大小便没有最后的*3,因此其大小也只为timg的1/3。
对于索引图进行的操作与其他图像不同,由于其本身存储的是索引值,需要导入索引表才能还原原本的图像,因此程序如下:[IM, map] = imread('timg2.png','png');disp(IM);IMrgb(:,:,:) = ind2rgb(IM,map);whos IMrgbimshow(IMrgb)这里如果直接imshow原本图像的话会根据灰度图像的方式显示错误的图像,因此采用了一个ind2rgb函数通过之前导入的索引表和索引值矩阵将图像恢复为rgb图像矩阵。
何东健-彩色位图转黑白位图代码

何东健主编《数字图像处理》程序//////////////////////////////////////////////////////////////////////////BOOL MakeGray256(BYTE mGrayType, CDibObject *pDibObject)//----------------------------------------------------------------------//基本功能:本函数将传入的CDibObject对象中的图像从彩色转换为灰度图像。
// 如果进行此调整之前没有指定一个CDibObject对象指针,则必须在// 调整时加以指定。
//----------------------------------------------------------------------//参数说明:BYTE mGrayType 0:Y=0.3R+0.59G+0.11B// 1: Y=R// 2: Y=G// 3: Y=B// CDibObject *pDibObject, 默认为NULL。
//----------------------------------------------------------------------//返回:成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------////////////////////////////////////////////////////////////////////////BOOL CPointPro::MakeGray256(BYTE mGrayType,CDibObject *pDibObject ){//CDibObject对象指针if( pDibObject != NULL ) m_pDibObject = pDibObject;//若未指定CDibObject 对象指针返回FALSEif( m_pDibObject == NULL ) return( FALSE );//低于8位的图像不进行处理if( m_pDibObject->GetNumBits() < 8 ) return( FALSE );//获取原图像字节宽度和转换后的8位256色灰度图像的字节宽度int nOldWidthBytes, nNewWidthBytes;char *pBuffer = (char *) m_pDibObject->GetDIBPointer( &nOldWidthBytes, 8, &nN ewWidthBytes );if( pBuffer == NULL ) return( FALSE );//定义变量BITMAPINFOHEADER *pOldBIH, *pNewBIH;BITMAPFILEHEADER *pOldBFH, *pNewBFH;RGBQUAD *pOldRGBPalette, *pNewRGBPalette;unsigned char *pOldBits, *pNewBits, *pTemp, *pNewTemp;int nNumColors, nNumNewColors;//获取文件头指针pOldBFH = (BI TMAPFILEHEADER *) pBuffer;//获取信息头指针pOldBIH = (BI TMAPINFOHEADER *) &pBuffer[sizeof(BI TMAPFILEHEADER)];//获取调色板指针pOldRGBPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];//原图像颜色数nNumColors = m_pDibObject->GetNumColors();//新图像颜色数nNumNewColors = 256;//获取原图像数据指针pOldBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];//为新图像分配内存HGLOBAL hGlobal;//新图像总字节数DWORD dwSize;dwSize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) + 256 * sizeof( RGBQUAD ) +m_pDibObject->GetHeight() * nNewWidthBytes;hGlobal = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize );if( hGlobal == NULL ){::GlobalUnlock( m_pDibObject->GetDib() );return( FALSE );}pBuffer = (char *) ::GlobalLock( hGlobal );if( pBuffer == NULL ){::GlobalFree( hGlobal );::GlobalUnlock( m_pDibObject->GetDib() );return( FALSE );}//获得新图像的文件头指针pNewBFH = (BI TMAPFILEHEADER *) pBuffer;//获得新图像的信息头指针pNewBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];//获得新图像的调色板指针pNewRGBPalette = (RGBQUAD *) &pBuffer[sizeof(BI TMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];//复制原图像文件头数据到新图像文件头*pNewBFH = *pOldBFH;//复制原图像信息头数据到新图像信息头*pNewBIH = *pOldBIH;//循环变量定义int i, j = 256, x, y;pNewBIH->biBitCount = 8;pNewBIH->biSizeImage = nNewWidthBytes * m_pDibObject->GetHeight(); pNewBIH->biClrUsed = 256;pNewBFH->bfSize = sizeof( BITMAPFILEHEADER ) +sizeof( BITMAPINFOHEADER ) +256 * sizeof( RGBQUAD ) +pNewBIH->biSizeImage;pNewBFH->bfOffBits = sizeof( BI TMAPFILEHEADER ) +sizeof( BITMAPINFOHEADER ) +nNumNewColors * sizeof( RGBQUAD );pNewBits = (unsigned char *) &pBuffer[sizeof(BI TMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)];m_pDibObject->SetPaletteBytes( 256 * sizeof( RGBQUAD ));//创建256色灰度调色板for( i = 0; i < j; i++ ){pNewRGBPalette[i].rgbRed = i;pNewRGBPalette[i].rgbGreen = i;pNewRGBPalette[i].rgbBlue = i;}unsigned char *pLookup; //调色板查找表DWORD dwGray; //灰度级别switch( m_pDibObject->GetNumBits() ){case 8: //256色图像pLookup = new unsigned char [256];if( pLookup == NULL ) break;memset( pLookup, 0, 256 ); //调色板查找表清0(256项)switch( mGrayType){case 0: //按亮度Y=0.3R+0.59G+0.11B将彩色图像转换为灰度图像for( i=0; i<256; i++ ){dwGray = ( (DWORD) pOldRGBPalette[i].rgbRed * 30 + (DWORD) pOldRGBPalette[i].rgbGreen * 59 +(DWORD) pOldRGBPalette[i].rgbBlue * 11 ) / 100;pLookup[i] = (unsigned char) dwGray;}break;case 1: //按亮度Y=R将彩色图像转换为灰度图像for( i=0; i<256; i++ ){dwGray = (DWORD) pOldRGBPalette[i].rgbR ed;pLookup[i] = (unsigned char) dwGray;}break;case 2: //按亮度Y=G将彩色图像转换为灰度图像for( i=0; i<256; i++ ){dwGray = (DWORD) pOldRGBPalette[i].rgbGreen;pLookup[i] = (unsigned char) dwGray;}break;case 3: //按亮度Y=B将彩色图像转换为灰度图像for( i=0; i<256; i++ ){dwGray =(DWORD) pOldRGBPalette[i].rgbBlue;pLookup[i] = (unsigned char) dwGray;}break;}for( y = 0; y < pOldBIH->biHeight; y++ ){pTemp = pOldBits; //位图数据起始指针pTemp += y * nOldWidthBytes; //位图数据下一行起始指针//转换成灰度索引for( x = 0; x < pOldBIH->biWidth; x++ ) pTemp[x] = pLookup[pTemp[x]]; }delete [] pLookup; //释放pLookup查找表所占内存memcpy( pNewBits, pOldBits, nNewWidthBytes * m_pDibObject->GetHeight());break;case 16: //16位色真彩色图像unsigned char ucRed, ucGreen, ucBlue;for( y=0; y<pOldBIH->biHeight; y++ ){//位图数据起始指针pTemp = pOldBits;pNewTemp = pNewBits;//位图数据下一行起始指针pTemp += y * nOldWidthBytes;pNewTemp += y * nNewWidthBytes;switch( mGrayType ){case 0:for( x=0; x<pOldBIH->biWidth; x++ ){GETRGB555( ucRed, ucGreen, ucBlue, &pTemp[x*2] );//按亮度Y=0.3R+0.59G+0.11B将彩色图像转换为灰度图像dwGray = (ucR ed * 30 + ucGreen * 59 +ucBlue * 11) / 100; //给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 1:for( x=0; x<pOldBIH->biWidth; x++ ){GETRGB555( ucRed, ucGreen, ucBlue, &pTemp[x*2] );//按亮度Y=R将彩色图像转换为灰度图像dwGray = (ucR ed * 30 + ucGreen * 59 +ucBlue * 11) / 100; //给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 2:for( x=0; x<pOldBIH->biWidth; x++ ){GETRGB555( ucRed, ucGreen, ucBlue, &pTemp[x*2] );//按亮度Y=G将彩色图像转换为灰度图像dwGray = (ucR ed * 30 + ucGreen * 59 +ucBlue * 11) / 100; //给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 3:for( x=0; x<pOldBIH->biWidth; x++ ){GETRGB555( ucRed, ucGreen, ucBlue, &pTemp[x*2] );//按亮度Y=B将彩色图像转换为灰度图像dwGray = (ucR ed * 30 + ucGreen * 59 +ucBlue * 11) / 100; //给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;}}break;case 24: //24位真彩色图像for( y=0; y<pOldBIH->biHeight; y++ ){//位图数据起始指针pTemp = pOldBits;pNewTemp = pNewBits;//位图数据下一行起始指针pTemp += y * nOldWidthBytes;pNewTemp += y * nNewWidthBytes;switch( mGrayType ){case 0: //按亮度Y=0.3R+0.59G+0.11B将彩色图像转换为灰度图像for( x=0; x<pOldBIH->biWidth; x++ ){dwGray = ( (DWORD) pTemp[x*3+2] * 30 //红色+(DWORD) pTemp[x*3+1] * 59 //绿色+(DWORD) pTemp[x*3] * 11 //兰色) / 100;//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 1: //按亮度Y=R将彩色图像转换为灰度图像for( x=0; x<pOldBIH->biWidth; x++ ){dwGray = (DWORD) pTemp[x*3+2]; //红色//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 2: //按亮度Y=G将彩色图像转换为灰度图像for( x=0; x<pOldBIH->biWidth; x++ ){dwGray = (DWORD) pTemp[x*3+1] ; //绿色//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 3: //按亮度Y=B将彩色图像转换为灰度图像for( x=0; x<pOldBIH->biWidth; x++ ){dwGray =(DWORD) pTemp[x*3]; //兰色//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;}}break;case 32: //32位真彩色图像for( y=0; y<pOldBIH->biHeight; y++ ){//位图数据起始指针pTemp = pOldBits;pNewTemp = pNewBits;//位图数据下一行起始指针pTemp += y * nOldWidthBytes;pNewTemp += y * nNewWidthBytes;switch( mGrayType ){case 0:for( x=0; x<pOldBIH->biWidth; x++ ){//按亮度Y=0.3R+0.59G+0.11B将彩色图像转换为灰度图像dwGray = ( (DWORD) pTemp[x*4] * 30 //红色+(DWORD) pTemp[x*4+1] * 59 //绿色+(DWORD) pTemp[x*4+2] * 11 //兰色) / 100;//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 1:for( x=0; x<pOldBIH->biWidth; x++ ){//按亮度Y=R将彩色图像转换为灰度图像dwGray = (DWORD) pTemp[x*4];//红色//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 2:for( x=0; x<pOldBIH->biWidth; x++ ){//按亮度Y=G将彩色图像转换为灰度图像dwGray = (DWORD) pTemp[x*4+1] ; //绿色//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 3:for( x=0; x<pOldBIH->biWidth; x++ ){//按亮度Y=B将彩色图像转换为灰度图像dwGray =(DWORD) pTemp[x*4+2] ; //兰色//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;}}break;}::GlobalUnlock( m_pDibObject->GetDib() );::GlobalFree( m_pDibObject->GetDib() );::GlobalUnlock( hGlobal );m_pDibObject->SetDib( hGlobal );m_pDibObject->ProcessImageHeader();m_pDibObject->m_nLastError = IMAGELIB_SUCCESS; return( TRUE );}。
完整24位真彩色位图灰度化源代码

完整24位真彩色位图灰度化源代码#include <windows.h>BOOL BMP24to8(char *szSourceFile,char *szTargetFile);int main(int argc,char* argv[]){BOOL stat=BMP24to8("c:\\source.bmp","c:\\target.bmp");//调用这个函数直接把24位真彩色灰度化return 0;}BOOL BMP24to8(char *szSourceFile,char *szTargetFile){HANDLEhSourceFile=INVALID_HANDLE_VALUE,hTargetFile=INVALID_HA NDLE_VALUE;DWORD dwSourceSize=0,dwTargetSize=0;PBYTE pSource=NULL,pTarget=NULL;hSourceFile=CreateFile(szSourceFile,GENERIC_READ,FILE_SH ARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NU LL);if(hSourceFile==INVALID_HANDLE_VALUE)return FALSE;dwSourceSize=GetFileSize(hSourceFile,NULL);pSource=(PBYTE)VirtualAlloc(NULL,dwSourceSize,MEM_CO MMIT,PAGE_READWRITE);if(pSource==NULL||dwSourceSize<=54)//分配空间失败或者文件太小(BMP文件不可能小于54个字节){CloseHandle(hSourceFile);return FALSE;}DWORD dwTemp=0;ReadFile(hSourceFile,pSource,dwSourceSize,&dwTemp,NUL L);BITMAPFILEHEADER*pSourceFileHeader=(BITMAPFILEHEADER*)pSource;BITMAPINFOHEADER*pSourceInfoHeader=(BITMAPINFOHEADER*)(pSource+sizeof(B ITMAPFILEHEADER));if(pSourceFileHeader->bfType!=0x4d42||pSourceInfoHeader ->biBitCount!=24)//不是BMP文件或者不是24位真彩色{CloseHandle(hSourceFile);VirtualFree(pSource,NULL,MEM_RELEASE);return FALSE;}CloseHandle(hSourceFile);LONG nWidth=pSourceInfoHeader->biWidth;LONG nHeight=pSourceInfoHeader->biHeight;LONG nSourceWidth=nWidth*3;if(nSourceWidth%4) nSourceWidth=(nSourceWidth/4+1)*4;LONG nTargetWidth=nWidth;if(nTargetWidth%4) nTargetWidth=(nT argetWidth/4+1)*4;dwTargetSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPI NFOHEADER)+sizeof(RGBQUAD)*256+nHeight*nTargetWidth;pTarget=(PBYTE)VirtualAlloc(NULL,dwTargetSize,MEM_COM MIT,PAGE_READWRITE);memset(pTarget,0,dwTargetSize);if(pTarget==NULL){VirtualFree(pTarget,NULL,MEM_RELEASE);return FALSE;}BITMAPFILEHEADER*pTargetFileHeader=(BITMAPFILEHEADER *)pTarget;BITMAPINFOHEADER*pTargetInfoHeader=(BITMAPINFOHEADER*)(pTarget+sizeof(BITMAPFILEHEADER));pTargetFileHeader->bfType=pSourceFileHeader->bfType;pTargetFileHeader->bfSize=dwTargetSize;pTargetFileHeader->bfReserved1=0;pTargetFileHeader->bfReserved2=0;pTargetFileHeader->bfOffBits=sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;pTargetInfoHeader->biBitCount=8;pTargetInfoHeader->biClrImportant=0;pTargetInfoHeader->biClrUsed=256;pTargetInfoHeader->biCompression=BI_RGB;pTargetInfoHeader->biHeight=pSourceInfoHeader->biHeig ht;pTargetInfoHeader->biPlanes=1;pTargetInfoHeader->biSize=sizeof(BITMAPINFOHEADER);pTargetInfoHeader->biSizeImage=nHeight*nTargetWidth;pTargetInfoHeader->biWidth=pSourceInfoHeader->biWidt h;pTargetInfoHeader->biXPelsPerMeter=pSourceInfoHeader->biXPelsPerMeter;pTargetInfoHeader->biYPelsPerMeter=pSourceInfoHeader->biYPelsPerMeter;RGBQUAD *pRgb;for(int i=0;i<256;i++)//初始化8位灰度图的调色板信息{pRgb=(RGBQUAD*)(pTarget+sizeof(BITMAPFILEHEADER)+si zeof(BITMAPINFOHEADER)+i*sizeof(RGBQUAD));pRgb->rgbBlue=i;pRgb->rgbGreen=i;pRgb->rgbRed=i;pRg b->rgbReserved=0;}for (int m=0;m<nHeight;m++)//转化真彩色图为灰度图{for(int n=0;n<nWidth;n++){pTarget[pTargetFileHeader->bfOffBits+m*nTargetWidth+n] =pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3 ]*0.114+pSource[pSourceFileHeader->bfOffBits+m*nSourceWid th+n*3+1]*0.587+pSource[pSourceFileHeader->bfOffBits+m*nS ourceWidth+n*3+2]*0.299;}}hTargetFile=CreateFile(szTargetFile,GENERIC_WRITE,FILE_SH ARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,N ULL);BOOLstat=WriteFile(hTargetFile,pTarget,dwTargetSize,&dwTemp,NULL );CloseHandle(hTargetFile);VirtualFree(pSource,NULL,MEM_RELEASE);VirtualFree(pTarget,NULL,MEM_RELEASE);return stat;}转化效果如下图。
何东健数字图像处理课后答案

何东健数字图像处理课后答案【篇一:数字图像处理课后参考答案】>1.1解释术语(2)数字图像:为了便于用计算机对图像进行处理,通过将二维连续(模拟)图像在空间上离散化,也即采样,并同时将二维连续图像的幅值等间隔的划分成多个等级(层次)也即均匀量化,以此来用二维数字阵列并表示其中各个像素的空间位置和每个像素的灰度级数的图像形式称为数字图像。
(3)图像处理:是指对图像信息进行加工以满足人的视觉或应用需求的行为。
1.7 包括图像变化、图像增强、图像恢复、图像压缩编码、图像的特征提取、形态学图像处理方法等。
彩色图像、多光谱图像和高光谱图像的处理技术沿用了前述的基本图像处理技术,也发展除了一些特有的图像处理技术和方法。
1.8基本思路是,或简单地突出图像中感兴趣的特征,或想方法显现图像中那些模糊了的细节,以使图像更清晰地被显示或更适合于人或及其的处理与分析。
1.9基本思路是,从图像退化的数学或概率模型出发,研究改进图像的外观,从而使恢复以后的图像尽可能地反映原始图像的本来面目,从而获得与景物真实面貌相像的图像。
1.10基本思路是,,在不损失图像质量或少损失图像质量的前提下,尽可能的减少图像的存储量,以满足图像存储和实时传输的应用需求。
1.11基本思路是,通过数学方法和图像变换算法对图像的某种变换,以便简化图像进一步处理过程,或在进一步的图像处理中获得更好的处理效果。
1.12基本目的是,找出便于区分和描述一幅图像中背景和目标的方法,以方便图像中感兴趣的目标的提取和描述。
第二章2.1解释下列术语(18)空间分辨率:定义为单位距离内可分辨的最少黑白线对的数目,用于表示图像中可分辨的最小细节,主要取决于采样间隔值的大小。
(19)灰度分辨率:是指在灰度级别中可分辨的最小变化,通常把灰度级数l称为图像的灰度级分辨率。
(20)像素的4邻域:对于图像中位于(x,y)的像素p来说,与其水平相邻和垂直相邻的4个像素称为该像素的4邻域像素,他们的坐标分别为(x-1,y)(x,y-1)(x,y+1)(x+1,y)。
使用“计算”命令将彩色图像转换为黑白图像

使用“计算”命令将彩色图像转换为黑白图像2008年06月24日 17:50使用“计算”命令的方法十分灵活的,没有任何一种固定的模式和确定的数据,不同的混合通道与混合模式,会有不同的图像效果,这些不确定因素及数据完全是由你自己的感觉和经验来作最后决定,这是它最大特点和魅力之处。
但计算最大的难点也是在这里,搞好了会令你喜出望外,爱不释手,搞坏了会使你对计算法困惑不已.甚至望而生畏。
单从混合通道这一简单的功能来讲,它的布局实在是太复杂了,不过这正是这个对话框的特色。
掌握了这一技术之后,你就可以凭借它来提高自己的声望了。
举例来讲,如果你正在谈论从彩色到灰度的转换,只要不经意地露出一句:我不用通道混合器,我用计算的方法进行转换。
其他人肯定会向你投来敬佩的眼光。
”计算法是彩色图像转换为转换为黑白图像的一种高级方法,这种方法赋予你更多的选择权和调整的空间,可求得极佳的效果,但这种方法更需要你对彩色到黑白的色度认识和经验的积累,掌握了这种技巧并运用熟练后,你一定会把彩色图像转换为效果极佳的黑白图像。
用计算法将彩色转换到转白的原理:在RGB红、绿、蓝三个通道中,由你选择两个相对效果最好的通道进行混合,创建一个全新的(无穷多种且丰富多样的)通道,这一通道的确定完全有由你自己决定,根据人像、风光、静物等和你主观的不同感受选择不同的通道。
也可根据你所希望的图像的反差、高光和暗调等选择通道。
我们还可用Photoshop的标准混合模式(正片叠底使它们的混合变暗,滤镜使它们的混合变亮,等等)混合这些通道。
在通过不透明度确定混合量。
其结果是创建新的通道(Alpha1)。
一、观察通道,确定你认为画面效果最好的通道观察红色通道,红色通道整体亮度适中,且有较丰富的细节,包括较好的阴影细节,云彩的层次也较丰富,我们可确定红通道。
观察绿色通道,绿色通道整体亮度比红通道亮,且也有较丰富的细节,即高光亮最适宜,云彩的层次不如红通道丰富,对比度不如红通道强烈,似乎损失了一些细节。
VB编程-真彩色转为灰度图像源码要点

VB编程真彩色转为灰度图像源码'以下代码请贴在一个新建的Cimage类中Option ExplicitPrivate Type BITMAPFILEHEADERbfType As IntegerbfSize As LongbfReserved1 As IntegerbfReserved2 As IntegerbfOffBits As LongEnd TypePrivate Type BITMAPINFOHEADERbiSize As LongbiWidth As LongbiHeight As LongbiPlanes As IntegerbiBitCount As IntegerbiCompression As LongbiSizeImage As LongbiXPelsPerMeter As LongbiYPelsPerMeter As LongbiClrUsed As LongbiClrImportant As Long End TypePrivate Type bitmapbmType As LongbmWidth As LongbmHeight As LongbmWidthBytes As LongbmPlanes As IntegerbmBitsPixel As IntegerBmBits As Long End TypePrivate Type RGBQUADBlue As ByteGreen As ByteRed As ByteReserved As ByteEnd TypePrivate Type BITMAPINFObmiHeader As BITMAPINFOHEADERbmiColors As RGBQUADEnd TypePrivate Const BI_bitfields = 3& '带掩码的Private Const BI_RGB = 0 '正常Private Const DIB_RGB_COLORS = 0 '真彩色Private Const OBJ_BITMAP = 7 '位图对象Private Const SRCCOPY = &HCC0020 '直接拷贝Private Const IMAGE_BITMAP = 0 'LoadImage函数的载入类型,位图Private Const LR_LOADFROMFILE = &H10 '从文件载入Private Const LR_CREATEDIBSECTION = &H2000 '如果指定了IMAGE_BITMAP,就返回DIBSection的句柄,而不是位图的句柄Private Const STRETCH_ANDSCANS = 1 '默认设置。
彩色到灰度转换代码

彩色到灰度转换代码
彩色到灰度转换是数字图像处理中常用的一种操作。
它将彩色图像中的每个像素点的RGB值转换为一种灰度值,使得图像呈现出黑白灰色调。
以下是一段 Matlab 代码,用于实现彩色到灰度的转换: ```matlab
% 读入彩色图像
color_img = imread('colorimage.jpg');
% 将彩色图像转换为灰度图像
gray_img = rgb2gray(color_img);
% 显示彩色图像和灰度图像
subplot(1,2,1);
imshow(color_img);
title('Color Image');
subplot(1,2,2);
imshow(gray_img);
title('Gray Image');
```
以上代码中,`imread` 函数用于读入彩色图像,`rgb2gray` 函数用于将彩色图像转换为灰度图像。
最后,使用 `imshow` 函数分别显示彩色图像和灰度图像。
使用 `subplot` 函数可以将两个图像显示在同一个窗口中,方便比较。
- 1 -。
彩色图转灰度图的原理和参考源码

彩色图转灰度图的原理和参考源码图像处理中,大部分的处理方法都需要事先把彩色图转换成灰度图才能进行相关的计算、识别。
彩色图转换灰度图的原理如下:我们知道彩色位图是由R/G/B三个分量组成,其文件存储格式为BITMAPFILEHEADER+BITMAPINFOHEADER,紧跟后面的可能是:如果是24位真彩图,则每个点是由三个字节分别表示R/G/B,所以这里直接跟着图像的色彩信息;如果是8位(256色),4位(16色),1位(单色)图,则紧跟后面的是调色板数据,一个RGBQUAD类型的数组,其长度由BITMAPINFOHEADER.biClrUsed来决定。
然后后面紧跟的才是图像数据(24位图是真实的图像数据,其他的则是调色板的索引数据)。
灰度图是指只含亮度信息,不含色彩信息的图象,就象我们平时看到的黑白照片:亮度由暗到明,变化是连续的。
因此,要表示灰度图,就需要把亮度值进行量化。
通常划分成0到255共256个级别,其中0最暗(全黑),255最亮(全白)。
在表示颜色的方法中,除了RGB 外,还有一种叫YUV的表示方法,应用也很多。
电视信号中用的就是一种类似于YUV的颜色表示方法。
在这种表示方法中,Y分量的物理含义就是亮度,Y分量包含了灰度图的所有信息,只用Y分量就能完全能够表示出一幅灰度图来。
从 RGB 到 YUV 空间的 Y 转换公式为:Y = 0.299R+0.587G+0.114B在 WINDOWS 中,表示 16 位以上的图和以下的图有点不同; 16 位以下的图使用一个调色板来表示选择具体的颜色,调色板的每个单元是4 个字节,其中一个透明度;而具体的像素值存储的是索引,分别是 1 、 2 、 4 、 8 位。
16 位以上的图直接使用像素表示颜色。
那么如何将彩色图转换为灰度图呢?灰度图中有调色板,首先需要确定调色板的具体颜色取值。
我们前面提到了,灰度图的三个分量相等。
当转换为 8 位的时候,调色板中有 256 个颜色,每个正好从 0 到255 个,三个分量都相等。
VC编程实现灰度图像与彩色图像的相互转换要点

VC编程实现灰度图像与彩色图像的相互转换PhotoShop的图像处理功能很强,其中有一个功能是将灰度图像转换为彩色图像,数字图像处理中,也经常要遇到灰度图像与彩色图像相互转换的问题,如何自己解决这个问题,值得大家探讨,现将我解决这类问题的方法陈述如下:工程应用中经常要遇到需要把彩色图像到灰度图像的变换的问题,采集卡过来的图像为彩色图像,为加快处理速度,要把彩色图像转换为黑白图象,这个问题比较好解决,一般情况下彩色图像每个像素用三个字节表示,每个字节对应着R、G、B分量的亮度(红、绿、蓝),转换后的黑白图像的一个像素用一个字节表示该点的灰度值,它的值在0~255之间,数值越大,该点越白,既越亮,越小则越黑。
转换公式为Gray(i,j)=0.11*R(i,j)+0.59*G(i,j)+0.3*B(i,j),其中Gray(i,j)为转换后的黑白图像在(i,j)点处的灰度值,我们可以观察该式,其中绿色所占的比重最大,所以转换时可以直接使用G值作为转换后的灰度。
至于灰度图像转换为彩色图像,技术上称为灰度图像的伪彩色处理,这是一种视觉效果明显而技术又不是很复杂的图像增强技术。
灰度图像中,如果相邻像素点的灰度相差不大,但包含了丰富的信息的话,人眼则无法从图像中提取相应的信息,因为人眼分辨灰度的能力很差,一般只有几十个数量级,但是人眼对彩色信号的分辨率却很强,这样将黑白图像转换为彩色图像人眼可以提取更多的信息量。
在转换过程中,经常采用的技术是灰度级-彩色变换,意思就是对黑白图像上的每一个像素点,取得该点的灰度值并送入三个通道经过实施不同的变换,产生相应的R、G、B的亮度值,即所求彩色图像对应像素点的彩色值,具体变换公式很多,我采用的是最常用的一种,变换曲线图如下:上图中,三个图分别代表了三个变换通道,R、G、B指的是变换后对应点的R、G、B分量值,L指的是各个分量的最大值为255,G(x,y)为相应点的灰度值。
24位bmp彩色图转换为24位灰度图的方法

24位bmp彩色图转换为24位灰度图的方法一、所用到的流处理函数:fstream:可同时进行读写操作的文件类;或ofstream:写操作(从内存中读数据到文件)的文件类;ifstream:读操作(从文件读数据到内存)的文件类。
二、位图文件的格式:①位图文件头,所用结构体:BITMAPFILEHEADER,占14个字节②位图信息头,所用结构体:BITMAPINFOHEADER,占40个字节③颜色表项,所用结构体:RGBQUAD,由biBitCount值决定④数据区,当结构体BITMAPINFOHEADER中的成员变量biBitCount = 1时,1个字节代表8个像素;biBitCount = 2时,1个字节代表2个像素;biBitCount = 8时,1个字节代表1个像素;biBitCount = 16时,2个字节代表1个像素;biBitCount = 24时,3个字节代表1个像素;RGBQUAD结构体的定义如下:typedef struct tagRGBQUAD {BYTE rgbBlue; // 蓝色分量BYTE rgbGreen; // 绿色分量BYTE rgbRed; // 红色分量BYTE rgbReserved; // 保留值,必须为0.} RGBQUAD;即一个RGBQUAD结构体占4个字节,当biBitCount = 1,2,4,8时,颜色表项分别占2,4,16,256个RGBQUAD 结构体大小的空间;当biBitCount = 24时,③颜色表项不占空间,即位图文件只有①②④三项,这是因为数据区中3个字节代表一个像素,本身含有三原色分量值。
三、需要注意的问题:1. bmp数据存储时按行从左到右、按列从下到上扫描,所以对于24位bmp 文件,数据区前三个字节代表位图左下角第一个元素;2. bmp文件存储的图片数据每行所占的字节数都是4的整数倍,不够的用0补充,所以有biSizeImage = ((((bi.Width*bitBitCount)+31)&~31)/8)*bi.biHeight3. 对于24位bmp文件,若图片每行像素所占字节数满足是4的整数倍这个条件,由于BITMAPFILEHEADER和BITMAPINFOHEADER所占的总字节数为54,不是4的倍数,所以补0后为56字节。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
何东健主编《数字图像处理》程序//////////////////////////////////////////////////////////////////////////BOOL MakeGray256(BYTE mGrayType, CDibObject *pDibObject)//----------------------------------------------------------------------//基本功能:本函数将传入的CDibObject对象中的图像从彩色转换为灰度图像。
// 如果进行此调整之前没有指定一个CDibObject对象指针,则必须在// 调整时加以指定。
//----------------------------------------------------------------------//参数说明:BYTE mGrayType 0:Y=0.3R+0.59G+0.11B// 1: Y=R// 2: Y=G// 3: Y=B// CDibObject *pDibObject, 默认为NULL。
//----------------------------------------------------------------------//返回:成功返回TRUE,失败返回FALSE。
//----------------------------------------------------------------------////////////////////////////////////////////////////////////////////////BOOL CPointPro::MakeGray256(BYTE mGrayType,CDibObject *pDibObject ){//CDibObject对象指针if( pDibObject != NULL ) m_pDibObject = pDibObject;//若未指定CDibObject 对象指针返回FALSEif( m_pDibObject == NULL ) return( FALSE );//低于8位的图像不进行处理if( m_pDibObject->GetNumBits() < 8 ) return( FALSE );//获取原图像字节宽度和转换后的8位256色灰度图像的字节宽度int nOldWidthBytes, nNewWidthBytes;char *pBuffer = (char *) m_pDibObject->GetDIBPointer( &nOldWidthBytes, 8, &nN ewWidthBytes );if( pBuffer == NULL ) return( FALSE );//定义变量BITMAPINFOHEADER *pOldBIH, *pNewBIH;BITMAPFILEHEADER *pOldBFH, *pNewBFH;RGBQUAD *pOldRGBPalette, *pNewRGBPalette;unsigned char *pOldBits, *pNewBits, *pTemp, *pNewTemp;int nNumColors, nNumNewColors;//获取文件头指针pOldBFH = (BI TMAPFILEHEADER *) pBuffer;//获取信息头指针pOldBIH = (BI TMAPINFOHEADER *) &pBuffer[sizeof(BI TMAPFILEHEADER)];//获取调色板指针pOldRGBPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];//原图像颜色数nNumColors = m_pDibObject->GetNumColors();//新图像颜色数nNumNewColors = 256;//获取原图像数据指针pOldBits = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];//为新图像分配内存HGLOBAL hGlobal;//新图像总字节数DWORD dwSize;dwSize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) + 256 * sizeof( RGBQUAD ) +m_pDibObject->GetHeight() * nNewWidthBytes;hGlobal = ::GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, dwSize );if( hGlobal == NULL ){::GlobalUnlock( m_pDibObject->GetDib() );return( FALSE );}pBuffer = (char *) ::GlobalLock( hGlobal );if( pBuffer == NULL ){::GlobalFree( hGlobal );::GlobalUnlock( m_pDibObject->GetDib() );return( FALSE );}//获得新图像的文件头指针pNewBFH = (BI TMAPFILEHEADER *) pBuffer;//获得新图像的信息头指针pNewBIH = (BITMAPINFOHEADER *) &pBuffer[sizeof(BITMAPFILEHEADER)];//获得新图像的调色板指针pNewRGBPalette = (RGBQUAD *) &pBuffer[sizeof(BI TMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];//复制原图像文件头数据到新图像文件头*pNewBFH = *pOldBFH;//复制原图像信息头数据到新图像信息头*pNewBIH = *pOldBIH;//循环变量定义int i, j = 256, x, y;pNewBIH->biBitCount = 8;pNewBIH->biSizeImage = nNewWidthBytes * m_pDibObject->GetHeight(); pNewBIH->biClrUsed = 256;pNewBFH->bfSize = sizeof( BITMAPFILEHEADER ) +sizeof( BITMAPINFOHEADER ) +256 * sizeof( RGBQUAD ) +pNewBIH->biSizeImage;pNewBFH->bfOffBits = sizeof( BI TMAPFILEHEADER ) +sizeof( BITMAPINFOHEADER ) +nNumNewColors * sizeof( RGBQUAD );pNewBits = (unsigned char *) &pBuffer[sizeof(BI TMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)];m_pDibObject->SetPaletteBytes( 256 * sizeof( RGBQUAD ));//创建256色灰度调色板for( i = 0; i < j; i++ ){pNewRGBPalette[i].rgbRed = i;pNewRGBPalette[i].rgbGreen = i;pNewRGBPalette[i].rgbBlue = i;}unsigned char *pLookup; //调色板查找表DWORD dwGray; //灰度级别switch( m_pDibObject->GetNumBits() ){case 8: //256色图像pLookup = new unsigned char [256];if( pLookup == NULL ) break;memset( pLookup, 0, 256 ); //调色板查找表清0(256项)switch( mGrayType){case 0: //按亮度Y=0.3R+0.59G+0.11B将彩色图像转换为灰度图像for( i=0; i<256; i++ ){dwGray = ( (DWORD) pOldRGBPalette[i].rgbRed * 30 + (DWORD) pOldRGBPalette[i].rgbGreen * 59 +(DWORD) pOldRGBPalette[i].rgbBlue * 11 ) / 100;pLookup[i] = (unsigned char) dwGray;}break;case 1: //按亮度Y=R将彩色图像转换为灰度图像for( i=0; i<256; i++ ){dwGray = (DWORD) pOldRGBPalette[i].rgbR ed;pLookup[i] = (unsigned char) dwGray;}break;case 2: //按亮度Y=G将彩色图像转换为灰度图像for( i=0; i<256; i++ ){dwGray = (DWORD) pOldRGBPalette[i].rgbGreen;pLookup[i] = (unsigned char) dwGray;}break;case 3: //按亮度Y=B将彩色图像转换为灰度图像for( i=0; i<256; i++ ){dwGray =(DWORD) pOldRGBPalette[i].rgbBlue;pLookup[i] = (unsigned char) dwGray;}break;}for( y = 0; y < pOldBIH->biHeight; y++ ){pTemp = pOldBits; //位图数据起始指针pTemp += y * nOldWidthBytes; //位图数据下一行起始指针//转换成灰度索引for( x = 0; x < pOldBIH->biWidth; x++ ) pTemp[x] = pLookup[pTemp[x]]; }delete [] pLookup; //释放pLookup查找表所占内存memcpy( pNewBits, pOldBits, nNewWidthBytes * m_pDibObject->GetHeight());break;case 16: //16位色真彩色图像unsigned char ucRed, ucGreen, ucBlue;for( y=0; y<pOldBIH->biHeight; y++ ){//位图数据起始指针pTemp = pOldBits;pNewTemp = pNewBits;//位图数据下一行起始指针pTemp += y * nOldWidthBytes;pNewTemp += y * nNewWidthBytes;switch( mGrayType ){case 0:for( x=0; x<pOldBIH->biWidth; x++ ){GETRGB555( ucRed, ucGreen, ucBlue, &pTemp[x*2] );//按亮度Y=0.3R+0.59G+0.11B将彩色图像转换为灰度图像dwGray = (ucR ed * 30 + ucGreen * 59 +ucBlue * 11) / 100; //给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 1:for( x=0; x<pOldBIH->biWidth; x++ ){GETRGB555( ucRed, ucGreen, ucBlue, &pTemp[x*2] );//按亮度Y=R将彩色图像转换为灰度图像dwGray = (ucR ed * 30 + ucGreen * 59 +ucBlue * 11) / 100; //给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 2:for( x=0; x<pOldBIH->biWidth; x++ ){GETRGB555( ucRed, ucGreen, ucBlue, &pTemp[x*2] );//按亮度Y=G将彩色图像转换为灰度图像dwGray = (ucR ed * 30 + ucGreen * 59 +ucBlue * 11) / 100; //给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 3:for( x=0; x<pOldBIH->biWidth; x++ ){GETRGB555( ucRed, ucGreen, ucBlue, &pTemp[x*2] );//按亮度Y=B将彩色图像转换为灰度图像dwGray = (ucR ed * 30 + ucGreen * 59 +ucBlue * 11) / 100; //给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;}}break;case 24: //24位真彩色图像for( y=0; y<pOldBIH->biHeight; y++ ){//位图数据起始指针pTemp = pOldBits;pNewTemp = pNewBits;//位图数据下一行起始指针pTemp += y * nOldWidthBytes;pNewTemp += y * nNewWidthBytes;switch( mGrayType ){case 0: //按亮度Y=0.3R+0.59G+0.11B将彩色图像转换为灰度图像for( x=0; x<pOldBIH->biWidth; x++ ){dwGray = ( (DWORD) pTemp[x*3+2] * 30 //红色+(DWORD) pTemp[x*3+1] * 59 //绿色+(DWORD) pTemp[x*3] * 11 //兰色) / 100;//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 1: //按亮度Y=R将彩色图像转换为灰度图像for( x=0; x<pOldBIH->biWidth; x++ ){dwGray = (DWORD) pTemp[x*3+2]; //红色//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 2: //按亮度Y=G将彩色图像转换为灰度图像for( x=0; x<pOldBIH->biWidth; x++ ){dwGray = (DWORD) pTemp[x*3+1] ; //绿色//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 3: //按亮度Y=B将彩色图像转换为灰度图像for( x=0; x<pOldBIH->biWidth; x++ ){dwGray =(DWORD) pTemp[x*3]; //兰色//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;}}break;case 32: //32位真彩色图像for( y=0; y<pOldBIH->biHeight; y++ ){//位图数据起始指针pTemp = pOldBits;pNewTemp = pNewBits;//位图数据下一行起始指针pTemp += y * nOldWidthBytes;pNewTemp += y * nNewWidthBytes;switch( mGrayType ){case 0:for( x=0; x<pOldBIH->biWidth; x++ ){//按亮度Y=0.3R+0.59G+0.11B将彩色图像转换为灰度图像dwGray = ( (DWORD) pTemp[x*4] * 30 //红色+(DWORD) pTemp[x*4+1] * 59 //绿色+(DWORD) pTemp[x*4+2] * 11 //兰色) / 100;//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 1:for( x=0; x<pOldBIH->biWidth; x++ ){//按亮度Y=R将彩色图像转换为灰度图像dwGray = (DWORD) pTemp[x*4];//红色//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 2:for( x=0; x<pOldBIH->biWidth; x++ ){//按亮度Y=G将彩色图像转换为灰度图像dwGray = (DWORD) pTemp[x*4+1] ; //绿色//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;case 3:for( x=0; x<pOldBIH->biWidth; x++ ){//按亮度Y=B将彩色图像转换为灰度图像dwGray =(DWORD) pTemp[x*4+2] ; //兰色//给新图像数据赋值pNewTemp[x] = (unsigned char)dwGray;}break;}}break;}::GlobalUnlock( m_pDibObject->GetDib() );::GlobalFree( m_pDibObject->GetDib() );::GlobalUnlock( hGlobal );m_pDibObject->SetDib( hGlobal );m_pDibObject->ProcessImageHeader();m_pDibObject->m_nLastError = IMAGELIB_SUCCESS; return( TRUE );}。