《数字图像处理》:直方图处理的几种方式

目录

前言

一、直方图均衡化

        1、直方图均衡化的介绍

        2、直方图均衡化的数学原理

 3、直方图均衡化的matlab代码实现

二、直方图规定化

1、直方图规定化介绍

2、直方图规定化的原理

3、直方图规定化的代码实现

三、局部直方图处理

 1、直方图统计引例

2、直方图统计原理的简单介绍

总结

前言

记录一下2020年刚进校园的我,在赖老师“引诱”下,《数字图像处理》的初次学习。


一、直方图均衡化

        1、直方图均衡化的介绍

                直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。原始图像由于其灰度分布可能集中在较窄的区间,造成图像不够清晰。例如,过曝光将使图像的灰度级集中在高亮度范围内,而曝光不足将使图像灰度级集中在低亮度范围内。采用直方图均衡化,可以把原始图像的直方图变换为均匀分布(均衡)的形式,这样就增加了像素之间灰度值差别的动态范围,从而达到增强图像整体对比度的效果。换言之,直方图均衡化的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并,从而增大对比度,使图像清晰,达到增强的目的。

                                            (左边为原始图片,右边为均衡化后的图片)

        2、直方图均衡化的数学原理

我们先来简单了解一下灰度级的概念。

若把白色与黑色之间按对数关系分成若干级,称为“灰度级”。范围一般从0到255,白色为255,黑色为0。

 接着,我们先来做一个简单的假设。我们假设 r s 分别表示原图像灰度级和经直方图均衡化后的图像灰度级。

我们将直方图均衡化过程看成是一个变换函数(变化)的过程,并且设变换函数为 s = T(r) 

 那么我们又怎么知道这个变换函数的具体表达式呢?这里引入概率论的一个公式。

                                           F_{s}\left ( s \right )=\int_{0}^{s}p_{s}\left ( s \right )ds=\int_{0}^{r}p_{r}\left(r \right )dr

                                                             公式(1-1)

其中, p_{s}\left(s \right )为s的概率密度函数,同理p_{r}\left(r\right )为r的概率密度函数,由上面的公式易知,直方图均衡化后,图像的灰度级虽会发生改变,但是它的灰度级累计概率F_{s}\left(s \right )是不变的。

我们将公式(1-1)两边对s进行求导,我们可以得到以下公式(1-2)

                          p_{s}\left(s \right )=\frac{\mathrm{d} F_{s}\left(s \right )}{\mathrm{d} s}=\frac{\mathrm{d}[\int _{0}^{r}p_{r}(r)dr)]}{\mathrm{d} s}=p_{r}(r)\frac{\mathrm{d} r}{\mathrm{d} s}=p_{r}(r)\frac{\mathrm{d} r}{\mathrm{d} T(r)}

                                                              公式(1-2)

可以看出,通过变换函数 T(r) 可以控制图像灰度级的概率密度函数,从而改善图像的灰度层次,

这就是直方图均衡化的理论基础。

从人眼视觉特性来考虑,一幅图像的灰度直方图如果是均匀分布的,那么该图像看上去效果比较好。

因此要做直方图均衡化,这里的p_{s}(s)应该是均匀分布的概率密度函数。

由概率论的知识可知,若原图像没有归一化对于s在区间[0,L-1]的分布,其概率密度函数应该为\tfrac{1}{L-1}

而如果原图像归一化了后,s在区间[0,1]分布,其概率密度函数p_{s}(s)=\tfrac{1}{1-0}=1。

另外,若原图像归一化后,由于p_{s}(s)=1,则公式(1-2)p_{s}(s)=p_{r}\left(r\right )\tfrac{dr}{ds}可转化为

                                                                ds=p_{r}\left(r \right )dr

                                                                     公式(1-3)

对公式(1-3)进行积分,可得

                                                  s=T(r)=\int_{0}^{r}p_{r}(r)dr

                                                               公式(1-4)

公式(1-4)即为我们所求的变换函数展开式

 3、直方图均衡化的matlab代码实现

  在matlab里面,我们可以直接调用histeq函数来对直方图进行均衡化,使用起来非常方便。

但抱着学习的心态,我们还是来看一下histeq函数内部的具体实现:

image=imread('orl1_1.bmp');%读入图片。
[height,width]=size(image);%测量图片的高度和宽度。
num_pixel=zeros(1,256);%创建一个单行256列的空矩阵,来统计各灰度值k的像素个数。
for i=1:height
 for j=1:width
     k=image(i,j);%k为灰度值,i和j表示图片像素点的坐标
num_pixel(k+1)=num_pixel(k+1)+1;%由于数组的下标是从1开始计数,而灰度值K是从0开始的,到255结束。
 end
end


%显示num_pixel的直方图。
figure;
subplot(111),bar(num_pixel);%这里我用bar函数绘制直方图,用imhist函数也可以绘制


%归一化操作,归一化即正则化
P=zeros(1,256);
for i=1:256
  P(i)=num_pixel(i)/(height*width);%计算每个灰度值的概率。
end


%显示P的直方图,和未归一化的直方图进行比较。
figure;
subplot(121),bar(num_pixel);
subplot(122),bar(P);


cum_pixel=cumsum(P);%计算灰度累计分布频率(求积分),就是我们之前说的那个变换函数的展开式。
cum_pixel=uint8((256-1).*cum_pixel+0.5);%先将各灰度的累计频率乘以(L-1),再进行四舍五入化整,以使得均衡化后图像的灰度级与归一化前的原始图像一致。


%显示cum_pixel的直方图,并和之前的直方图进行比较。
figure;
subplot(131),bar(num_pixel);
subplot(132),bar(P);
subplot(133),bar(cum_pixel);


out_image=uint8(zeros(height,width));%创建一个新的空矩阵,用来储存均衡化后的灰度值数据
for i=1:height
   for j=1:width
     out_image(i,j)=cum_pixel(image(i,j));%在这里的image(i,j)为索引值,起索引的作用。
   end
end


figure;
imshowpair(image,out_image,'montage');%利用imshowpair函数将原图和均衡化的数据进行比较,为了显示相同大小的多张图片,我们这里使用‘montage’(蒙太奇)的手法。
 


二、直方图规定化


1、直方图规定化介绍

讲完直方图的均衡化后,肯定会有同学在想,那我们如何调节图像对比度呢?

没错。直方图均衡化虽然能增大对比度、丰富灰度级数。但是只能扩展到整个灰度区间,不能根据我们的实际需要作出相应调整。     

灰度规定化可以弥补这个缺憾,能让我们通过灰度变换得到我们想要的灰度分布区间。

直方图规定化就如手机里的对比度调节功能,图像的对比度是由我们来规定的。


2、直方图规定化的原理

p_{r}(r)p_{z}(z)分别表示原灰度图像目标图像的灰度分布的概率密度函数。

根据直方图规定化的特点与要求,应使原图像的直方图具有p_{z}(z)所表示的形状。

因此我们要找出p_{r}(r)p_{z}(z)之间的联系。

根据直方图均衡化理论,首先对原图像的直方图进行均衡化处理,即求变换函数。

                                      s=T(r)=\int_{0}^{r}p_{r}(r)dr

                                                 公式(1-4)

我们现在假设原图像已经被规定化了,我们对规定化后的图像(即目标图像)也采用同样的方法进行均衡化处理。

                                            v=G(z)=\int_{0}^{z}p_{z}(z)dz

                                                       公式(2-1)

上式的逆变换(反函数)为

                                                    z=G^{-1}(v)

                                                       公式(2-2)

上述逆变换表明,我们可以通过均衡化后的灰度值v求出目标图像的灰度值z。由于原图像和目标图像都进行了均衡化处理、我们的灰度区间都是相同的长度[0,255],所以规定化后则具有相同的概率密度函数

                                                  p_{s}(s)=p_{v}(v) 

                                                    公式(2-3)

因而我们可以用s代替v,得到

                                               z=G^{-1}(v)=G^{-1}(s)

                                                    公式(2-4)

所以我们得到了目标图像的灰度值z

3、直方图规定化的代码实现

在Matlab中没有直接实现灰度规定化的函数。但我们可以直接通过imhisthisteq两个函数的灵活使用来实现。

image=imread('原图.png');
image_m=imread('局部处理.png');

imahe_imhist=imhist(image);
image_m_imhist=imhist(image_m);
result=histeq(image,image_m_imhist);

figure;
subplot(231),imshow(image),title('原图像');
subplot(232),imshow(image_m),title('模板图像');
subplot(233),imshow(result),title('规定化后的图像');
subplot(234),imhist(image),title('原图像的直方图');
subplot(235),imhist(image_m),title('模板图像的直方图');
subplot(236),imhist(result),title('规定化处理后的图像的直方图');

 效果图如下:

 PS:直方图规定化:彩色图处理的方法

彩色图的直方图匹配与灰度图像稍有不同,需要分解成RGB进行分别匹配才可以完成彩色图像的直方图匹配。与灰度图像匹配一样,原图像也受到模板图像灰度级的影响。

由于彩色图处理与灰度图处理的原理相同,只是处理数据多了两维,便不作过多介绍了。


三、局部直方图处理

        前面我们讨论的两种直方图处理方法是全局性的,在某种意义上,像素基于整幅图像的灰度分布的变换函数修改。

        虽然这种全局方法适用于整个图像的增强,但存在这样的情况,增强图像中小区域的细节也是需要的。这些区域中,一些像素的影响在全局变换的计算中可能被忽略了,因为全局变换没有必要保证期望的局部增强。

         解决方法是以图像中每个像素的领域中的灰度分布为基础设计变换函数。

         下面我将为大家讲一讲使用直方图统计的局部增强

 1、直方图统计引例

        

倘若我们想把左图中黑色区域中的图案凸显出来,得到右图的效果。

 那么首先我们要明确我们进行局部处理的目的:增强低对比度暗区域的对比度。

然而问题是,如何增强暗色区域,但同时尽可能保持明亮区域不变,因为明亮区域不需要增强。

为解决这一问题,我们应该先分辨暗区域与亮区域的不同,再分辨低对比度与高对比度区域的不同,最后增强低对比度的暗区域。

判断一个区域在点(x,y)是暗是亮的方法是把局部平均灰度m_{s_{xy}}与全局平均灰度m_{G}进行 进行比较。

这样我们就有了第一个判断条件:如果k_{0}m_{G}m_{s_{xy}}k_{1}m_{G},其中k_{0}k_{1}是一个值小于等于1.0的正常数,那么我们将把点(x,y)处的像素考虑作为处理的候选点

2、直方图统计原理的简单介绍

         因为我们感兴趣的是增强低对比度的区域,所以还需要一个判断条件来判断一个区域的对比度是否可作为增强的候选点。因此,如果k_{1}n_{G}n_{S_{xy}}k_{2}n_{G}, 𝑘1<𝑘2,则将(x,y)作为候选点。

判断了之后,我们可以简单地通过将已选好的像素值乘以一个指定的常数E来处理,以达到局部增强的目的。

