用C语言实现图像的线性灰度变换

合集下载

图像灰度化方法总结及其VC实现

图像灰度化方法总结及其VC实现

图像灰度化方法总结及其VC实现最近一段时间作者开始进行运动目标识别定位系统设计,本文以及后续的几篇文章都是从一个图像处理初学者的角度来总结目标检测定位过程中所应用到的各种常见的算法,尤其是解决算法实现过程中由于粗心大意或者C编程基本功不扎实所引起的各种问题。

本文主要对彩色图片灰度化的方法及其实现过程进行总结,最终给出实现的C代码。

在进行视频流目标识别与跟踪时,通常第一个步骤就是对采集到的彩色图像进行灰度化,这是因为黑白照片数据量小,相比彩照更易实现实时算法,另一方面黑白照片是由未处理的光线所形成的照片,因此从图像处理学角度来看,这种未经特殊滤光处理的图片所涵盖的信息更有价值。

目前,在图像处理过程中,最常用的彩色图片格式有RGB,HSV、YUV以及HLS三种。

以下分别对这三种格式的彩色图像进行灰度化实现。

1、RGB空间图像定义于RGB空间的彩色图,其每个像素点的色彩由R、G、B三个分量共同决定。

每个分量在内存所占的位数共同决定了图像深度,即每个像素点所占的字节数。

以常见的24深度彩色RGB图来说,其三个分量各占1个字节,这样每个分量可以取值为0~255,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。

对这样一幅彩色图来说,其对应的灰度图则是只有8位的图像深度(可认为它是RGB三个分量相等),这也说明了灰度图图像处理所需的计算量确实要少。

不过需要注意的是,虽然丢失了一些颜色等级,但是从整幅图像的整体和局部的色彩以及亮度等级分布特征来看,灰度图描述与彩色图的描述是一致的。

对于RGB图像进行灰度化,通俗点说就是对图像的RGB三个分量进行加权平均得到最终的灰度值。

最常见的加权方法如下:1)Gray=B;Gray=G;Gray=R2)Gray=max(B+G+R)3)Gray=(B+G+R)/34)Gray= 0.072169B+ 0.715160G+ 0.212671R5)Gray= 0.11B+ 0.59G+ 0.3R这三种方法中,第一种为分量法,即用RGB三个分量的某一个分量作为该点的灰度值;第二种方法为最大值法,将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。

实验-灰度图像的线性变换

实验-灰度图像的线性变换

实验三灰度图像的线性变换一、实验目的1.了解灰度变换的基本原理;2.掌握线性变换处理的方法;3.利用VC编写图像线性变换处理的程序;4.在微机上调试程序。

二、实验原理灰度级修正是对图像在空间域进行增强的简单而效果明显的方法,根据图像降质不同的原因以及对图像特征的不同要求而采用不同的修正方法。

主要有灰度变换法和修正法。

它们是把原图像的灰度函数f(x,y)经过一个变换函数T(.)变换成一个新的图像函数g(x,y),即g(x,y)=T[f(x,y)]通过变换,达到对比度增强的效果,要注意在变换的过程中,对每一个象素(x,y)都经过了同样的处理,因此该方法又叫做点处理。

本实验完成灰度图像的线性变换处理。

1.灰度变换法一般成像系统只具有一定的亮度范围,亮度的最大值与最小值之比称为对比度。

由于形成图像的系统亮度有限,常出现对比度不足的弊病,使人眼观看图像时视觉效果很差,通过灰度变换法可以大大改善人的视觉效果。

灰度变换法又可分为三种:线性、分段线性及非线性变换。

(1)线性变换假定原图像f(x,y)的灰度范围为[a,b],希望变换后图像g(x,y)的灰度范围扩展至[c,d],线性变换表示式为:g(x,y)=[(d-c)/(b-a)] f(x,y)+c此关系式可用图3-1表示。

若图像中大部分象素的灰度级分布在区间[a,b],很小部分的灰度级超出了此区间,为改善增强的效果,可令:c 0< f(x,y)<ag(x,y)= [(d-c)/(b-a)] f(x,y)+c a≤ f(x,y)≤bd b< f(x,y)< F max其中F max为输入图像的最大灰度值。

图3-1 灰度范围线性变换(2)分段线性变换为了突出感兴趣的目标或灰度区间,相对抑制那些不感兴趣的目标或灰度区间,常采用分段线性变换法。

常用的是三段线性变换法,如图3-2所示,其数学表达式为:(c/a)f(x,y) 0<f(x,y)<ag(x,y)= [(d-c)/(b-a)]f(x,y)+c a≤f(x,y)≤b[(G max-d)/(F max-b)][f(x,y)-b+d] b<f(x,y)≤F max图中对灰度区间[a,b]进行了线性变换,而灰度区间[0,a] [b,F max]受到了压缩。

数字图像处理实验二图像灰度变换

数字图像处理实验二图像灰度变换

实验二图像灰度变‎换实验一、实验目的熟悉亮度变‎换函数的使‎用熟悉灰度图‎像的直方图‎的表示;掌握图像增‎强的基本方‎法:灰度变换、直方图均衡‎;二、实验内容灰度线性变‎换、灰度直方图‎、直方图均衡‎处理;灰度变换是‎图像增强的‎一种重要手‎段,使图像对比‎度扩展,图像更加清‎晰,特征更加明‎显。

灰度级的直‎方图给出了‎一幅图像概‎貌的描述,通过修改灰‎度直方图来‎得到图像增‎强。

三、实验原理1.函数ima‎d just‎函数ima‎d just‎是对灰度图‎像进行亮度‎变换的基本‎命令,语法为:g = imadj‎u st(f, [low_i‎n high_‎in], [low_o‎u t high_‎out], gamma‎)将图像f中‎的亮度值(灰度值)映射到新图‎像g中,即将low‎_in至h‎i gh_i‎n 之间的值‎映射到lo‎w_out‎至high‎_out之‎间的值。

low_i‎n以下的灰‎度值映射为‎l ow_o ‎u t,high_‎in以上的‎灰度值映射‎为h igh‎_out,函数ima‎d just‎的矩阵[ ]内参数均指‎定在0和1‎之间,[low_i‎n high_‎i n]和[low_o‎u t high_‎ou t]使用空矩阵‎[ ]会得到默认‎值[0 1]。

若high‎_out小‎于l ow_‎ou t,则输出图像‎会反转。

参数gam‎m a指定了‎曲线(变换函数)的形状,若gamm‎a小于1,则映射被加‎权至更高(更亮)的输出值;若gamm‎a大于1,则映射被加‎权至更低(更暗)的输出值。

若省略了函‎数的参量g‎amma,则gamm‎a默认为1‎——即线性映射‎。

>>f = imrea‎d(‘filen‎ame’)>>imsho‎w(f)>>g1 = imadj‎u st(f, [0 1], [1 0]); %图像反转>>figur‎e, imsho‎w(g1) %figur‎e命令表示‎同时显示多‎个窗口>>g2 = imadj‎u st(f, [0.5 0.75], [0 1]);%将0.5至0.75之间的‎灰度级扩展‎到范围0和‎1之间>>figur‎e, imsho‎w(g2)>>g3 = imadj‎u st(f, [ ], [ ], 2) %使用gam‎m a值>>figur‎e, imsho‎w(g3)2.直方图处理‎与函数绘图‎图像的直方‎图定义为离‎散函数:h(r k) = n k绘制图像的‎直方图,函数imh‎i st,语法为:h = imhis‎t(f, b)f为输入图‎像,h为直方图‎h(r k),b是用于形‎成直方图的‎灰度级个数‎,若b省略,则默认值为‎256。

C#如何将指定图像转换成灰度图代码

C#如何将指定图像转换成灰度图代码
b = *ptr1;
ptr1++;
g = *ptr1;
ptr1++;
for (int i = 0; i < palette.Entries.Length; i++)
palette.Entries[i] = Color.FromArgb(255, i, i, i);
bitmapGrayscale.Palette = palette;
{
for (int row = 0; row < height; row++)
{
ptr1 = ptrSource + strideGrayscale * row;
if (bitmapSource != null && (bitmapSource.PixelFormat == PixelFormat.Format24bppRgb || bitmapSource.PixelFormat == PixelFormat.Format32bppArgb || bitmapSource.PixelFormat == PixelFormat.Format32bppRgb))
BitmapData dataSource = bitmapSource.LockBits(rect, ImageLockMode.ReadOnly, bitmapSource.PixelFormat);
BitmapData dataGrayscale = bitmapGrayscale.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);

(7)图像处理-图像的线性灰度变换

(7)图像处理-图像的线性灰度变换

图像的线性灰度变换线性灰度变换的两种方法:(1)全图变换(2)两端截取的分段变换(1)全图变换变换公式为g(x)=f(x)*c+R其中f(x)为图像的输入灰度,g(x)为图像的输出灰度若设输入图像的灰度范围为(fmin,fmax),输出的灰度范围为(gmin,gmax)则变换公式为g(x)=(gmax-gmin)/(fmax-fmin)*(f(x)-fmin)+gmin一般来说为灰度拉伸,即gmin<fmin,gmax>fmax,对于一副一般的正常灰度图像fmin=0,fmax=255。

以下为实现代码:void CDipView::OnGraystrectch(){CDipDoc*pDoc=GetDocument();if(!(pDoc->m_pBmi&&pDoc->m_pBmData)){MessageBox(_T("No Object"),MB_OK);}else{int flag=0;//是否灰度图标记int i_top=pDoc->m_pBmi->bmiHeader.biHeight;int j_top=pDoc->m_pBmi->bmiHeader.biWidth*3;int w=pDoc->m_pBmi->bmiHeader.biSizeImage/i_top;double gmin=pDoc->m_pBmData[0],gmax=pDoc->m_pBmData[0];for(int i=0;i<i_top;i++){for(int j=0;j<j_top;j+=3){if(!((pDoc->m_pBmData[i*w+j]==pDoc->m_pBmData[i*w+j+1])&&(pDoc->m_pBmData[i*w+j+1]==pDoc->m_pBmData[i*w+j +2]))){flag=1;break;}}if(flag){break;}}//判断是否灰度图if(flag){MessageBox(_T("不是灰度图"),MB_OK);m_type=0;}else{for(int i=0;i<i_top;i++){for(int j=0;j<j_top;j+=3){gmin=min(gmin,pDoc->m_pBmData[i*w+j]);gmax=max(gmax,pDoc->m_pBmData[i*w+j]);}}for(int i=0;i<i_top;i++){for(int j=0;j<j_top;j+=3){pDoc->m_pBmData[i*w+j]=(byte)(255.0/(gmax-gmin)*(pDoc->m_pBmData[i*w+j]-gmin));pDoc->m_pBmData[i*w+j+1]=(byte)(255.0/(gmax-gmin)*(pDoc->m_pBmData[i*w+j+1]-gmin));pDoc->m_pBmData[i*w+j+2]=(byte)(255.0/(gmax-gmin)*(pDoc->m_pBmData[i*w+j+2]-gmin));}}Invalidate();}}// TODO: 在此添加命令处理程序代码}直方图的变化(2)两端截取的灰度拉伸很多时候图片的大部分像素的灰度级在(fmin,fmax)内分布,少部分分布在小于fmin和大于fmax的区间内,此时用下式进行变换:g(x)=gmin f(x)<fming(x)= (gmax-gmin)/(fmax-fmin)*(f(x)-fmin)+gmin fmin<=f(x)<=fmaxg(x)=gmax f(x)>fmax缺点:会造成小部分信息的丢失具体实现代码如下:void CDipView::OnAutostrecth(){CDipDoc*pDoc=GetDocument();if(!(pDoc->m_pBmi&&pDoc->m_pBmData)){MessageBox(_T("No Object"),MB_OK);}else{int flag=0;//是否灰度图标记int i_top=pDoc->m_pBmi->bmiHeader.biHeight;int j_top=pDoc->m_pBmi->bmiHeader.biWidth*3;int w=pDoc->m_pBmi->bmiHeader.biSizeImage/i_top;double gmin,gmax;for(int i=0;i<i_top;i++){for(int j=0;j<j_top;j+=3){if(!((pDoc->m_pBmData[i*w+j]==pDoc->m_pBmData[i*w+j+1])&&(pDoc->m_pBmData[i*w+j+1]==pDoc->m_pBmData[i*w+j +2]))){flag=1;break;}}if(flag)break;}//判断是否灰度图if(flag){MessageBox(_T("不是灰度图"),MB_OK);m_type=0;}else{long y[256];///全赋初值为零///for(int i=0;i<256;i++){y[i]=0;}////灰度分布统计////for(int i=0;i<i_top;i++){for(int j=0;j<j_top;j+=3){y[(pDoc->m_pBmData[i*w+j])]++;}}for(int i=0;i<256;i++){if(y[i]>300){gmin=i;break;}}for(int i=255;i>=0;i--){if(y[i]>300){gmax=i;break;}}for(int i=0;i<i_top;i++){for(int j=0;j<j_top;j+=3){if(pDoc->m_pBmData[i*w+j]<=gmin){pDoc->m_pBmData[i*w+j]=gmin;pDoc->m_pBmData[i*w+j+1]=gmin;pDoc->m_pBmData[i*w+j+2]=gmin;}if(pDoc->m_pBmData[i*w+j]>=gmax){pDoc->m_pBmData[i*w+j]=gmax;pDoc->m_pBmData[i*w+j+1]=gmax;pDoc->m_pBmData[i*w+j+2]=gmax;}pDoc->m_pBmData[i*w+j]=(byte)min(255,(255.0/(gmax-gmin)*(pDoc->m_pBmData[i*w+j]-gmin)));pDoc->m_pBmData[i*w+j+1]=(byte)min(255,(255.0/(gmax-gmin)*(pDoc->m_pBmData[i*w+j+1]-gmin)));pDoc->m_pBmData[i*w+j+2]=(byte)min(255,(255.0/(gmax-gmin)*(pDoc->m_pBmData[i*w+j+2]-gmin)));}}Invalidate();}}}直方图变化。

VC编程实现灰度图像与彩色图像的相互转换要点

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)为相应点的灰度值。

C#图片灰度处理(位深度24→位深度8)

C#图片灰度处理(位深度24→位深度8)

C#图片灰度处理(位深度24→位深度8)#region 灰度处理////// 将源图像灰度化,并转化为8位灰度图像。

////// 源图像。

/// 8位灰度图像。

public static Bitmap RgbToGrayScale(Bitmap original){if (original != null){// 将源图像内存区域锁定Rectangle rect = new Rectangle(0, 0, original.Width, original.Height);BitmapData bmpData = original.LockBits(rect, ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);// 获取图像参数int width = bmpData.Width;int height = bmpData.Height;int stride = bmpData.Stride; // 扫描线的宽度,比实际图片要大int offset = stride - width * 3; // 显示宽度与扫描线宽度的间隙IntPtr ptr = bmpData.Scan0; // 获取bmpData的内存起始位置的指针int scanBytesLength = stride * height; // 用stride宽度,表示这是内存区域的大小// 分别设置两个位置指针,指向源数组和目标数组int posScan = 0, posDst = 0;byte[] rgbValues = new byte[scanBytesLength]; // 为目标数组分配内存Marshal.Copy(ptr, rgbValues, 0, scanBytesLength); // 将图像数据拷贝到rgbValues中// 分配灰度数组byte[] grayValues = new byte[width * height]; // 不含未用空间。

图像灰度变换、二值化、直方图

图像灰度变换、二值化、直方图

图像灰度变换、⼆值化、直⽅图1、灰度变换1)灰度图的线性变换Gnew = Fa * Gold + Fb。

Fa为斜线的斜率,Fb为y轴上的截距。

Fa>1 输出图像的对⽐度变⼤,否则变⼩。

Fa=1 Fb≠0时,图像的灰度上移或下移,效果为图像变亮或变暗。

Fa=-1,Fb=255时,发⽣图像反转。

注意:线性变换会出现亮度饱和⽽丢失细节。

2)对数变换t=c * log(1+s)c为变换尺度,s为源灰度,t为变换后的灰度。

对数变换⾃变量低时曲线斜率⾼,⾃变量⼤时斜率⼩。

所以会放⼤图像较暗的部分,压缩较亮的部分。

3)伽马变换y=(x+esp)γ,x与y的范围是[0,1], esp为补偿系数,γ为伽马系数。

当伽马系数⼤于1时,图像⾼灰度区域得到增强。

当伽马系数⼩于1时,图像低灰度区域得到增强。

当伽马系数等于1时,图像线性变换。

4)图像取反⽅法1:直接取反imgPath = 'E:\opencv_pic\src_pic\pic2.bmp';img1 = imread(imgPath); % 前景图img0 = 255-img1; % 取反景图subplot(1,2,1),imshow(img1),title('原始图像');subplot(1,2,2),imshow(img0),title('取反图像');⽅法2:伽马变换Matlab:imadjust(f, [low_in, high_in], [low_out, high_out], gamma)[low_in, high_in]范围内的数据映射到 [low_out, high_out],低于low的映射到low_out, ⾼于high的映射到high_out. imgPath = 'E:\opencv_pic\src_pic\pic2.bmp';img1 = imread(imgPath); % 前景图img0 = imadjust(img1, [0,1], [1,0]);subplot(1,2,1),imshow(img1),title('原始图像');subplot(1,2,2),imshow(img0),title('取反图像');2、⼆值化1)rgb2gray⼀般保存的灰度图是24位的灰度,如果改为8bit灰度图。

