图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。
图像灰度直方图:一副数字图像有[0~255]灰度级,直方图定义如下:
h(gk)=nk
其中,gk是第k个灰度级(如:255),nk是该灰度级的个数。
归一化直方图定义如下:
p(gk)=h(gk)n=nkn
即:第k个灰度级出现的数量,比上所有灰度级数量总和。
均衡化的基本思想是:尽量使得每个灰度级的像素数量相等。
if length(size(H))>2H=rgb2gray(H);
end[m,n]=size(H);
p=zeros(1,256);
for i=0:255 p(i+1)=length(find(H==i))/(m*n);
end
subplot(2,2,1);
imshow(H);
title('原图');
subplot(2,2,2);
bar(0:255,p,'b');
title('原图直方图'); s=zeros(1,256);
for i=1:256 for j=1:i s(i)=p(j)+s(i); end
end a=round(s*255);
b=H;
for i=0:255 b(find(H==i))=a(i+1);
end
subplot(2,2,3);
imshow(b)
title('均衡化后图像'); for i=0:255 GPeq(i+1)=sum(p(find(a==i)));
end
subplot(2,2,4);
bar(0:255,GPeq,'b'); title('均衡化后的直方图');
OutImg=Img;
R = Img(:,:,1);
G = Img(:,:,2);
B = Img(:,:,3); R = histeq(R, 256);
G = histeq(G, 256);
B = histeq(B, 256); OutImg(:,:,1) = R;
OutImg(:,:,2) = G;
OutImg(:,:,3) = B; figure,
subplot(1,2,1),
imshow(Img);title('原始图像');
subplot(1,2,2),
imshow(OutImg); title('均衡化后结果');
}
opencv中直方图均衡化的源码程序如下:
关于自适应均衡方法,还是单独拿出来写吧,东西太多了看起开也不方便~ 以上算法实现都亲自测试过,如果有问题还请告知啊。 《冈萨雷斯--图像处理》 http://blog.jobbole.com/84215/ http://blog.csdn.net/baimafujinji/article/details/50614332 http://blog.csdn.net/wenhao_ir/article/details/51240973 http://blog.csdn.net/zxc024000/article/details/49130605 http://blog.csdn.net/zizi7/article/details/50518798 CV_IMPL void cvEqualizeHist( const CvArr* srcarr, CvArr* dstarr ) { CvMat sstub, *src = cvGetMat(srcarr, &sstub); CvMat dstub, *dst = cvGetMat(dstarr, &dstub); CV_Assert( CV_ARE_SIZES_EQ(src, dst) && CV_ARE_TYPES_EQ(src, dst) && CV_MAT_TYPE(src->type) == CV_8UC1 ); CvSize size = cvGetMatSize(src); if( CV_IS_MAT_CONT(src->type & dst->type) ) { size.width *= size.height; size.height = 1; } int x, y; const int hist_sz = 256;//0到255,一共256个灰度值 int hist[hist_sz]; memset(hist, 0, sizeof(hist)); for( y = 0; y
下面是实例程序及结果:
#include
效果图:
using namespace std;int main()
{灰度图像均衡//Mat srcImage = imread("D:\\fcq_proMatlab\\vessel_edge_extration\\image\\6.jpg");//if (!srcImage.data)// return 1;//Mat srcGray;//cvtColor(srcImage, srcGray, CV_BGR2GRAY);//imshow("srcGray", srcGray);直方图均衡化 //Mat heqResult;//equalizeHist(srcGray, heqResult);//imshow("heqResult", heqResult);//彩色图像均衡Mat srcImage = imread("D:\\fcq_proMatlab\\vessel_edge_extration\\image\\6.jpg");if (!srcImage.data)return 1;// 存储彩色直方图及图像通道向量 Mat colorHeqImage;vector
自适应直方图均衡化(Adaptive histgram equalization/AHE)
限制对比度自适应直方图均衡(Contrast Limited Adaptive histgram equalization/CLAHE)
参考: