数字图像处理作业 直方图均衡
数字图像处理实验报告直方图均衡化
数字图像处理实验报告实验名称:直方图均衡化姓名:班级:学号:专业:电子信息工程(2+2)指导教师:陈华华实验日期:2012年5月24日直方图均衡化图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。
直方图均衡化是最常见的间接对比度增强方法。
直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
缺点:1)变换后图像的灰度级减少,某些细节消失;2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。
通过这种方法,亮度可以更好地在直方图上分布。
这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。
设原始图像在(x,y)处的灰度为f,而改变后的图像为g,则对图像增强的方法可表述为将在(x,y)处的灰度f映射为g。
在灰度直方图均衡化处理中对图像的映射函数可定义为:g = EQ (f),这个映射函数EQ(f)必须满足两个条件(其中L为图像的灰度级数):(1)EQ(f)在0≤f≤L-1范围内是一个单值单增函数。
这是为了保证增强处理没有打乱原始图像的灰度排列次序,原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列。
(2)对于0≤f≤L-1有0≤g≤L-1,这个条件保证了变换前后灰度值动态范围的一致性。
数字图像处理第四章作业
第四章图像增强1.简述直方图均衡化处理的原理和目的。
拍摄一幅较暗的图像,用直方图均衡化方法处理,分析结果。
原理:直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
也就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
把给定图像的直方图分布改变成“均匀”分布直方图分布目的:直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
它通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。
通过直方图均衡化,亮度可以更好地在直方图上分布。
这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
Matlab程序如下:clc;RGB=imread('wxf.jpg'); %输入彩色图像,得到三维数组R=RGB(:,:,1); %分别取三维数组的一维,得到红绿蓝三个分量G=RGB(:,:,2); %为R G B。
B=RGB(:,:,3);figure(1)imshow(RGB); %绘制各分量的图像及其直方图title('原始真彩色图像');figure(2)subplot(3,2,1),imshow(R);title('真彩色图像的红色分量');subplot(3,2,2), imhist(R);title('真彩色图像的红色分量直方图');subplot(3,2,3),imshow(G);title('真彩色图像的绿色分量');subplot(3,2,4), imhist(G);title(' 的绿色分量直方图');subplot(3,2,5),imshow(B);title('真彩色图像的蓝色分量');subplot(3,2,6), imhist(B);title('真彩色图像的蓝色分量直方图');r=histeq(R); %对个分量直方图均衡化,得到个分量均衡化图像g=histeq(G);b=histeq(B);figure(3),subplot(3,2,1),imshow(r);title('红色分量均衡化后图像');subplot(3,2,2), imhist(r);title('红色分量均衡化后图像直方图');subplot(3,2,3),imshow(g);title('绿色分量均衡化后图像');subplot(3,2,4), imhist(g);title('绿色分量均衡化后图像直方图');subplot(3,2,5), imshow(b);title('蓝色分量均衡化后图像');subplot(3,2,6), imhist(b);title('蓝色分量均衡化后图像直方图');figure(4), %通过均衡化后的图像还原输出原图像newimg = cat(3,r,g,b); %imshow(newimg,[]);title('均衡化后分量图像还原输出原图');程序运行结果:原始真彩色图像均衡化后分量图像还原输出原图图1.1 原始图像与均衡化后还原输出图像对比通过matlab仿真,由图1.1比较均衡化后的还原图像与输入原始真彩色图像,输出图像轮廓更清晰,亮度明显增强。
python数字图像处理实现直方图与均衡化
python数字图像处理实现直⽅图与均衡化在图像处理中,直⽅图是⾮常重要,也是⾮常有⽤的⼀个处理要素。
在skimage库中对直⽅图的处理,是放在exposure这个模块中。
1、计算直⽅图函数:skimage.exposure.histogram(image,nbins=256)在numpy包中,也提供了⼀个计算直⽅图的函数histogram(),两者⼤同⼩义。
返回⼀个tuple(hist, bins_center), 前⼀个数组是直⽅图的统计量,后⼀个数组是每个bin的中间值import numpy as npfrom skimage import exposure,dataimage =data.camera()*1.0hist1=np.histogram(image, bins=2) #⽤numpy包计算直⽅图hist2=exposure.histogram(image, nbins=2) #⽤skimage计算直⽅图print(hist1)print(hist2)输出:(array([107432, 154712], dtype=int64), array([ 0. , 127.5, 255. ]))(array([107432, 154712], dtype=int64), array([ 63.75, 191.25]))分成两个bin,每个bin的统计量是⼀样的,但numpy返回的是每个bin的两端的范围值,⽽skimage返回的是每个bin的中间值2、绘制直⽅图绘图都可以调⽤matplotlib.pyplot库来进⾏,其中的hist函数可以直接绘制直⽅图。
调⽤⽅式:复制代码代码如下:n, bins, patches = plt.hist(arr, bins=10, normed=0, facecolor='black', edgecolor='black',alpha=1,histtype='bar')hist的参数⾮常多,但常⽤的就这六个,只有第⼀个是必须的,后⾯四个可选arr: 需要计算直⽅图的⼀维数组bins: 直⽅图的柱数,可选项,默认为10normed: 是否将得到的直⽅图向量归⼀化。
数字图像处理3-直方图均衡,直方图匹配,空间滤波相关等
Timg(原图) im_1(MATLAB均衡处理) im_2(ps均衡处理)原图的rgb直方图r通道直方图(原图)g通道直方图(原图)b通道直方图(原图)r通道直方图(im_1)g通道直方图(im_1)b通道直方图(im_1)r通道直方图(im_2)g通道直方图(im_2)b通道直方图(im_2)这里找到了一张对比度较低的图像timg,其原本的对比度很低。
之后分别用MATLAB和ps对其进行了直方图均衡,生成了im_1与im_2,可见其处理的效果是有区别的。
MATLAB处理的结果色彩更加艳丽但是相对于原图来说其每个区域的颜色和旁边的区域颜色差别会很巨大,就是使得边界更明显,同时对比度提高了很多。
而ps处理的结果可以看出新的直方图和原直方图相比产生了很多形状上的差别,可见ps的直方图均衡采用了更为复杂的算法。
同时图像对比度以及颜色艳丽的程度得到了提升,但是没有MATLAB处理的效果明显,保持了原图的色调以及部分颜色关系。
Ps中直方图均衡可以一键实现,因此在此不做重点描写,我们来看如何用MATLAB实现这种操作。
MATLAB代码如下:主程序:im=imread('timg.jpg');im_r=change(im(:,:,1));im_g=change(im(:,:,2));im_b=change(im(:,:,3));im1(:,:,1)=im_r;im1(:,:,2)=im_g;im1(:,:,3)=im_b;figure;imshow(im1);imwrite(im1,'im1.jpg');Change函数:function [n] = change(m)n=m;sum=0;for i=0:255for j=1:407for k=1:500if(m(j,k)==i)sum=sum+1;endendendchan=sum/(407*500);chan1=fix(chan*255+0.5);for j=1:407for k=1:500if(m(j,k)==i)n(j,k)=chan1;endendendend[x,xout] = hist(n(:), 0:255);figure;bar(xout, x); xlim([0 255]);MATLAB其实本身有实现直方图均衡效果的函数,这里为了理解算法自己做了这个函数。
数字图像处理 实验 直方图均衡化实现图像增强
XXXXXXXX大学(数字图形处理)实验报告实验名称直方图均衡化实现图像增强实验时间年月日专业姓名学号预习操作座位号教师签名总评一、实验目的:掌握直方图均衡化的原理。
掌握直方图均衡化实现图像增强的实现方法。
二、实验原理:直方图是统计像数统计图,如设一张灰度图或一个通道,值0~255。
直方图如果按。
255个区分的话。
统计出来的就是,值为。
0的有几个像数,值为1的有机个像数,这样的一张表。
那么均衡化的意思就是。
这样表要均衡。
不直不于。
0有上万个像数,1只有1 个。
正常,直方图本身可以用小于255个区。
比如10个,那么这样相对图中的点就有一个映射,这时值0-9统计落在第一个区,值为10-19落第二个区。
这样的结果就会出来,10个区,10个统计数区。
这时。
你均衡就是让10区的统计数据都不会差很多。
表现出来的就是一张图上的颜色分布相对均衡。
总的来说直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数的过程。
三、实验内容:利用直方图均衡化实现图像增强。
在资源编辑器中,在主菜单下添加一名为“直方图均衡化”的菜单步骤如前面实验。
实验代码如下:if(m_DibHead->biBitCount!=8){MessageBox("当前版本仅支持256色位图的操作!","系统提示!",MB_ICONINFORMA TION|MB_OK);return;}zftjh(m_Image,m_DibHead->biWidth,m_DibHead->biHeight);Invalidate();其中函数zftjh的实现代码如下:zftjh(unsigned char *lpDib,long lWidth,long lHeight){unsigned char *lpsrc;long lresult(0);long i,j;unsigned char bMap[256];long lCount[256];for(i=0;i<256;i++)lCount[i]=0;for(i=0;i<lHeight;i++)for(j=0;j<lWidth;j++){lpsrc=lpDib+i*lWidth+j;lCount[*lpsrc]++;}for(i=0;i<256;i++){lresult=0;for(j=0;j<=i;j++)lresult+=lCount[j];bMap[i]=(lresult*255)/lHeight/lWidth;}for(i=0;i<lHeight;i++)for(j=0;j<lWidth;j++){lpsrc=lpDib+i*lWidth+j;*lpsrc=bMap[*lpsrc];}}原图为下图的左边部分,均值化以后的图为右边的部分:。
【数字图像处理】直方图的均衡与规定化
【数字图像处理】直⽅图的均衡与规定化很多情况下,图像的灰度级集中在较窄的区间,引起图像细节模糊。
通过直⽅图处理可以明晰图像细节,突出⽬标物体,改善亮度⽐例关系,增强图像对⽐度。
直⽅图处理基于概率论。
直⽅图处理通常包括直⽅图均衡化和直⽅图规定化。
直⽅图均衡化可实现图像的⾃动增强,但效果不易控制,得到的是全局增强的结果。
直⽅图规定化可实现图像的有选择增强,只要给定规定的直⽅图,即可实现特定增强的效果。
直⽅图均衡化直⽅图均衡化借助灰度统计直⽅图和灰度累积直⽅图来进⾏。
灰度统计直⽅图灰度统计直⽅图反映了图像中不同灰度级出现的统计情况。
灰度统计直⽅图是⼀个⼀维离散函数,可表⽰为h (k )=n k ,k =0,1,...L −1,其中k 为某个灰度级,L 为灰度级的数量,最⼤取256,n k 为具有第k 级灰度值的像素的数⽬。
灰度直⽅图归⼀化概率灰度统计直⽅图的归⼀化概率表达形式给出了对s k 出现概率的⼀个估计,可表⽰为p s (s k )=n k /N ,k =0,1,2..,L −1式中,k 为某个灰度级;L 为灰度级的数量,最⼤取256;s k 为第k 级灰度值的归⼀化表达形式,s k =k /255,故s k ∈[0,1];n k 为具有第k 级灰度值的像素的数⽬;N 为图像中像素的总数,故(n k /N )∈[0,1]。
灰度累计直⽅图灰度累积直⽅图反映了图像中灰度级⼩于或等于某值的像素的个数。
灰度累积直⽅图是⼀个⼀维离散函数,可表⽰为H (k )=k ∑i =0n i ,k =0,1,2..,L −1式中,k 为某个灰度级;L 为灰度级的数量,最⼤取256;n i 为具有第i 级灰度值的像素的数⽬。
累积分布函数可以表⽰为:t k =k ∑i =0p s (s i )相对的,灰度累积直⽅图的归⼀化表⽰如下图:Processing math: 100%原理步骤直⽅图均衡化主要⽤于增强动态范围偏⼩的图像的反差。
数字图像处理灰度化直方图均衡化灰度拉伸
数字图像处理与模式识别实验目的打开一幅图像,进行直方图均衡化。
并将其灰度线性变化,将灰度线性拉伸。
实验准备实验之前,收集数字图像处理编程的相关资料,查阅C或Java关于本实验图像处理的相关类库和编程核心。
经过C和Java相关资料编程的比较,Java将图像处理的类封装的较完整,运用起来比C灵活方便。
以下是相关类库和实现操作的方法:import java.awt.image.*;import javax.imageio.*; //相关的图像处理类库和方法封装在两个包中//Java读取图像的方法BufferedImage newImage = ImageIO.read(new File(filePath));int width = newImage.getWidth(); //获得图像的像素宽度int height = newImage.getHeight(); //获得图像像素的长度//获得图像的色彩模型RGB分量ColorModel colorModel = ColorModel.getRGBdefault();int r = colorModel.getRed(currPixArray[k]);int g = colorModel.getGreen(currPixArray[k]);int b = colorModel.getBlue(currPixArray[k]); //分别获得图像的rgb分量PixelGrabber p = new PixelGrabber(image, 0, 0, width, height, array, 0, width); //将image图像像素值读入一位矩阵实验步骤算法实现RGB图像转灰度图由于数字图像的直方图均衡化和灰度的线性拉伸都是基于灰度图的算法实现,本框架中增加了由彩色图转灰度图的功能。
简单讲述下算法思想:将存储图像的一维矩阵像素点彩色分量用ColorModel类中的getRed(),getGreen()和getBlue()方法读取,按照(r * 0.3 + g * 0.59 + b * 0.11)公式计算灰度值。
数字图像处理中的直方图均衡化使用注意事项
数字图像处理中的直方图均衡化使用注意事项直方图均衡化是一种通过分布调整来改善图像对比度的方法。
它通过重新分布图像的像素值以增强其视觉效果。
在数字图像处理中,直方图均衡化是一项常用的技术,但在使用过程中需要注意以下几个方面。
首先,直方图均衡化可能会导致图像细节丢失的问题。
因为直方图均衡化会根据像素值的分布进行调整,从而扩展像素值的范围,使得亮度范围更广。
但这也可能导致低对比度区域的细节消失,从而影响图像细节。
因此,在进行直方图均衡化时,应该密切关注图像的细节信息,尽量避免过度调整图像的对比度。
其次,直方图均衡化可能引起噪声的增加。
在直方图均衡化的过程中,图像的亮度分布被调整,可能会增加图像的噪声。
这是因为噪声通常与图像的低亮度区域有关,当低亮度区域被调整时,噪声也可能被放大。
为了减少噪声的影响,可以在均衡化之前对图像进行去噪处理,或者采用自适应的直方图均衡化方法,以避免过度增加图像噪声。
另外,直方图均衡化也可能导致图像的颜色失真问题。
因为直方图均衡化是基于像素值的灰度分布进行调整,对彩色图像来说,它可能会改变图像的颜色分布,从而造成颜色失真。
为了避免这种情况,可以在进行直方图均衡化前将图像转换为HSV颜色空间,并只对亮度(Value)通道进行均衡化,这样可以避免颜色的偏移。
此外,直方图均衡化的效果可能受到图像的动态范围限制。
在某些情况下,图像的动态范围可能不足以支持完整的直方图均衡化。
比如,当图像的某些区域非常亮或非常暗时,直方图可能会在动态范围两端产生剧烈的波动,从而导致图像的细节丢失或噪声增加。
为了解决这个问题,可以采用自适应的直方图均衡化方法,以根据图像的局部动态范围来进行调整,减少对整体图像的影响。
最后,直方图均衡化的选择需要根据具体的应用需求来确定。
直方图均衡化可以改善图像的对比度,使图像更加清晰和易于处理。
但对于一些特定的图像处理任务,如目标检测、图像识别等,直方图均衡化可能并不适用。
图像处理:数字图像的灰度直方图均衡化
图像处理:数字图像的灰度直方图均衡化简介在数字图像处理中,灰度直方图均衡化是一种常用的图像增强技术。
它通过重新分配图像中各个灰度级的像素值,使得最终的灰度直方图呈现出更均匀分布的特点,从而提高图像的对比度和视觉效果。
原理灰度直方图是描述一幅图像中每个灰度级出现频次的统计直方图。
在灰度直方图均衡化过程中,首先需要计算原始图像的累积概率密度函数(CDF),然后利用CDF进行线性变换将原始像素值映射到新的像素值上。
这个线性变换可以通过以下公式表示:G' = (G_max - G_min) \times CDF(G) + G_min其中G'是新的像素值,G是原始的像素值,G_max和G_min分别为像素值范围最大和最小值,而CDF(G)则是原始图像中小于或等于G的累积概率密度函数。
实现步骤1.读取待处理的数字图像。
2.将彩色或多通道图转化为灰度图。
3.计算原始灰度图像的像素值的频次统计,得到原始灰度直方图。
4.计算原始灰度直方图的累积概率密度函数。
5.根据累积概率密度函数进行线性变换,将原始像素值映射到新的像素值上。
6.生成处理后得到的均衡化后的图像。
7.输出均衡化后的图像。
应用场景灰度直方图均衡化在许多领域都有广泛应用,例如医学影像分析、计算机视觉和数字摄影等。
其主要作用是增强图像对比度、改善细节和提升视觉效果。
同时,该技术也能够在一些特定场景下帮助识别和检测对象。
总结通过使用灰度直方图均衡化技术,可以使得数字图像中各个灰度级的像素值更加均匀分布,从而提高图像对比度和视觉效果。
这种方法在数字图像处理中具有广泛的应用,并且简单易实现。
然而,需要注意的是,在某些特定情况下,采用该方法可能会产生过度增强或引入噪声等问题,因此在实际应用中需要谨慎使用并结合其他处理方法进行综合处理。
数字图像处理实验二(直方图均衡化)
数字图像处理实验二直方图均衡化(直方图均衡化实质上是减少图象的灰度级以换取对比度的加大)例如:假设原图的灰度分布级为126(最大为256,也就是从0到255的级上的灰度都有或多或少的出现),经过直方图均衡化后,灰度分布级别将会小于126。
编程的时候请按照直方图均衡化公式进行。
下面给出大致的编程思路和源代码:其中黑框部分需要自己编写源代码1)利用第一次实验课提供的dhc.h 和dhc.c文件以获取位图的高宽以及从文件头到实际的位图数据的偏移字节数,从而实现对位图实际数据的操作。
利用include命令#include <stdio.h>#include <stdlib.h>#include <memory.h>#include "hdr.h"思考问题:#include <*.h> 和#include "*.h"在程序运行中有什么差别?2)定义结构指针struct bmphdr *hdr;定义用于直方图变量unsigned char *bitmap, new_color[256];定义计算灰度分布,灰度累计分布的数组int count[256], acum[256];3)main()函数编写//定义整数i,j 用于函数循环时的,nr_pixels为图像中像素的个数int i, j, nr_pixels;//定义两个文件指针分别用于提取原图像的数据和生成直方图均衡化后的图像FILE *fp, *fpnew;//定义主函数的参数包括:输入的位图文件名和输出的位图文件名,此处内容可以不要,在DOS下执行命令的时候再临时输入也可,为了方便演示,我这里直接把函数的参数确定了。
argc=3;argv[1]="test.bmp";argv[2]="testzf.bmp";//参数输入出错显示if (argc != 3) {printf("please input the name of input and out bitmap files\n");exit(1);}// 获取位图文件相关信息hdr = get_header(argv[1]);if (!hdr) exit(1);//以二进制可读方式打开输入位图文件fp = fopen(argv[1], "rb");if (!fp) {printf("File open error!\n");exit(1);}// 文件指针指向数据区域fseek(fp, hdr->offset, SEEK_SET);//计算位图像素的个数nr_pixels = hdr->width * hdr->height;bitmap = malloc(nr_pixels);//读取位图数据到bitmap中fread(bitmap, nr_pixels, 1, fp);fclose(fp);memset(count, 0, sizeof(count));//计算每个灰度级上像素的个数结果存入count[]数组中memcpy(acum, count, sizeof(acum));//计算灰度的累计分布for (i = 1; i < 256; i++)acum[i] += acum[i-1];//灰度直方图的均衡化(核心程序部分,请仔细分析)为了方便大家编程实现,这里直接给出了源代码,本实验最核心的部分就在这里//}//对所有的像素灰度值按照均衡化得到的灰度对应规则进行转换,结果存入bitmap[]中//fpnew = fopen(argv[2], "wb+");//由于位图文件的头部信息并没有因直方图均衡化而改变,因此输出图像的头部信息从原位图文件中拷贝即可:fwrite(hdr->signature, 2, 1, fpnew);fwrite(&hdr->size, 4, 1, fpnew);fwrite(hdr->reserved, 4, 1, fpnew);fwrite(&hdr->offset, 4, 1, fpnew);fwrite(&hdr->hdr_size, 4, 1, fpnew);fwrite(&hdr->width, 4, 1, fpnew);fwrite(&hdr->height, 4, 1, fpnew);fwrite(&hdr->nr_planes, 2, 1, fpnew);fwrite(&hdr->bits_per_pixel, 2, 1, fpnew);fwrite(&hdr->compress_type, 4, 1, fpnew);fwrite(&hdr->data_size, 4, 1, fpnew);fwrite(&hdr->resol_hori, 4, 1, fpnew);fwrite(&hdr->resol_vert, 4, 1, fpnew);fwrite(&hdr->nr_colors, 4, 1, fpnew);fwrite(&hdr->important_color, 4, 1, fpnew);if (hdr->offset > 54)fwrite(hdr->info, (hdr->offset - 54), 1, fpnew);////关闭fclose(fpnew);//释放内存(优化程序必需)free(hdr);free(bitmap);return 0;}。
数字图像处理实验报告 直方图均衡化
课程设计课程名称数字图像处理题目名称直方图均衡化学生学院信息工程学院专业班级 10级电信2班学号学生姓名指导教师曹江中2013年 1 月日设计题目:直方图均衡化1、直方图的理论基础:(1)直方图概念:灰度直方图表示图像中每种灰度出现的频率。
(2)直方图的作用: 反映一幅图像的灰度分布特性(3)直方图的计算: 式中:n k 为图像中出现r k 级灰度的像素数,n 是图像像素总数,而n k /n 即为频数。
2、设计目的: 产生一幅灰度级分布具有均匀概率密度的图像,扩展像素取值的动态范围,达到了图象增强的目的。
3、直方图均衡化的效果 :1)变换后直方图趋向平坦,灰级减少,灰度合并。
2)原始象含有象素数多的几个灰级间隔被拉大了,压缩的只是象素数少的几个灰度级,实际视觉能够接收的信息量大大地增强了,增加了图象的反差。
同时,也增加了图象的可视粒度。
4、离散情况下的直方图均衡化的算法:A 、列出原始图像的灰度级B 、统计各灰度级的像素数目C 、计算原始图像直方图各灰度级的频数D 、计算累积分布函数F 、应用以下公式计算映射后的输出图像的灰度级,P 为输出图像灰度级的个数,其中INT 为取整符号:G 、用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像。
5、主要代码///////////////////////////////////////////////////////////////////画两个直方图坐标轴/////////////////////////////////////////////////////////////////// void CImageView::OnDraw(CDC* pDC){1,,1,0,-=L j f j 1,,1,0,-=L j n j 1,,1,0,/)(-==L j n n f P j j f 1,,,1,0,)()(0-==∑=L k j f P f C k j j f ]5.0)()[(min min max ++-=g f C g g INT g i nn r p k k =)(1,,2,1,010-=≤≤l k r kCImageDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereif(m_dib.m_bLoaded==true) //判断是否加载图像{//获取图像宽和高int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight(); ASSERT_VALID(pDoc);// TODO: add draw code for native data hereif(m_dib.m_bLoaded==true){int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();m_dib.ShowDIB(pDC,10,10,nw,nh,m_dib.m_pDIBData,m_dib.m_pBMI);m_dib.ShowDIB(pDC,400,10,nw,nh,m_dib.m_pDumpDIBData,m_dib.m_pBMI) ;}if(m_bHist==true){//绘画直方图CString str;int nh=m_dib.GetDIBHeight();int i;// 绘制坐标轴pDC->MoveTo(10,nh+20); //(10,nh+20 )是直方图的左上角坐标// 垂直轴pDC->LineTo(10,nh+200);//(10,nh+200 )是直方图的左下角坐标// 水平轴pDC->LineTo(310,nh+200);//(310,nh+200 )是直方图的右下角坐标// 写X轴刻度值str.Format("0");pDC->TextOut(10, nh+200+10, str);str.Format("50");pDC->TextOut(60, nh+200+10, str);str.Format("100");pDC->TextOut(110, nh+200+10, str);str.Format("150");pDC->TextOut(160, nh+200+10, str);str.Format("200");pDC->TextOut(210, nh+200+10, str);str.Format("255");pDC->TextOut(265, nh+200+10, str);str.Format("原图直方图归一化");pDC->TextOut(100, nh+230+10, str);// 绘制X轴刻度for ( i = 0; i < 256; i += 25){if ((i & 1) == 0){// 10的倍数pDC->MoveTo(i + 10, nh+200-2);pDC->LineTo(i + 10, nh+200+2);}else{// 10的倍数pDC->MoveTo(i + 10, nh+200-2);pDC->LineTo(i + 10, nh+200+2);}}// 绘制X轴箭头pDC->MoveTo(305,nh+200-5);pDC->LineTo(310,nh+200);pDC->LineTo(305,nh+200+5);// 绘制y轴箭头pDC->MoveTo(10,nh+20);pDC->LineTo(5,nh+20+5);pDC->MoveTo(10,nh+20);pDC->LineTo(15,nh+20+5);int max=0;for(i=0;i<256;i++)if(m_yuantu[i]>max)max=m_yuantu[i];for(i=0;i<256;i++){pDC->MoveTo(10+i,nh+200);pDC->LineTo(10+i,nh+200-(m_yuantu[i]*160/max));}}/******************///TEST 第二个直方图if(m_bHist==true){//绘画直方图CString str;int nh=m_dib.GetDIBHeight();int i;// 绘制坐标轴pDC->MoveTo(160+nw,nh+20); //(10,nh+20 )是直方图的左上角坐标// 垂直轴pDC->LineTo(160+nw,nh+200);//(10,nh+200 )是直方图的左下角坐标// 水平轴pDC->LineTo(460+nw,nh+200);//(310,nh+200 )是直方图的右下角坐标// 写X轴刻度值str.Format("0");pDC->TextOut(415, nh+200+10, str);str.Format("50");pDC->TextOut(465, nh+200+10, str);str.Format("100");pDC->TextOut(515, nh+200+10, str);str.Format("150");pDC->TextOut(565, nh+200+10, str);str.Format("200");pDC->TextOut(615, nh+200+10, str);str.Format("255");pDC->TextOut(670, nh+200+10, str);str.Format("直方图均衡化后归一化");pDC->TextOut(505, nh+230+10, str);// 绘制X轴刻度for ( i = 0; i < 256; i += 25){if ((i & 1) == 0){// 10的倍数pDC->MoveTo(i + 420, nh+200-2);pDC->LineTo(i + 415, nh+200+2);}else{// 10的倍数pDC->MoveTo(i + 420, nh+200-2);pDC->LineTo(i + 420, nh+200+2);}}// 绘制X轴箭头pDC->MoveTo(710,nh+200-5);pDC->LineTo(715,nh+200);pDC->LineTo(710,nh+200+5);// 绘制y轴箭头pDC->MoveTo(415,nh+20);pDC->LineTo(410,nh+20+5);pDC->MoveTo(415,nh+20);pDC->LineTo(420,nh+20+5);int max=0;for(i=0;i<256;i++)if(m_hist[i]>max)max=m_hist[i];for(i=0;i<256;i++){pDC->MoveTo(415+i,nh+200);pDC->LineTo(415+i,nh+200-(m_hist[i]*160/max));}}/*************/// 显示图像(具体的参数见CDIB类的该函数说明)m_dib.ShowDIB(pDC,10,10,nw,nh,m_dib.m_pDIBData,m_dib.m_pBMI);m_dib.ShowDIB(pDC,400,10,nw,nh,m_dib.m_pDumpDIBData,m_dib.m_pBMI);}}/////////////////////////////////////////////////////////////////////直方图均衡化及直方图归一化坐标轴赋值程序///////////////////////////////////////////////////////////////////// void CImageView::OnZhifangtu(){//判断图像是否打开,没打开,则弹出提示框并退出函数if(!m_dib.m_bLoaded){AfxMessageBox("图像还打开,请先打开图像!");return;}//获取图像宽和高及定义成员变量int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();int i,j;int *arr=new int [nw*nh];int n[256]={0};float p[256]={0.0},c[256]={0.0};BYTE* pdata=m_dib.m_pdata;for(i=0;i<256;i++) //初始化直方图数组m_yuantu[i]=0;if(1)//m_dib.m_nImType==24){for(j=0;j<nh;j++)for(i=0;i<nw;i++){BYTE temp=pdata[j*nw+i];m_yuantu[temp]++;}}m_bHist=true;//直方图归一化计算for(i=0;i<nh;i++){for(j=0;j<nw;j++){n[m_dib.m_pdata[i*nw+j]]++;}}for(i=0;i<256;i++){(float)p[i]=(float)n[i]/(float)(nw*nh); }//归一化后累计计算for(i=0;i<256;i++){for(j=0;j<=i;j++){c[i]+=p[j];}}//找到灰度值最大值最小值int max=m_dib.m_pdata[0],min=m_dib.m_pdata[0]; for(i=0;i<nh;i++){for(j=0;j<nw;j++){if(max<m_dib.m_pdata[i*nw+j]){max=m_dib.m_pdata[i*nw+j];}else if(min>m_dib.m_pdata[i*nw+j]){min=m_dib.m_pdata[i*nw+j];}}}//套公式直方图均衡化计算赋值给arr[]一维数组for(i=0;i<nh;i++){for(j=0;j<nw;j++){arr[i*nw+j]=int(c[m_dib.m_pdata[i*nw+j]]*(max-min)+min+0.5); }}//一维数组arr[]赋值给新图像for( j=0;j<nh;j++){for(i=0;i<nw;i++){m_dib.m_pdata[j*nw+i]=arr[j*nw+i];}}//将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果m_dib.UpdateData();//刷新屏幕Invalidate();for(i=0;i<256;i++) //初始化直方图数组m_hist[i]=0;if(1)//m_dib.m_nImType==24){for(j=0;j<nh;j++)for(i=0;i<nw;i++){BYTE temp=pdata[j*nw+i];m_hist[temp]++;}}m_bHist=true;// TODO: Add your command handler code here}6、实验结果。
【数字图像处理】直方图均衡化
【数字图像处理】直⽅图均衡化全局直⽅图均衡化直⽅图均衡化通过调整图像的直⽅图来增强图像的对⽐度,经常使⽤在医学图像分析中。
例如⼀幅8*8图像像素值如下:对各个像素值进⾏计数:得到累计概率分布:其中均衡化后的像素值计算公式为:前⾯的标题全局直⽅图均衡化,代表着直⽅图在整个图像计算,这样会有⼀个缺点,图像的部分区域会显得过暗或者过亮。
这个时候就需要使⽤⾃适应直⽅图均衡化(Adaptive histogram equalization)。
⾃适应直⽅图均衡化,⾸先将图像分为⼏个部分,然后对每个部分分别计算直⽅图进⾏均衡化,同时对边缘像素进⾏插值处理。
由图中可以看出⾃适应直⽅图均衡化对⾼亮区域的处理要⽐常规的直⽅图均衡化好的多。
1import os2from PIL import Image3from skimage import exposure4import numpy as np5import matplotlib.pyplot as plt678 img = Image.open('/home/vincent/Pictures/work/Unequalized_Hawkes_Bay_NZ.jpg')9 img = np.array(img)10 img_eq = exposure.equalize_hist(img)11 img_adapteq = exposure.equalize_adapthist(img, clip_limit=0.04)1213 plt.figure(0)14 plt.imshow(img)15 plt.title('low contrast image')16 plt.figure(1)17 plt.imshow(img_eq)18 plt.title('high constrast image using normal histogram equalization')19 plt.figure(2)20 plt.imshow(img_adapteq)21 plt.title('high constract image using adaptive histogram euqalization')22 plt.show()。
数字图像处理实验一-直方图均衡化
实验一数字图像处理编程实习(设计性实验)一、实验名称:数字图像处理编程实验一之灰度直方图统计与均衡化。
二、实验目的和要求:本设计性实验专为印刷工程专业的《数字图像处理》课程设计。
熟悉Matlab与Visual C++编程环境,实现对输入图像进行灰度直方图均衡化处理。
通过本实验教学环节,可以使学生对图像文件格式、图像文件的读写、图像处理程序的基本结构、处理方式和编程基本方法有进一步的认识,获得对图像处理原理和编程方法的进一步认识。
实验的基本要求是:利用Matlab或Visual C++编程环境编制图像处理程序,对一幅灰度图像进行灰度直方图统计与均衡化处理。
三、实验基本内容:1.图像处理程序用户界面设计;2.灰度直方图统计与均衡化;四、实验设备及环境:1.计算机;2.Matlab与Visual C++编程环境。
五、实验原理:1、数字图像直方图均衡化处理原理:A)图像直方图统计:根据图像的灰度等级统计该灰度等级的象素个数;B)图像直方图均衡化:直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。
具体为:1)统计图像直方图;2)计算归一化的累计直方图;3)计算均衡后的直方图sk=int[(N-1)tk+0.5];4)根据均衡后的直方图将图像的每一个像素都映射到新的直方图上;六、实验具体要求:1.用户界面设计:用户界面可以自由设计,但应包括如下物件:窗体、菜单或命令按钮、图像显示框。
程序功能:图像像素行列数输入、打开图像、图像灰度直方图统计、图像灰度直方图均衡化、图像存储、退出。
七、对程序和实验报告的要求:1.将编制完成的Matlab或Visual C++程序作为附件交给实习老师;2.实验报告:所要求具有下列内容:图像处理程序编制的总体方案;程序用户界面的设计思路;图像处理算法;遇到的问题和解决过程;结果分析。
八、附件:附:实习示例程序:%《数字图像处理》课程实习%图像文件直方图统计显示实验程序by 武汉大学印刷与包装系易尧华I=imread('C:\Documents and Settings\hapxqpy\桌面\test-yy.bmp'); %将图像文件testimage.bmp的数据读入并赋值给变量I;figure(1); %新建用于图像显示的窗口;imshow(I); %在窗口中显示图像;figure(2); %新建用于图像直方图的窗口;imhist(I); %在窗口中显示图像直方图;J=histeq(I); %图像直方图均衡化处理;figure(3); %新建用于图像直方图的窗口;imshow(J); %在窗口中显示均衡化后的图像;figure(4); %新建用于显示均衡化后的图像直方图;imhist(J); %在窗口中显示均衡化后图像直方图;。
数字图像处理---直方图均衡化
数字图像处理---直⽅图均衡化直⽅图均衡化的英⽂名称是Histogram Equalization. 图像对⽐度增强的⽅法可以分成两类:⼀类是直接对⽐度增强⽅法;另⼀类是间接对⽐度增强⽅法。
直⽅图拉伸和直⽅图均衡化是两种最常见的间接对⽐度增强⽅法。
直⽅图拉伸是通过对⽐度拉伸对直⽅图进⾏调整,从⽽“扩⼤”前景和背景灰度的差别,以达到增强对⽐度的⽬的,这种⽅法可以利⽤线性或⾮线性的⽅法来实现;直⽅图均衡化则通过使⽤累积函数对灰度值进⾏“调整”以实现对⽐度的增强。
直⽅图均衡化处理的“中⼼思想”是把原始图像的灰度直⽅图从⽐较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直⽅图均衡化就是对图像进⾏⾮线性拉伸,重新分配图像像素值,使⼀定灰度范围内的像素数量⼤致相同。
直⽅图均衡化就是把给定图像的直⽅图分布改变成“均匀”分布直⽅图分布。
缺点: 1)变换后图像的灰度级减少,某些细节消失; 2)某些图像,如直⽅图有⾼峰,经处理后对⽐度不⾃然的过分增强。
直⽅图均衡化是图像处理领域中利⽤图像直⽅图对对⽐度进⾏调整的⽅法。
这种⽅法通常⽤来增加许多图像的局部对⽐度,尤其是当图像的有⽤数据的对⽐度相当接近的时候。
通过这种⽅法,亮度可以更好地在直⽅图上分布。
这样就可以⽤于增强局部的对⽐度⽽不影响整体的对⽐度,直⽅图均衡化通过有效地扩展常⽤的亮度来实现这种功能。
这种⽅法对于背景和前景都太亮或者太暗的图像⾮常有⽤,这种⽅法尤其是可以带来X光图像中更好的⾻骼结构显⽰以及曝光过度或者曝光不⾜照⽚中更好的细节。
这种⽅法的⼀个主要优势是它是⼀个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直⽅图,并且计算量也不⼤。
这种⽅法的⼀个缺点是它对处理的数据不加选择,它可能会增加背景杂讯的对⽐度并且降低有⽤信号的对⽐度。
1.连续灰度值r:待处理图像的灰度。
假设r的取值区间[0,L-1], r = 0表⽰⿊⾊,r = L - 1表⽰⽩⾊。
数字图像处理直方图均衡化PPT学习教案
第14页/共25页
四. 直方图均衡化
索引色图像的直方图
长 江 大 学 电 子信息 学院
第15页/共25页
四. 直方图均衡化
3.直方图均衡化MATLAB的实现
用stees.tif');
[c,x]=imhist(I); subplot(121);imshow(I); subplot(1,2,2),stem(x,c);
长 江 大 学 电 子信息 学院
第4页/共25页
三. 直方图的性质
(1) 它只反映该图像中不同灰度值出现的次数,而未 反映某一灰度值像素所在的位置。也就是说,它只包含 了该图像中某一灰度值的像素出现的概率,而丢失了其 所在位置的信息。
(2) 任一幅图像,都能唯一地确定出一幅与它对应的 直方图,但不同的图像,可能有相同的直方图。
会计学
1
一. 灰度级直方图的概念
1 灰度级直方图
灰度级的直方图是反应一幅图像中的灰度级与出现 这种灰度的概率之间的图形。
2 直方图的概念
设图像的灰度范围为[a,b],r为此灰度范围内 的任一灰度级,p(r)为这幅图像中灰度级为r的像 素出现的频率,可以看出p(r)是r的函数。该函数 的图形称为这幅图像的直方图。
长 江 大 学 电 子信息 学院
第18页/共25页
四. 直方图均衡化
3.直方图均衡化MATLAB的实现
调整图像的对比度,调整前后的图像见图
程序: clear all I=imread(‘C:\lena.bmp’); J=imadjust(I,[0.3 0.7],[ ]); subplot(221), imshow(I); subplot(222), imshow(J); subplot(223), imhist(I) subplot(224), imhist(J);
数字图像处理直方图均衡实验报告
数字图像报告班级:姓名:学号:一、直方图均衡:直方图均衡化也叫做直方图平坦化,是一种常用的灰度增强算法。
目的:曾强对比度目标:均匀分度原理:假设灰度级为归一化至范围[0,1]内的连续量,并令Pr (r)表示某给定图像中的灰度级的概率密度函数(PDF),其下标用来区分输入图像和输出图像的PDF。
假设我们对输入灰度级执行如下变换,得到(处理后的)输出灰度级s:S=T(r)=∫0r Pr(w)dw式中w 是积分的哑变量。
可以看出,输出灰度级的概率密度函数是均匀的,即a.当0≤s≤1 时,Ps(s)=1b.当s 为其他时,Ps(s)=0换言之,前述变换生成一幅图像,该图像的灰度级较为均衡化,且覆盖了整个范围[0,1]。
灰度级均衡化处理的最终结果是一幅扩展了动态范围的图像,它具有较高的对比度。
该变换函数只不过是一个累积分布函数(CDF)。
二、直方图均衡程序:clc主程序:picture=input('please input the filename:','s');fid=fopen(picture);dat=fread(fid);d=dat';B=reshape(d,256,256);h=length(d);newname=input('输入新的文件名:','s');zhi(h,newname,B,d);子程序:function y=zhi(h,newname,B,d)figure(1);imshow(uint8(B'));N=zeros(1,256);for i=0:255for j=1:hif i==d(j)N(i+1)=N(i+1)+1;endendendi=0:255;p=N/h;figure(2)stem(i,p,'.')title('原始直方图')m=zeros(1,256);for k=1:256if k==1m(k)=p(k);elsem(k)=m(k-1)+p(k);endendfor k=1:256r=round(m*255);ends=zeros(1,256);for a=1:256for b=1:256if r(a)==r(b)s(a)=N(a)+N(b);endendendq=s/h;for j=1:256k(j)=r(j);endfigure(3);stem(k,q,'.');title('均衡直方图');M=zeros(1,h);for i=1:hk=d(i);M(i)=r(k+1);endR=reshape(M,256,256);figure(4);imshow(uint8(R'));jht=fopen(newname,'wb');g=fwrite(jht,M);fclose('all');原图像原始直方图均衡直方图均衡后的图像:三、体会:通过本次设计,让我学会了从问题的高度来考虑设计的方方面面,对程序的设计和研究有了更深刻的体会;让我了解到程序的设计是建立在对理论知识了解的基础上的,特别是对直方图均衡化的原理要有较为详细的了解,此外对直方图均衡化算法也要进行了解;在编写程序时,进行模块化设计,以严谨的态度进行编程,避免出现低级错误。
数字图像处理之直方图均衡化
数字图像处理之直⽅图均衡化直⽅图均衡化是图像处理领域中利⽤图像直⽅图对对⽐度进⾏调整的⽅法。
直⽅图均衡化要达到的效果:基本思想:把原始图的直⽅图变换为均匀分布的形式,这样就增加了像素灰度值的动态范围,从⽽达到增强图像整体对⽐度的效果使⽤的⽅法是灰度级变换:s = T(r)原理:s=T(r) 0≤r≤1T(r)满⾜下列两个条件:(1)T(r)在区间0≤r≤1中为单值且单调递增(2)当0≤r≤1时,0≤T(r) ≤1条件(1)保证原图各灰度级在变换后仍保持从⿊到⽩(或从⽩到⿊)的排列次序条件(2)保证变换前后灰度值动态范围的⼀致性Pr(r)是r的概率密度函数,Ps(s)是s的概率密度函数,Pr(r)和T(r)已知,且T-1(s) 满⾜上述条件(1),所以有已知⼀种重要的变换函数:关于上限的定积分的导数就是该上限的积分值(莱布尼茨准则)对于离散值:其中r k 是第k个灰度级,k = 0,1,2,…,L-1. n k是图像中灰度级为r k的像素个数. n是图像中像素的总数.已知变换函数的离散形式为:sk称作直⽅图均衡化将输⼊图像中灰度级为rk(横坐标)的像素映射到输出图像中灰度级为sk (横坐标)的对应像素得到.实现代码:/******************************************************************************* 作⽤: 灰度均衡函数* 参数:* pixel 原始像素数组* tempPixel 保存变换后图像的像素数组* width 原始图像宽度******************************************************************************/void GrayEqualize(BYTE* pixel, BYTE* tempPixel, UINT width, UINT height){// 灰度映射表BYTE map[256];long lCounts[256];memset(lCounts, 0, sizeof(long) * 256);// 计算各灰度值个数for (UINT i = 0; i < width * height; i++){int x = pixel[i * 4];lCounts[x]++;}// 保存运算中的临时值long lTemp;for (int i = 0; i < 256; i++){lTemp = 0;for (int j = 0; j <= i; j++)lTemp += lCounts[j];map[i] = (BYTE)(lTemp * 255.0f / width / height);}// 变换后的值直接在映射表中查找for (UINT i = 0; i < width * height; i++){int x = pixel[i * 4];tempPixel[i*4] = tempPixel[i*4+1] = tempPixel[i*4+2] = pixel[i * 4]; tempPixel[i*4+3] = 255;}}View Code彩⾊图直⽅图均衡化:更清晰:opencv代码:////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>using namespace cv;using namespace std;int main( int argc, const char** argv ){Mat img = imread("MyPic.JPG", CV_LOAD_IMAGE_COLOR); //open and read the imageif (img.empty()) //if unsuccessful, exit the program{cout << "Image cannot be loaded..!!" << endl;return -1;}vector<Mat> channels;Mat img_hist_equalized;cvtColor(img, img_hist_equalized, CV_BGR2YCrCb); //change the color image from BGR to YCrCb formatsplit(img_hist_equalized,channels); //split the image into channelsequalizeHist(channels[0], channels[0]); //equalize histogram on the 1st channel (Y)merge(channels,img_hist_equalized); //merge 3 channels including the modified 1st channel into one imagecvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR); //change the color image from YCrCb to BGR format (to display image properly)//create windowsnamedWindow("Original Image", CV_WINDOW_AUTOSIZE);namedWindow("Histogram Equalized", CV_WINDOW_AUTOSIZE);//show the imageimshow("Original Image", img);imshow("Histogram Equalized", img_hist_equalized);waitKey(0); //wait for key pressdestroyAllWindows(); //destroy all open windowsreturn0;}View Code代码中使⽤的函数:New OpenCV functionscvtColor(img, img_hist_equalized, CV_BGR2YCrCb)This line converts the color space of BGR in 'img' to YCrCb color space and stores the resulting image in 'img_hist_equalized'.In the above example, I am going to equalize the histogram of color images. In this scenario, I have to equalize the histogram of the intensity component only, not the color components. So, BGR format cannot be used because its all three planes represent color components blue, green and red. So, I have to convert the original BGR color space to YCrCb color space because its 1st plane representsthe intensity of the image where as other planes represent the color components.void split(const Mat& m, vector<Mat>& mv )This function splits each channel of the 'm' multi-channel array into separate channels and stores them in a vector, referenced by 'mv'. Argument listconst Mat& m - Input multi-channel arrayvector<Mat>& mv - vector that stores the each channel of the input arrayequalizeHist(channels[0], channels[0]);Here we are only interested in the 1st channel (Y) because it represents the intensity information whereas other two channels (Cr and Cb) represent color components. So, we equalize the histogram of the 1st channel using OpenCV in-built function, 'equalizeHist(..)' and other two channels remain unchanged.void merge(const vector<Mat>& mv, OutputArray dst )This function does the reverse operation of the split function. It takes the vector of channels and create a single multi-channel array. Argument listconst vector<Mat>& mv - vector that holds several channels. All channels should have same size and same depthsOutputArray dst - stores the destination multi-channel arraycvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR)This line converts the image from YCrCb color space to BGR color space. It is essential to convert to BGR color space because 'imshow(..)' OpenCV function can only show images with that color space.This is the end of the explanation of new OpenCV functions, found in the above sample code. If you are not familiar with other OpenCV functions, please refer to the previous lessons.参考博客:http://opencv-srf.blogspot.jp/2013/08/histogram-equalization.html。
数字图像大作业直方图均衡化(精品)
数字图像大作业直方图均衡化(精品)数字图像处理作业数字图像处理作业测绘科学与技术学院测绘科学与技术学院测绘测绘0801班秦萌秦萌 0810020107班直方图均衡化假定有假定有64*64大小的图像,灰度为大小的图像,灰度为16级,概率分布如下表,试进行直方图均衡化,并画出处理前后的直方图。
理前后的直方图。
级,概率分布如下表,试进行直方图均衡化,并画出处rnkPr((rk))r0=08000.195r1=1/156500.160r2=2/15r3=3/15r4=4/15r5=5/15r6=6/15r7=7/15r77/15r8=8/156000. 1474300.1063000.0732300.0562000.04917017000410.0411500.037r9=9/151300.031r10=10/151100.027r11=11/15r12=12/15r13=13/15r14=14/15r15 =1960.023800.019700.017500.012300.007直方图的均衡化计算((1)求变换函数)求变换函数s计计::355.0160.0195.0rprprprTs195.0rprT10j)10jr11j)00jr00)()(()(()(计计s 类似地,计算出类似地,计算出s2计=0.786,,s7计s12计(2)计算)计算sk并;考虑输出图像灰度是等间隔的,且与原图像灰度范围16个等级,即要求sk=k/15,,k=0,1,2,…,,15.因而对因而对sk计计=0.502,,s8计计=0.981,,s3计计=0.864,s9计,s14计计=0.608,计=0.895,计=0.993,,s4计计=0.681,,s10计,s15计,s5计计=0.737,,s11计,s6计计=0.945,计计=0.827,,s13计计=0.922,,计=0.964,计=1.(并;考虑输出图像灰度是等间隔的,且与原图像灰度范围个等级,即要求计修正(采用四舍五入法),得到:修正(采用四舍五入法),得到:s0并=11/15,=14/15,并=3/15,,s1并,s6并,s11并并=5/15,并=12/15,并=14/15,,s2并,s7并,s12并并=8/15,并=12/15,并=14/15,,s3并,s8并,s13并并=9/15,并=13/15,并=1,,s4并,s9并,s14并并=10/15,并=13/15,并=1,,s15并,s5并,s10并并=1.并并(3)Sk的确定;的确定;由sk可知,输出图像的灰度级仅为可知,输出图像的灰度级仅为10个级别,它们是:S0=3/15,,s1=5/15,,s2=8/15,s6=12/15,,s7=13/15,,s8=14/15,(4)计算对应每个)计算对应每个sk的的nsk因为因为r0=0映射到映射到s0=3/15,所以有,所以有800个像素变成个像素变成s0=3/15。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作业3:直方图均衡
1.选取一张对比度不明显的彩色图像,编写MATLAB代码对RGB通道独立地进行直方图
均衡,同时用PHOTOSHOP软件对其进行均衡,比较两种处理方法在效果上的差异。
使用R/G/B=image(:,:,1/2/3);提取图像的三个通道,imshow(R);显示三个通道的图像,imhist(R);显示对应颜色分量的直方图,r=histeq(R);分别对三个通道进行直方图均衡化,equated = cat(3,r,g,b);联合RGB三个数组,得到均衡化后的图像。
原图与matlab直方图均衡化后的图像
原图的RGB分量
均衡后的RGB分量
在photoshop中处理图像后得到下图的结果。
Ps中得到的图像RGB通道独立直方图均衡得到的图像比较:选取的原图是逆光拍摄,颜色很暗,暗部细节很多。
经过matlab处理后,灰度级部分合并,灰度级较低的间隔变大,灰度级较高的间隔变小。
但对真彩色图像的直方图均衡化时,通过单纯地对RGB三个分量图像分别均衡、合并, 会使均衡后的图像出现轻微的色彩失真现象, 而且原图中灰度级较高的地方的细节部分缺失。
但是经过ps处理后的图像,原本灰度值较低的地方明显变亮,同时原本灰度值较高的地方仍然很好保留了,并没有出现matlab处理后的问题。
Ps处理后的图像色彩也很正常,没有出现失真的问题。
数字图像直方图的算法步骤:
①列出原始图像的灰度级f j,j=0,1,…,L-1,
②统计各灰度级的像素数目n j,j=0,1,…,L-1,
③计算原始图像直方图各灰度级的频数p(f j)= n j/N,j=0,1,…,L-1,
④计算累计分布函数C(j)=Σp(f k), j=0,1,…,L-1,
⑤g i= INT[(g max-g min)C(f)+g min+0.5]
2.阅读"Exact Hitogram Specification"这篇英文文献第二部分和第三部分,结合压缩包中
MATLAB源代码,理解精确直方图均衡的算法原理,重点是借助空间滤波实现像素排序的算法原理,用(1)中图片,比较精确直方图均衡和PHOTOSHOP均衡的效果差异。
精确直方图均衡的算法原理:由于数字图像是离散的,所以直方图均衡化后并不能产生具有理想均衡直方图的图像,而如果定义一种新的排序关系,在对像素进行排序时应用严格的排序就可以得到一个精确均衡的直方图。
步骤:
①f是离散N*M图像的灰度级,H是直方图;
②定义<一种严格排序;
③让像素按照这个顺序排序;
④在灰度级中从左到右将③中的排序分割,类似j组有hj个像素;
⑤对于j组里的所有像素,都设为j灰度级。
排序判定规则:
严格排序可以由一对一映射和一组整数构成,比如:O:[1,N]×[1,M]→[1,M×N],那么如果在整数集中按通常的排序O(x1,y1)>O(x2,y2),那么诱导排序f(x1,y1)>f(x2,y2)。
总共这些映射的数量是(MN)!,但它们中的大部分对于精确直方图均衡都是无用的。
为了得到一个有用的严格排序,诱导排序必须与正常排序一致,即在正常排序时,一个像素的灰度值大于另一个像素的灰度值,在新排序中也应该是这样的。
而且,新的排序应当细化正常排序,细化程度在一定程度上应与人类对亮度的感知相一致。
这种排序要考虑像素邻域。
在有些改善直方图均衡的方法中,会考虑水平和垂直方向4个相邻像素的灰度值,但是4个像素的平均灰度值并不能完全区分,所以在这里考虑每个像素周围的一片区域。
K是一个整数,w1,w2,…w k是关系为w1⊂w2⊂…⊂wk的集合。
对于每个像素f(x,y),m i(x,y)是f(x,y)在w i集合中灰度值的平均值。
M(x,y)表示k元组,考虑定义在k元组上的字典顺序。
当M(x1,y1)<M(x2,y2)时,f(x1,y1)<f(x2,y2)。
在这种排序下,如果一个像素的局部灰度均值远大于另一个像素的局部灰度均值,经过排序后它的亮度将会高于另一个像素。
通过k取不同值,调整直方图均衡的程度。
原图
Ps处理后精确直方图均衡化后
比较:精确直方图均衡后的图像不仅在灰度值低的部分提高了亮度,灰度级经过严格排序后变得非常平均。
图像的对比度也增强很多,而暗部的细节变得更加清晰。
Ps处理后,图像也有明显的亮度和对比度的增强,但是整体灰度级没有精确直方图均衡后的图像更加平均。
总体来说,两种处理得到的图像差不多。
源代码:
1.histeq1
image=imread('original.jpg');
R=image(:,:,1);%%提取图片的RGB三种颜色
G=image(:,:,2);
B=image(:,:,3);
subplot(3,2,1),imshow(R);
title('红色分量');
subplot(3,2,2), imhist(R);
title('红色分量直方图');
subplot(3,2,3),imshow(G);
title('绿色分量');
subplot(3,2,4), imhist(G);
title('绿色分量直方图');
subplot(3,2,5),imshow(B);
title('蓝色分量');
subplot(3,2,6), imhist(B);
title('蓝色分量直方图');
r=histeq(R);%%分别对RGB通道进行直方图均衡
g=histeq(G);
b=histeq(B);
figure,
subplot(3,2,1),imshow(r);
title('红色分量均衡');
subplot(3,2,2), imhist(r);
title('红色分量均衡直方图');
subplot(3,2,3),imshow(g);
title('绿色分量均衡');
subplot(3,2,4), imhist(g);
title('绿色分量均衡直方图');
subplot(3,2,5), imshow(b);
title('蓝色分量均衡');
subplot(3,2,6), imhist(b);
title('蓝色分量均衡直方图');
figure,
equated = cat(3,r,g,b);%%联合RGB三个数组,维数为3
subplot(1,2,1),imshow(image);
title('original');
subplot(1,2,2),imshow(equated);
title('均衡化后的图像');
2.exact_histogram1
image=imread('grey.jpg');
output=exact_histogram(image);
imshow(output);。