VC_在图像灰度级处理中的算法及实现

VC_在图像灰度级处理中的算法及实现

+3,
,
对于离散图像( 则有
( + # ’ . 0 2 + 4 , # ’ 45 ’ 6 7 ! $ *’ ) . 0 2 + 4 , 0 #) ,
’ ( " ’ + "
+8, $ 0 #( !… 其中 9 是帧内像素总数 ( )* + 45 , 是第 5 级灰度的概 率 ( 95 是图像中 5 级灰度的像素总数 ( 6 是图像中灰度级 +:, 的总数目。 相应的反变换为 4 0 2 7 ! + . , 3’ 算法的实现 利用 ;< = = 实现的灰度图像均衡化处理的流程 为 1 打开一幅灰度图像 ) 初始化 >?@ 对象 ) 创建内存 缓冲区 ) 缓冲区载入 >?@ 对象 ) 统计原图像的灰度值 )原灰度映射到新灰度 )生成新的图像 根据上述的算法描述, 要实现灰度图像的直方图 均衡化, 必须首先统计原图像的各级灰度值, 在程序中 定义了一个数组 6>A&*AA<BC9D E 3F" G 来统计原图像的各 级灰度值, 然后对得到的灰度值做灰度映射, 将映射后 的 结 果 存 到 一 个 新 的 灰 度 映 射 关 系 数 组 HIJKDJH6A E 3F" G 中, 根据这个数组就可以确定出源图像的某个灰 度级经过变换后对应于哪个新的灰度级, 最后将变换 后的结果保存到 >?@ 中。 经过这样的处理后, 就可把源 图像中密集分布的灰度值映射到经过均衡化后的新灰 度级上, 增加了对比度, 改善了视觉效果。 实现直方图均衡化的函数主要代码如下 1 @LLM N?OP)? QRCJ6STA + M).24 6K>?@-, MLOU 6NS/DV,MLOU 6WAS&VD , X C9-S&9A/ YVJ*% 6K.BC*YAZ MLOU 62[KZ MLOU D, -Z @\2Q HIJKDJH6A E 3F" G Z MLOU 6>A&*AA<BC9D E 3F" G Z MLOU 6MS9A@]DA-Z 6MS9A@]DA- 0 N?>2W@\2Q. + 6NS/DV % ^ , Z %B* + D 0 #Z D_ 3F"Z D = = , X 6>A&*AA<BC9D E S G 0 #Z ‘ %B* + D 0 #Z D _ 6WAS&VDZ D = = , X %B* + - 0 #Z -_ 6NS/DVZ - = = , X6K.BC*YA 0 + C9-S&9A/ YVJ* % , 6K>?@- = 6MS9A@]DA% D = -Z 6>A&*AA<BC9D E % + 6K.BC*YA , G = = Z ・!!"・

C语言实现图像灰度均衡化

C语言实现图像灰度均衡化

参考文献(4条) 1.阮秋琦 数字图像处理学 2001 2.刘文耀 光电图像处理 2002 3.田捷;沙飞;张新生 实用图像分析与处理技术 1995 4.章毓晋 图像处理和分析 1990
本文链接:/Periodical_kjf200903048.aspx
l=0
i=0
移≤毗≤j,k=O,j,…,£一j)
{4)
其中地表示灰度级为耻的离散值,m表示灰度级为啦的像素的数
目,n表示象素的总数目。
根据(4)式可以对直方图进行均衡化,但我们知道在具体用计算
机实现时,由于灰度级的离散性,必需将不同的啦合并成同一个灰度
级。构造如下公式来实现:
PFint((£一j}&×+I嘲
廛屉抖撞
法分类器的部分检漪结果。 表l 两种力{击的速度对比
方法
(38速4*度288)
hldViola脚67样B
本方法
16mB
初始尺度
123 1.25
放大因子PC
1.5
P1.ff700M]-iz
1.5
AMD2.2Giiz
图7在UIT+Clfd测试集匕的邮分检燃
5结论 文章祥细介绍了Adaboost算法及PaulViola等的方法,并在 PaulViola方法的基础上提出了新的Haar-/ike特征,并对检测方法及 图像预处理方法进行了扩展,使用Canny算子预处理图像,检测时逐 次放大扫描窗口,减少变换图像的消耗。设计并实现了一个基于 Adaboost算法的快速人脸检测系统,实验表明该方法提高了检测速度 并得到了较好的检溺效果,具有较强的应用价值。
1理论和建模 1.1理论
直方图均衡化是通过增加图象灰度值的动态范围,增加对比度,以
致图象具有较大的反差,大部分细节比较清晰。而它的实质是将多个频

OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)

OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)

OpenCV计算机视觉学习(3)——图像灰度线性变换与⾮线性变换(对数变换,伽马变换)如果需要处理的原图及代码,请移步⼩编的GitHub地址 传送门: 下⾯主要学习图像灰度化的知识,结合OpenCV调⽤ cv2.cvtColor()函数实现图像灰度化,使⽤像素处理⽅法对图像进⾏灰度化处理。

1. 图像灰度化1.1 图像灰度化的⽬的 将彩⾊图像转化为灰度图像的过程是图像的灰度化过程。

彩⾊图像中的每个像素的颜⾊由 R, G, B三个分量决定,⽽每个分量中可以取值 0~255,这样⼀个像素点可以有 1600多万(255*255*255=16581375)的颜⾊的变化范围。

⽽灰度图像是 R,G,B三个分量相同的⼀种特殊的彩⾊图像,其中⼀个像素点的变换范围为 256 种,所以在数字图像处理中⼀般将各种格式的图像转换为灰度图像以使后续的图像计算量少⼀些。

灰度图像的描述与彩⾊图像⼀样仍然反映了整幅图像的整体和局部的⾊度和⾼亮等级的分布和特征。

1.2 图像灰度化原理 图像灰度化是将⼀幅彩⾊图像转换为灰度化图像的过程。

彩⾊图像通常包括R、G、B三个分量,分别显⽰出红绿蓝等各种颜⾊,灰度化就是使彩⾊图像的R、G、B三个分量相等的过程。

灰度图像中每个像素仅具有⼀种样本颜⾊,其灰度是位于⿊⾊与⽩⾊之间的多级⾊彩深度,灰度值⼤的像素点⽐较亮,反之⽐较暗,像素值最⼤为255(表⽰⽩⾊),像素值最⼩为0(表⽰⿊⾊)。

图像灰度化核⼼思想是 R = G = B ,这个值也叫灰度值。

上表中Gray表⽰灰度处理之后的颜⾊,然后将原始RGB(R,G,B)颜⾊均匀地替换成新颜⾊RGB(Gray,Gray,Gray),从⽽将彩⾊图⽚转化为灰度图像。

⼀种常见的⽅法是加权平均灰度处理,这种效果是最好的。

是将RGB三个分量求和再取平均值,但更为准确的⽅法是设置不同的权重,将RGB分量按不同的⽐例进⾏灰度划分。

⽐如⼈类的眼睛感官蓝⾊的敏感度最低,敏感最⾼的是绿⾊,因此将RGB按照0.299、0.587、0.114⽐例加权平均能得到较合理的灰度图像,如公式所⽰:1.3 图像灰度化的三种⽅法1.3.1 OpenCV直接灰度化 下⾯的这种⽅法,在读取图⽚的时候,直接将图⽚转化为灰度化:import cv2img = cv2.imread(photo_file, cv2.IMREAD_GRAYSCALE) 得到的img是⼀个函数。

c图像灰度

c图像灰度

成绩:项目名称:基于VC数字图像的灰度变换基于VC的图像灰度变换摘要随着信息时期的到来,图像已经成为信息社会的大体信息之一。

数字图像处置是对图像信息的大体处置方式,它通过一些繁杂的算法对大量的图像数据进行运算以达到人们中意的图像成效。

灰度变换是最多见的图像处置手腕。

经常使用的灰度变换功能包括灰度直方图、灰度线性变换、灰度阈值变换、灰度均衡等等。

作为数字图像处置的一个重要部份,本文介绍了在Visual Studio2020中对图像进行灰度线性变换及对灰度均衡化修正,最后给出了程序的运行结果。

程序可能分为两大部份:读写BMP图像和数字图像的灰度变换。

即第一用Visual Studio2020创建一个MFC应用程序框架,再实现任意BMP图像的读写,完成经典的图像灰度变换功能。

关键字:Visual Studio2020;图像处置;灰度变换Gray-scale Transformation of digital Image based on VCAbstractWith the advent of the information age, image becomes one of the basic information of the information society.Digital image processing is a basic method of image information, which some complicated algorithm operates on large amounts of image data in order to achieve the satisfactory effects.Gray-scale transformation is the most common image processing method.Gray-scale transformation commonly used include histogram, gray linear transformation, threshold transformation, gray balance etc.. As an important part of digital image processing, my paper introduces the Visual Studio2020 in the gray image Histogram, generates correction of gray balance and gives running results.The program is composed of two parts: an operation BMP image and digital image gray-scale transformation.First, create a MFC application framework in Visual Studio2020 and then operate any BMP image to complete the gray-scale transformation of class.Keywords:Visual Studio2020; Image processing; Gray-scale Transformation目录摘要 (I)Abstract ....................................................... I I 第1章引言 (2)选题意义及背景 (2)Visual Studio2020 (2)第2章数字图像灰度变换大体概念 (3)灰度图 (3)分段线性变换 (3)灰度散布均衡化 (4)第3章程序流图 (6)3.1 图像的线性灰度变换 (6)3.2 灰度均衡流程图 (7)第4章运行及结果 (8)第5章课程设计总结及展望 (10)附录 (11)参考文献 (16)第一章引言1.1 选题意义及背景最近几年来,不管在生活仍是工程运用中涉及到的图像绝大多数是数字图像。

图像处理的线性点运算与灰度均衡程序讲义

图像处理的线性点运算与灰度均衡程序讲义

线性点运算1.接口资源窗口toolbar添加图标,ID_LINETRANS,在视类里添加响应函数OnHistogram()。

2.修改Bmp.cpp文件,新增函数LinerT rans ()void LinerTrans(float a, float b){// 图像的宽度和高度int w = lpBitsInfo->bmiHeader.biWidth;int h = lpBitsInfo->bmiHeader.biHeight;// 计算源图像中每行的字节数(必须是4的倍数)int LineBytes = (w * lpBitsInfo->bmiHeader.biBitCount + 31)/32 * 4;// 指向图像数据的指针BYTE *lpBits = (BYTE*)&lpBitsInfo->bmiColors[lpBitsInfo->bmiHeader.biClrUsed];int i, j;BYTE* pixel;float temp;for (i = 0; i < h; i ++){for (j = 0; j < w; j ++){// 指向像素点(i,j)的指针pixel = lpBits + LineBytes * (h - 1 - i) + j;// 线性变换temp = a * (*pixel) + b;// 判断是否超出范围if (temp > 255){// 直接赋值为255*pixel = 255;}else if (temp < 0){// 直接赋值为0*pixel = 0;}else{// 四舍五入*pixel = (BYTE) (temp + 0.5);}}}}3.视类,响应函数添加代码void LinerTrans(float, float);void CBmpDisplayView::OnLinetrans(){LinerTrans(2, -100);Invalidate();}4.视类,类向导添加菜单自动更新命令void CBmpDisplayView:: OnUpdateLinetrans(CCmdUI* pCmdUI){pCmdUI->Enable(lpBitsInfo != NULL);}灰度均衡1.接口资源窗口toolbar添加图标,ID_EQUALIZE,在视类里添加响应函数OnEqualize ()。

灰度变换的实现原理及应用

灰度变换的实现原理及应用

灰度变换的实现原理及应用1. 灰度变换的概述灰度变换是一种图像处理技术,用于改变图像的亮度和对比度。

通过对图像中的每个像素进行数学变换,可以改变像素的亮度级别,并使得整个图像的灰度分布发生变化。

灰度变换通常用于增强图像的细节,调整图像的亮度和对比度,以及实现特定的视觉效果。

2. 灰度变换的实现原理灰度变换的实现原理基于对图像的像素进行数学运算。

常见的灰度变换公式如下:•线性变换:$g(x, y) = \\alpha * f(x, y) + \\beta$,其中f(x,y)表示原始图像的灰度值,g(x,y)表示变换后的灰度值,$\\alpha$ 和 $\\beta$ 是常数。

•幂律变换:$g(x, y) = c * f(x, y)^{\\gamma}$,其中c和$\\gamma$ 是常数,f(x,y)表示原始图像的灰度值,g(x,y)表示变换后的灰度值。

•对数变换:$g(x, y) = c * \\log(1 + f(x, y))$,其中c是常数,f(x,y)表示原始图像的灰度值,g(x,y)表示变换后的灰度值。

灰度变换的核心思想是通过对原始图像的灰度值进行数学运算,改变图像的亮度和对比度。

不同的变换公式可以实现不同的效果,例如加强图像的亮度和对比度、调整图像的色调和饱和度等。

3. 灰度变换的应用灰度变换在图像处理中有广泛的应用,包括但不限于以下方面:3.1 图像增强灰度变换可以用于增强图像的细节和对比度,改善图像的视觉效果。

通过合理地选择灰度变换的参数,可以使得图像中的细节更加清晰,色彩更加丰富。

3.2 图像去噪灰度变换可以用于图像去噪。

通过对图像的灰度值进行变换,可以减小图像中的噪声,并改善图像的质量。

常见的去噪方法包括中值滤波、均值滤波等。

3.3 图像分割灰度变换可以用于图像分割。

通过对图像的灰度值进行变换,可以将图像中的不同区域分割出来,方便进行进一步的分析和处理。

3.4 图像匹配灰度变换可以用于图像匹配。

基于c#图像灰度化、灰度反转、二值化的实现方法详解

基于c#图像灰度化、灰度反转、二值化的实现方法详解

基于c#图像灰度化、灰度反转、⼆值化的实现⽅法详解本篇⽂章是对c#图像灰度化、灰度反转、⼆值化的实现⽅法进⾏了详细的分析介绍,需要的朋友参考下图像灰度化:将彩⾊图像转化成为灰度图像的过程成为图像的灰度化处理。

彩⾊图像中的每个像素的颜⾊有R、G、B三个分量决定,⽽每个分量有255中值可取,这样⼀个像素点可以有1600 多万(255*255*255)的颜⾊的变化范围。

⽽灰度图像是R、G、B三个分量相同的⼀种特殊的彩⾊图像,其⼀个像素点的变化范围为255种,所以在数字图像处理种⼀般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少⼀些。

灰度图像的描述与彩⾊图像⼀样仍然反映了整幅图像的整体和局部的⾊度和亮度等级的分布和特征。

图像的灰度化处理可⽤两种⽅法来实现。

第⼀种⽅法使求出每个像素点的R、G、B三个分量的平均值,然后将这个平均值赋予给这个像素的三个分量。

第⼆种⽅法是根据YUV的颜⾊空间中,Y的分量的物理意义是点的亮度,由该值反映亮度等级,根据RGB和YUV颜⾊空间的变化关系可建⽴亮度Y与R、G、B三个颜⾊分量的对应:Y=0.3R+0.59G+0.11B,以这个亮度值表达图像的灰度值。

///<summary>///图像灰度化///</summary>///<param name="bmp"></param>///<returns></returns>public static Bitmap ToGray(Bitmap bmp){for (int i = 0; i < bmp.Width; i++){for (int j = 0; j < bmp.Height; j++){//获取该点的像素的RGB的颜⾊Color color = bmp.GetPixel(i, j);//利⽤公式计算灰度值int gray = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);Color newColor = Color.FromArgb(gray, gray, gray);bmp.SetPixel(i, j, newColor);}}return bmp;}灰度反转:把每个像素点的R、G、B三个分量的值0的设为255,255的设为0。

C语言实现BMP图像处理(彩色图转灰度图)

C语言实现BMP图像处理(彩色图转灰度图)

C语⾔实现BMP图像处理(彩⾊图转灰度图)我们知道真彩图不带调⾊板,每个象素⽤ 3 个字节,表⽰ R、G、B 三个分量。

所以处理很简单,根据 R、G、B 的值求出 Y 值后,将 R、G、B 值都赋值成 Y,写⼊新图即可。

在YUV 的颜⾊表⽰⽅法中,Y 分量的物理含义就是亮度,它含了灰度图(grayscale)的所有信息,只⽤ Y 分量就完全能够表⽰出⼀幅灰度图来。

YUV 和RGB 之间有着如下的对应关系:再来看看带调⾊板的彩⾊图,我们知道位图中的数据只是对应调⾊板中的⼀个索引值,我们只需要将调⾊板中的彩⾊变成灰度,形成新调⾊板,⽽位图数据不⽤动,就可以了。

以上解释来⾃于:《数字图像处理编程⼊门》,代码参考:#include<stdio.h>#include<windows.h>int main(int argc, char* argv[]){int bmpHeight;int bmpWidth;unsigned char *pBmpBuf;RGBQUAD *pColorTable;int biBitCount;//读取bmp⽂件FILE *fp = fopen("./02.bmp", "rb");if (fp == 0)return 0;fseek(fp, sizeof(BITMAPFILEHEADER), 0);BITMAPINFOHEADER head;fread(&head, 40, 1, fp);bmpHeight = head.biHeight;bmpWidth = head.biWidth;biBitCount = head.biBitCount;fseek(fp, sizeof(RGBQUAD), 1);int LineByte = (bmpWidth*biBitCount / 8 + 3) / 4 * 4;//保证每⼀⾏字节数都为4的整数倍pBmpBuf = new unsigned char[LineByte*bmpHeight];fread(pBmpBuf, LineByte*bmpHeight, 1, fp);fclose(fp);//将24位真彩图灰度化并保存FILE *fp1 = fopen("gray.bmp", "wb");if (fp1 == 0)return 0;int LineByte1 = (bmpWidth * 8 / 8 + 3) / 4 * 4;//修改⽂件头,其中有两项需要修改,分别为bfSize和bfOffBitsBITMAPFILEHEADER bfhead;bfhead.bfType = 0x4D42;bfhead.bfSize = 14 + 40 + 256 * sizeof(RGBQUAD)+LineByte1*bmpHeight;//修改⽂件⼤⼩bfhead.bfReserved1 = 0;bfhead.bfReserved2 = 0;bfhead.bfOffBits = 14 + 40 + 256 * sizeof(RGBQUAD);//修改偏移字节数fwrite(&bfhead, 14, 1, fp1); //将修改后的⽂件头存⼊fp1;//修改信息头,其中有两项需要修改,1个位biBitCount:真彩图为24 ,应改成8;另⼀个是biSizeImage:由于每像素所占位数的变化,所以位图数据的⼤⼩发⽣变化 BITMAPINFOHEADER head1;head1.biBitCount = 8; //将每像素的位数改为8head1.biClrImportant = 0;head1.biCompression = 0;head1.biClrUsed = 0;head1.biHeight = bmpHeight;head1.biWidth = bmpWidth;head1.biPlanes = 1;head1.biSize = 40;head1.biSizeImage = LineByte1*bmpHeight;//修改位图数据的⼤⼩head1.biXPelsPerMeter = 0;head1.biYPelsPerMeter = 0;fwrite(&head1, 40, 1, fp1); //将修改后的信息头存⼊fp1;pColorTable = new RGBQUAD[256];for (int i = 0; i < 256; i++){pColorTable[i].rgbRed = i;pColorTable[i].rgbGreen = i;pColorTable[i].rgbBlue = i; //是颜⾊表⾥的B、G、R分量都相等,且等于索引值}fwrite(pColorTable, sizeof(RGBQUAD), 256, fp1); //将颜⾊表写⼊fp1;//写位图数据unsigned char *pBmpBuf1;pBmpBuf1 = new unsigned char[LineByte1*bmpHeight];for (int i = 0; i < bmpHeight; i++){for (int j = 0; j<bmpWidth; j++){unsigned char *pb1, *pb2;pb1 = pBmpBuf + i*LineByte + j * 3;int y = *(pb1)*0.299 + *(pb1 + 1)*0.587 + *(pb1 + 2)*0.114; //将每⼀个像素都按公式y=B*0.299+G*0.587+R*0.114进⾏转化pb2 = pBmpBuf1 + i*LineByte1 + j;*pb2 = y;}}fwrite(pBmpBuf1, LineByte1*bmpHeight, 1, fp1);fclose(fp1);system("pause");return 0;}实验结果分析:实验结果分析:真彩⾊图不带调⾊板,⽽灰度图的调⾊板为256级。

VC++数字图像处理源程序及详解之2(灰度线性变换)

VC++数字图像处理源程序及详解之2(灰度线性变换)

9.2 灰度线性变换
灰度线性变换是最常用的点运算操作之一,下面先介绍其基本原理。

9.2.1 基本原理
灰度线性变换是灰度变换的一种,图像的灰度变换通过建立灰度映射来调整源图像的灰度从而达到图像增强的目的。

灰度映射通常是用灰度变换曲线来表示的,如图9-7所示。

灰度线性变换就是将图像的像素值通过指定的线性函数进行变换,以此增强或者减弱图像的灰度。

灰度线性变换的公式就是常见的一维线性函数:
g(x, y)=kf(x, y)+d
设x为原始灰度值,则变换后的灰度值y为:
也可以在坐标系中表示转化关系,如图9-7所示。

图9-7 灰度线性变换
图9-7坐标中的横轴表示输入灰度值,范围是0至 255;纵坐标表示输出灰度值,范围同样是0至255;直线则为线性变换函数的图形。

如果将输入灰度值作为自
变量x,则输出的灰度值就是函数y=T(x) 的运算结果。

对于线性变换而言,有T(x)=kx+d。

例如图9-7中的变换函数为T(x)=x,即原公式中的k=1,d=0。

由数学知识可以知道k表示直线的斜率,也就是倾斜程度;d为线性函数在y 轴的斜率。

下面通过讨论k的取值来分析灰度线性变换的效果。

1)当k>1时。

c语言数字图像处理(四):灰度变换

c语言数字图像处理(四):灰度变换

c语⾔数字图像处理(四):灰度变换灰度变换灰度变换函数 s = T(r) 其中r为输⼊图像在(x, y)点处的灰度值,s为输出图像在(x, y)点处的灰度值灰度变换的作⽤上图所⽰的两幅T(s)函数的图像曲线,第⼀幅图可以增强图像对⽐度,第⼆幅图可以对图像进⾏⼆值化处理灰度变换函数反转函数1void reverse(short** in_array, short** out_array, long height, long width)2 {3for (int i = 0; i < height; i++){4for (int j = 0; j <width; j++)5 out_array[i][j] = GRAY_LEVELS - in_array[i][j];6 }7 }最简单的灰度变换函数,将图像中的每个像素点处的颜⾊值反转,对于8位灰度图⽚,⽤255减去原灰度值原图反转图对数变换s = clog(1 + r) c为常数,本次测试中c取101void logarithm(short** in_array, short** out_array, long height, long width) 2 {3for (int i = 0; i < height; i++){4for (int j = 0; j <width; j++)5 out_array[i][j] = (short)(10 * log((1 + in_array[i][j])));6 }7 }可以看出,对数变换降低了图像的对⽐度幂律(伽马)变换s = crγ其中 c 和γ为正常数其中γ<1时,降低对⽐度,γ>1时,提⾼对⽐度γ = 1.21void gamma(short** in_array, short** out_array, long height, long width)2 {3for (int i = 0; i < height; i++){4for (int j = 0; j <width; j++)5 out_array[i][j] = (short)pow(in_array[i][j], 1.2);6 }7 }直⽅图均衡化直⽅图为离散函数h(r k) = n k, 其中r k是第k级灰度值,n k是图像中h灰度为r k的像素个数现在给出上⾯⼏幅图像的直⽅图可以明显看出,对⽐度越⾼的图像,直⽅图的分布越均衡,因此直⽅图均衡化算法可以显著提⾼图像对⽐度直⽅图均衡化算法推导(需⼀定⾼等数学及概率论知识)算法实现1void calculate_histogram(long height, long width, short **image, unsigned long histogram[]) 2 {3short k;4for(int i=0; i < height; i++){5for(int j=0; j < width; j++){6 k = image[i][j];7 histogram[k] = histogram[k] + 1;8 }9 }10 }1112void histogram_equalization(short** in_array, short** out_array, long height, long width)13 {14 unsigned long sum, sum_of_h[GRAY_LEVELS];15double constant;16 unsigned long histogram[GRAY_LEVELS] = {};1718 calculate_histogram(height, width, in_array, histogram);19 sum = 0;20for(int i=0; i < GRAY_LEVELS; i++){21 sum = sum + histogram[i];22 sum_of_h[i] = sum;23 }2425 constant = (double)(GRAY_LEVELS)/(double)(height*width);26for(int i = 0, k = 0; i < height; i++){27for(int j = 0; j < width; j++){28 k = in_array[i][j];29 out_array[i][j] = sum_of_h[k] * constant;30 }31 }32 }。

OpenCV图像处理之常见的图像灰度变换

OpenCV图像处理之常见的图像灰度变换

OpenCV图像处理之常见的图像灰度变换1.灰度线性变换图像的灰度线性变换是图像灰度变换的⼀种,图像的灰度变换通过建⽴灰度映射来调整源图像的灰度,从⽽达到图像增强的⽬的。

灰度映射通常是⽤灰度变换曲线来进⾏表⽰。

通常来说,它是将图像的像素值通过指定的线性函数进⾏变换,以此来增强或者来减弱图像的灰度,灰度线性变换的函数就是常见的线性函数。

g(x, y) = k · f(x, y) + d设源图像的灰度值为x,则进⾏灰度线性变换后的灰度值为y = kx + b (0<=y<=255),下⾯分别来讨论k的取值变化时线性变换的不同效果(1).|k|>1时当k>1时,可以⽤来增加图像的对⽐度,图像的像素值在进⾏变换后全部都线性⽅法,增强了整体的显⽰效果,且经过这种变换后,图像的整体对⽐度明显增⼤,在灰度图中的体现就是变换后的灰度图明显被拉伸了。

(2).|k|=1时当k=1时,这种情况下常⽤来调节图像的亮度,亮度的调节就是让图像的各个像素值都增加或是减少⼀定量。

在这种情况下可以通过改变d值来达到增加或者是减少图像亮度的⽬的。

因为当k=1,只改变d 值时,只有图像的亮度被改变了,d>0时,变换曲线整体发⽣上移,图像的亮度增加,对应的直⽅图整体向右侧移动,d<0时,变换曲线整体下移,图像的亮度降低,对应的直⽅图发⽣⽔平左移。

(3).0<|k|<1时此时变换的效果正好与k>1时相反,即图像的整体对⽐度和效果都被削减了,对应的直⽅图会被集中在⼀段区域上。

k值越⼩,图像的灰度分布也就越窄,图像看起来也就显得越是灰暗。

(4).k<0时在这种情况下,源图像的灰度会发⽣反转,也就是原图像中较亮的区域会变暗,⽽较暗的区域将会变量。

特别的,此时我们令k = -1,d = 255,可以令图像实现完全反转的效果。

对应的直⽅图也会发⽣相应的变化。

相应的程序试下如下://实现图像的灰度线性变化#include <iostream>#include <opencv2\core\core.hpp>#include <opencv2\highgui\highgui.hpp>#include <opencv2\imgproc\imgproc.hpp>using namespace std;using namespace cv;int main(){Mat srcImg = imread("1234.jpg");if (!srcImg.data){cout << "读⼊图⽚失败" << endl;return -1;}imshow("原图像", srcImg);double k, b;cout << "请输⼊k和b值:";cin >> k >> b;int RowsNum = srcImg.rows;int ColsNum = srcImg.cols;Mat dstImg(srcImg.size(), srcImg.type());//进⾏遍历图像像素,对每个像素进⾏相应的线性变换for (int i = 0; i < RowsNum; i++){for (int j = 0; j < ColsNum; j++){//c为遍历图像的三个通道for (int c = 0; c < 3; c++){//使⽤at操作符,防⽌越界dstImg.at<Vec3b>(i, j)[c] = saturate_cast<uchar>(k* (srcImg.at<Vec3b>(i, j)[c]) + b);}}}imshow("线性变换后的图像", dstImg);waitKey();return 0;}当k=1.2,b=50时执⾏程序的效果如下:2.灰度对数变换对数变换的基本形式为其中,b是⼀个常数,⽤来控制曲线的弯曲程度,其中,b越⼩越靠近y轴,b越⼤越靠近x轴。

Opencv实现图像灰度线性变换

Opencv实现图像灰度线性变换

Opencv实现图像灰度线性变换本⽂实例为⼤家分享了Opencv实现图像灰度线性变换的具体代码,供⼤家参考,具体内容如下通过图像灰度线性变换提⾼图像对⽐度和亮度,原图像为src,⽬标图像为dst,则dst(x,y) = * src(x,y) + 。

不仅对单通道图像可以做灰度线性变换,对三通道图像同样可以。

#include<opencv2/opencv.hpp>;#include<iostream>using namespace cv;using namespace std;int main(int argc, char** argv){Mat src,dst;src = imread("1.jpg");if (!src.data){cout << "could not load image" << endl;return -1;}namedWindow("input", CV_WINDOW_AUTOSIZE);imshow("input", src);int rows = src.rows;int cols = src.cols;float alpha = 1.2, beta = 10;dst = Mat::zeros(src.size(), src.type());for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {if (src.channels() == 3) {int b = src.at<Vec3b>(row, col)[0];int g = src.at<Vec3b>(row, col)[1];int r = src.at<Vec3b>(row, col)[2];dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>((alpha*b + beta));dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>((alpha*g + beta));dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>((alpha*r + beta));}else if(src.channels()==1){int v = src.at<uchar>(row, col);dst.at<uchar>(row, col) = saturate_cast<uchar>(alpha*v + beta);}}}namedWindow("output", CV_WINDOW_AUTOSIZE);imshow("output", dst);waitKey(0);return 0;}运⾏结果如下:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

彭军
4
2010 年 4 月 30 日
图像线性灰度变换
#ifndef _BITMAP_H_ #define _BITMAP_H_
#include <stdio.h>
#define GET_B(bmp,i,j) ( *( bmp->ptr + bmp->line_width * i + j ) ) #define GET_G(bmp,i,j) ( *( bmp->ptr + bmp->line_width * i + j + 1 ) ) #define GET_R(bmp,i,j) ( *( bmp->ptr + bmp->line_width * i + j + 2 ) ) #define SET_B(bmp,i,j,v) ( *( bmp->ptr + bmp->line_width * i + j ) = v ) #define SET_G(bmp,i,j,v) ( *( bmp->ptr + bmp->line_width * i + j + 1 ) = v ) #define SET_R(bmp,i,j,v) ( *( bmp->ptr + bmp->line_width * i + j + 2 ) = v ) #define IS8BITS(bmp) ( ( bmp->ptr != NULL && bmp->bit_count == 8 )? 1 : 0 ) #define IS24BITS(bmp) ( ( bmp->ptr != NULL && bmp->bit_count == 24 ) ? 1 : 0 ) #define ISEMPTY(bmp) ( ( bmp->ptr == NULL ) ? 1 : 0 ) #define LIM255(v) ( ( v > 255 ) ? 255 : v ) #define LIMTO0(v) ( ( v < 0 ) ? 0 : v )
typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD;
typedef struct tagBitmap
利达光电股份有限公司 |
彭军
5
2010 年 4 月 30 日
图像线性灰度变换
{ BYTE* ptr; BYTE* palette; DWORD width; DWORD height; WORD bit_count; DWORD line_width; WORD pal_length; }Bitmap;
fwrite( &dw, 4, 1, fp ); //write the biSize dw = 40; fwrite( &dw, 4, 1, fp ); //write the biWidth dw = bmp->width; fwrite( &dw, 4, 1, fp ); //write the biHeight dw = bmp->height; fwrite( &dw, 4, 1, fp ); //write the biPlanes
save_bitmap( argv[2], bmp );
free_bitmap( bmp ); free( bmp );
return 0; } =================================================== Bitmap.h 的全部程序:
利达光电股份有限公司 |
//read the color palette if the bitmap have a color palette bmp->pal_length = off_bits - 54; if( bmp->pal_length == 0 ) { bmp->palette = 0; } else { bmp->palette = (BYTE*)malloc( bmp->pal_length * sizeof(BYTE) ); if( !bmp->palette ) return;
2010
图像线性灰度变换
用 C 语言实现
用 C 语言实现位图的线性灰度变换
彭军 利达光电股份有限公司 2010/5/6
2010 年 4 月 30 日
Hale Waihona Puke 图像线性灰度变换/* File Name: lintrans.c
Description: using the linear gray tranform to a 8-bits bitmap Author: */ Peng Jun
利达光电股份有限公司 |
彭军
9
2010 年 4 月 30 日
图像线性灰度变换
fread( bmp->ptr, line_width * height, 1, fp ); //close the file fclose( fp ); }
void save_bitmap( const char *filename, Bitmap *bmp ) { FILE *fp = 0; DWORD dw = 0; WORD w = 0; //open the file for writing if( ( fp = fopen( filename, "wb" ) ) == NULL ) { printf("can not create the bitmap : %s\n", filename ); return; }
if( argc == 3 ) { a = 1.0; b = 0.0; }
利达光电股份有限公司 |
彭军
2
2010 年 4 月 30 日
图像线性灰度变换
if( argc == 5 ) { a = atof( argv[3] ); b = atof( argv[4] ); }
if( argc != 3 && argc != 5 ) { printf("Usage: lintrans <img_src> <img_dst> <a> <b>\n"); free( bmp ); return -1; }
利达光电股份有限公司 |
彭军
8
2010 年 4 月 30 日
图像线性灰度变换
fseek( fp, 54, 0 ); fread( bmp->palette, bmp->pal_length * sizeof(BYTE), 1, fp ); }
//set the memeber of the structure Bitmap line_width = ( width * bit_count + 31 ) / 32 * 4; bmp->line_width = line_width; bmp->width = width; bmp->height = height; bmp->bit_count = bit_count; //allocate memory for the pixel of the bitmap bmp->ptr = (BYTE*)malloc( line_width * height * sizeof(BYTE) ); if( !bmp->ptr ) { printf("can not allocate memory for the bitmap.\n"); bmp->width = 0; bmp->height = 0; bmp->bit_count = 0; return; } //read the pixel matrix from the bitmap fseek( fp, off_bits, 0 );
#include <stdio.h> #include <stdlib.h> #include "Bitmap.h"
int main(int argc, char *argv[]) { Bitmap *bmp = (Bitmap*)malloc( sizeof(Bitmap) ); double a = 0.0, b = 0.0, f = 0.0; DWORD i = 0, j = 0; BYTE g = 0;
for( i = 0; i < bmp->height; i++ ) { for( j = 0; j < bmp->width; j++ ) { g = GET_B( bmp, i, j ); f = g * a + b; f = LIMTO0( f ); f = LIM255( f ); SET_B( bmp, i, j, f ); } }
#include "Bitmap.h"
void load_bitmap( const char *filename, Bitmap *bmp ) { FILE *fp = 0; DWORD off_bits = 0, width = 0, height = 0, line_width = 0; WORD bit_count = 0;
//write the bfType w = 19778; fwrite( &w, 2, 1, fp ); //write the bfSize dw = 14;
利达光电股份有限公司 |
彭军
10
2010 年 4 月 30 日
图像线性灰度变换
相关文档
最新文档