g(x,y)=E\int(x,y),k_{0}m_{G}\leq m_{S_{xy}}\leq k_{1}m_{G}且   k_{2}n_{G}\leq n_{S_{xy}}\leq k_{3}n_{G},k_{0}< k_{1},k_{2}<k_{3}

        其中,E, k_{0},k_{1},k_{2},k_{3}是规定的参数; m_{G}是输入图像的全局均值; n_{G}是输入图像的全局标准差;参数m_{S_{xy}}n_{S_{xy}}分别是局部均值和局部标准差。x=0,1,2…,M-1     y=0,1,2,…,N-1,其中M和N是图像行和列的维数。


 接下来我们来看看均衡化和局部处理方法处理后的效果对比

 

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用MFC在VS2013编写的数字图象处理软件,能够实现相当强大的功能。 BMP格式读取 保存 DFT FFT 直方图 色调均化 缩放 模糊 锐化 滤镜 形态学处理 曲线 裁剪 灰度图 彩色图 自动阈值 等等...除此之外还有很多其他小功能... 建议使用VS2013打开!!!核心代码在Bmp.cpp中!!! 更新文档: 2014年6月18日更新说明: 这次应该是上交的最后一次作业了,在今日的展示结束之后总体情况还好,但是发现了几个问题。 首先是这个程序是在win8环境下设计的,所以程序的一些大小参数以及按钮图片的位置参数是适合在win8的环境下操作,在设计报告中使用的操作系统也是win8。 而如果将该程序移动至win7系统上操作的话可以在大小与位置上会出现一些偏差,所以推荐将该程序在win8系统下运行,如果没有win8系统但是想重装的话可以找我。 然后本次更新的内容就是对设计报告中的要求的一些补充,比如图片的裁剪功能,还有一些照旧的BUG修复了。 关于这个裁剪功能,在程序中的图像裁剪中有一个说明按钮,在设计报告中有提到怎么使用的,所以在这里就不一一说明了,其实就跟在PS上用裁剪差不多,很容易用的。 关于设计的感想也写在了设计报告上了- -,这里也就不多说了。 好了这个程序算是最终完成了,撒花!师姐辛苦了~!!!!! ================================================================================================================================================================ 2014年5月13日更新说明: 这次的更新比较少,主要就是自动阈值分割图像方面的更新。 实现该操作的函数依然放在Bmp.cpp里面,里面一共使用了三种方式来决定自动阈值。 其中一种是“大津法”,函数是“OtsuThreshold”,该函数最后会返回一个阈值,该阈值就是大津法得出的阈值,具体实现方式可以在cpp文件中查看。 还有一种方法就是“迭代法”,函数是“IterationThreshold”,该函数最后会返回一个阈值,该阈值就是迭代法得出的阈值,具体实现方式可以在cpp文件中查看。 前两种方法的实现方法都如老师在PPT上所说的一样,而且运算起来非常快,基本可以说是瞬时得出。 而第三种方法是我自己写的一个方法,叫做“对半分”法,函数是“HalfCutThreshold”,该函数最后会返回一个阈值,该阈值就是对半分得出的阈值,具体实现方式可以在cpp文件中查看。 其原理就是计算出一个阈值,使到阈值处理后图片的黑色像素与白色像素的数量相等或者最接近,也就是把图片按黑白像素对半分的方法来对图像进行分割。 关于程序的使用方法,可以在鼠标右键菜单中选择“调整”->“阈值”->“高级阈值”来打开高级阈值处理的对话框。 打开对话框后,默认为最直接的自己首选阈值的方法,可以通过鼠标的左键拖动直方图中的绿色竖线来调整需要设定的阈值大小,同时右边会有该图片的预览,可以很方便操作。 如果需要使用自动阈值分割,可以在阈值方式中更改,一旦选择了“直接阈值”以外的阈值方式,程序便会自动用所选择的方法帮你计算出一个阈值,同时在直方图上会显示出该阈值的位置,还有该阈值的大小,同时预览图片也会立即更新。 值得注意的是,当你选择了自动阈值的时候,你不能再通过鼠标左键在直方图上手动调整阈值大小了哦,这个时候你只需要将阈值方式调回“直接阈值”即可重新自己调整! 除了有关作业的更新之外,这次更新还调整了图片备份的内存优化,加上了使用磁盘作为备份的空间,不过这些作为使用者的话是不需要怎么注意的嗯嗯,尽情使用即可! 最后,再次谢谢师姐能够读完这个文档,如果还有什么问题的话就联系我吧,联系方式就在软件中了欢迎点击- -,谢谢! ================================================================================================================================================================ 2014年5月6日更新说明: 这次的主要更新是形态学处理的部分,也就是膨胀、腐蚀、开与闭操作。 实现函数依然是放在Bmp.cpp这个文件里面。名字为Morphology的函数就是该形态学操作的函数。 可以通过在函数中调入不同的参数与设置使到一个函数同时实现膨胀与腐蚀的功能,而开与闭的功能只需要连续调用两次函数,并且参数不同就行了,使用非常简单。 然后就是软件的使用部分,软件的位置依然是放在Release文件夹里面,而形态学处理的按钮在“右键-调整-形态学处理-形态学运算”中,单击后就会出现形态学运算的对话框。 在对话框中会看到一个9*9的结构元素方阵,可以通过使用鼠标左键点击来改变结构元素的形状,双击鼠标为还原结构元素。 设定好结构元素后可以选择操作的四种方式,选择后便会得到处理后的图像了,十分方便。 当然,如果你的图片是彩色的,这个处理也是支持的,因为我的实现函数中把“与”操作改为“取最小值”,“或”操作改为“取最大值”,这个改动在对于二值图像的处理是一样效果的,但是也使到形态学处理适用于彩色图像了。 如果你想把彩色图片或者灰度图片二值化后在进行形态学处理,可以勾选对话框中的“二值化”选项。 值得一提的是,这个二值化是对每一层的颜色单独二值化,如果想要实现阈值效果,可以直接使用阈值功能或者转化为灰度图之后再使用对话框内的二值化,效果是一样的。 除此之外还有一个边缘提取功能,就是形态学处理中的边缘提取,实现方式就是像PPT那样操作了,这里不详细说明了,是个很简单的按钮。 在作业之外的更新有比较多,增加了“马赛克”功能(在“滤镜”中),可以很方便地对整张图片进行打码操作,至于局部打码操作可能会在之后的更新中实现,请耐心等候。 然后还更换了鼠标图案,使大家更容易知道鼠标是否已经处于图片区域中,鼠标图案是片很漂亮的叶子哦(出自KEY的AIR)。 这次更新还增加了瞬时更新鼠标所指像素点的RGB颜色值,横纵坐标,还有当前鼠标所指的颜色的显示。 在之前的版本中,如果想要获得鼠标所指的像素点的像素信息,只能通过鼠标的右键点击,这样有时候会不太方便,而现在的话在主界面就已经可以瞬时看到了,而且清晰明了简单易用。 然后还修复了模糊与中值函数的内存泄漏BUG,相信之后还会有更多的BUG等着来修复- -。 然后本次最大的更新就是!!!本软件支持Jpg格式了!师姐可以试下用这个软件打嘅Jpg格式的图片哦!这个更新简直太人性化了,以后做图像处理终于不用每次都要打开PS把Jpg转换为Bmp再操作了! 最后,再次谢谢师姐能够读完这个文档,如果还有什么问题的话就联系我吧,联系方式就在软件中了欢迎点击- -,谢谢! ================================================================================================================================================================ 2014年4月8日更新说明: 这次更新的是DTF跟FFT这两个功能,DFT的函数在Bmp.cpp的DFT里面,在里面已经加上了注释了。 而FFT在fft12_ifft12.cpp这个文件里面,文件包括了一维FFT和二维FFT的函数,当然IFFT也是存在的。 关于DFT的部分,由于我在DFT的算法里面使用了Complex类与COMPLEX结构体(类包含了运算符的重载与一些常用函数),毕竟C语言并没有专用的复数运算可以调用。 所以在进行DFT运算时会不断调用类的构造函数与析构函数,这导致了进行DFT运算使用的时间比Matlab写出来的要慢很多。 虽然处理起来时间比较长,但是相比FFT的优势是可以对非2的幂数的大小的图片进行傅里叶变换,而非2幂数的FFT的话如果进行补0再运算的话会导致算出的频域是错误的频域(毕竟随意加0会直接影响到这个图片)。 然后为了加快DFT的运算,这里我使用的方法是将复数因子(e的多少次方的那个)分成横向与纵向的乘积,先算出w_h0跟w_w0,之后的其他任何一个因子其实都是他们的幂相乘。 利用这个方法先把因子算好,这样就不用在每一步都计算sin跟cos的值,使到时间变快了很多。 虽然如此,计算一幅256*256的图使用I5CPU都得需要10秒钟,所以这种算法只能将着用,因此我也懒得写IDFT了- -。 所以为了偷懒我的IDFT直接调用了IFFT的函数,也就是说,对于不是2的幂数的图片,你可以进行DFT,但是不能变回来- -。 关于FFT的部分,其速度比Matlab的FFT算法快了不是一般的多,所以在之后的滤波处理中都使用了FFT。 但是FFT的缺点是在进行FFT运算前你必须要把图片大小转成2的幂数(我的软件自带缩放哦~),当然不一定要宽高相等,256*1024也是可以的。 关于这一点我在以后可能会使用因子法来进行FFT而不用现在的radio2法,这样的话可以对非2幂数的图片进行FFT了。 不过由于时间关系,现在的程序依然只能对2的幂数的大小进行FFT,这个非常抱歉。 关于幅值与角度的显示,在FFT滤波选项中可以查看到,当然查看角度的图片并没有什么意义就是了- -。 然后无论是8位图,24位图还是32位图,DFT跟DDT都完美支持! 然后就是那个FFT滤波的对话框,这里只写出了一个雏形(毕竟这几天清明节没有时间去写,求原谅- -),其实只能看看有什么功能而已,实现的函数其实还没有写的- -。 不过这次的作业并没有要求需要写FFT之后的滤波,所以也不算没有完成作业? 最后,无论是DFT还是FFT全都是自己一个代码一个代码写上去- -,研究傅里叶变换还把信号与系统的书都拿出来了,所以这次的作业真的好辛苦啊! 所以虽然功能尚未完善,但是请体谅!最后,再次谢谢师姐能够读完这个文档,如果还有什么问题的话就联系我吧,谢谢!(为了防止联系不到我,程序里面已经加入了“联系我”按钮了~) ================================================================================================================================================================ 2014年3月31日更新说明: 鉴于上个版本的软件功能还没有完整,而且内存存在泄漏的BUG会导致长时间使用时消耗内存过大。 所以这个版本将完善了很多功能,以及优化了内存问题,基本可以实现长时间使用了嗯嗯~撒花~~~~ 首先,程序的基本操作没有变化,基本都是右键操作,这次增加了重新读取图片功能,可以很方便地对图片进行还原处理。 然后,这次的作业是直方图与滤波器的操作,这些操作可以在直方图的选项与滤波器的选项中选择。 【色调均化】直方图的操作包括色调均化(我用了半天时间终于把PS的色调均化搞懂了,原来PS的色调均化根本不需要转什么色彩空间哦!),色调均化采用的是PS的算法。 【直方图调整】除了色调均化外还有查看直方图功能,该功能可以查看图片各个颜色的直方图以及总颜色(RGB)的直方图,还可以对直方图进行拉伸变换以提高图片的对比度,具体操作只需要用鼠标在直方图上使用左键或右键移动即可。 【曲线】除此之外,还可以对直方图进行函数变化(曲线),我尽量模拟出了PS的曲线效果,但是技术有限- -,这里的曲线只允许一种颜色的函数出现10个折点,合计一共可以出现40个折点,但是基本觉得是够用得了,使用方法依然是很简单,用鼠标点击曲线某一点即可添加或者取消折点。 【平均】这次的作业还有一个就是滤波器的操作,同样在右键菜单中可以选择平均滤波的使用,具体用法很简单,这里就不说明了。 【中值】中值滤波和平均滤波的操作差不多,也不一一说明了。 【锐化】个人觉得除了拉普拉斯的锐化方式之外的锐化都很难看所以就只保留了这两种锐化方式了,将就着用把- -。 【自定义滤波器】为了能够灵活地使用滤波器,一个自定义滤波器的功能还是需要的,具体的功能就跟PS的差不多吧,不过这个功能有个缺点就是当你需要输入负数时,你需要先输入数字再在前面输入负号- -,输入分数时小数点必须快速输入(我设置了一个不太快的刷新- -),虽然现在已经找到解决办法,但是懒得改了就将就着用吧- -。 在实现函数方面,还是在Bmp.cpp与其头文件中,为了让师姐能够容易地找到各个函数的所在,我已经在函数的定义前加上它的中文功能了,相信应该很容易找到。 至于函数过程的注释,由于老师没有要求在作业中需要写出来,同时函数太多也不好写,所以就算了- -,其实算法部分的话要读懂并不那么困难的。 为了方便,我在这里还是把这次作业所需要的函数列出来把(全部函数都在Bmp.cpp中): void Bmp::SmoothAverage(int x,int y)//平均滤波 void Bmp::SmoothMedian(int x,int y)//中值滤波 void Bmp::FilterDefine(double filter[5][5],int divide,int move)//自定义滤波器 void Bmp::CurveFunction(int color,int curve[256])//实现图片的函数变换,就是曲线啦 int** Bmp::GetHistogram()//计算图片的直方图,非归一化直方图 void Bmp::HistogramEqualization()//色调均化,算法采用PS的算法 void Bmp::Histogram(int Color,int Min,int Max)//直方图函数处理,就是直方图拉伸啦 以上就是这次作业的内容啦,为了方便,我还加入了 图像缩放 彩色转灰度 阈值 等功能,基本上这个程序已经越来越完善了,接下来就是慢慢添加功能以及修改细节啦。 最后,再次谢谢师姐能够读完这个文档,如果还有什么问题的话就联系我吧,谢谢! ================================================================================================================================================================ 因为本人的兴趣,我把这次作业做的比较复杂,功能比较多,所以您在找打开保存等函数的时候可能会有点麻烦,所以在这里放一个说明文档。 首先,本程序生成的exe应用程序在Realse目录下,那个有个很漂亮的宝石图标的程序就是了! 打开程序后,您可以使用打开按钮来打开图片,也可以直接把图片用鼠标直接拖入程序中打开(个人推荐第二种,毕竟方便)。 这个程序是支持8位图24位图32位图的哦! 打开后可以使用保存按钮保存图片,使用存为文本来保存为文本文档,我的程序会把图片以颜色层数为依据来保存文本文档。 如果您想使用我加入的其他功能,可以对着图片按右键,在弹出的菜单中选中你想要的功能就是了,但是锐化功能还没写(因为时间不够- -),其他的功能可以将就用下。 如果您想要找到这个程序的cpp文件,他在这个文件夹的同名文件夹下(MFC读取显示与保存BMP图像\MFC读取显示与保存BMP图像\Bmp.cpp(.h))。 因为我把与图像有关的操作封装成一个类(C++的),用以与其他的窗口类分来容易编写。 而与本次作业有关的函数有Open(),Save(),SaveAsTxt(),三个,在Bmp.cpp中都可以找到,并且都已经注释了,您可以去那里查找观看。 当然除了这些之外,我还写了其他一些函数如反色反转滤波器等,但是没有注释(因为太懒),师姐(兄)有兴趣的话也可以去看看,当然也可以直接去程序那里看效果。 最后如果师姐(兄)有什么看不懂或者找不到函数在哪的话可以联系我帮你找(毕竟我也觉得文件写得有点长而且复杂),我的手机号码是15800037916(666542)。 谢谢师姐(兄)看完!
MATLAB是一种非常强大的科学计算和编程语言,同时也是一个功能强大的图像处理工具。MATLAB提供了许多强大的函数来处理和操作图像,其中之一是直方图处理直方图是一种用于表示图像中像素强度分布的工具。通过绘制图像中不同强度级别的像素数量,我们可以更好地了解图像中的明暗变化。在MATLAB中,绘制一幅图像的直方图非常简单。 我们可以使用MATLAB提供的imhist函数来计算和绘制直方图。该函数需要一个图像作为输入,并返回图像的直方图。我们可以使用bar函数将返回的直方图数据绘制成一个柱状图。 以下是一个简单的代码示例,演示了如何使用MATLAB绘制图像的直方图: % 读取图像 img = imread('image.jpg'); % 计算直方图 histogram = imhist(img); % 绘制直方图 bar(histogram); 上述代码中,首先使用imread函数读取一幅图像,并将其存储在一个变量img中。然后,使用imhist函数计算图像的直方图,将返回的直方图数据存储在histogram变量中。最后,使用bar函数将直方图数据绘制成一个柱状图,显示图像中不同强度级别的像素数量。 通过使用类似的方法,我们可以对图像进行直方图均衡化、直方图匹配等进一步操作。MATLAB还提供了许多其他的图像处理函数,可以帮助我们更好地理解和处理图像的直方图。这些功能使得MATLAB成为处理图像的理想工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值