赞
踩
直方图均衡化这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。
代码中的直方图均衡化函数为自己编写,可参看:自己编写直方图均衡化函数
OutImg(:,:,1)=R;
OutImg(:,:,2)=G;
OutImg(:,:,3)=B;
完整的代码如下:
%% clc clear all I=imread('D:\提高文化修养的文件\数图处理\第三章图像增强 第1次作业\fireworks.jpg'); %% %%变化前灰度值 OutImg=I; R=I(:,:,1); subplot(2,3,1) imhist(R); title('R') G=I(:,:,2); subplot(2,3,2) imhist(G); title('G') B=I(:,:,3); subplot(2,3,3) imhist(B); title('B') %% %%变化后灰度值 R=hist_1(R); subplot(2,3,4) imhist(R); title('after R') G=hist_1(G); subplot(2,3,5) imhist(G); title('after G') B=hist_1(B); subplot(2,3,6) imhist(B); title('after B') %% %变化后图像 OutImg(:,:,1)=R; OutImg(:,:,2)=G; OutImg(:,:,3)=B; figure, imshow(I); title('原图像') figure, imshow(OutImg); title('直方图均衡化后的图像') %% %直方图均衡化函数 function hist_img = hist_1(I) [M, N] = size(I); size_img = M*N; c = zeros(1,256);%统计每个每个像素值的个数 b= c;%转化前后的对照表 temp = I(:); temp = sort(temp); for i = 1:size_img c(temp(i)+1) = c(temp(i)+1)+1; end a = c;%求和 for i = 2:256 a(i) = c(i) + a(i-1); end min_cdf = 10000; for i = 1:256 if a(i)>0 if a(i) < min_cdf min_cdf = a(i); end end end for j = 1:256 if a(j) > 0 b(j) = round(255*(a(j)-min_cdf)/(size_img-min_cdf)); end end for i = 1:M for j = 1:N I(i,j) = b(I(i,j)+1); end end hist_img = I; end
但是这种方式会对原来的颜色造成破坏,还会出现过曝等,适用性一般。
示例烟花图如下:
ps:图片拍摄于湖南师范大学体育馆二楼,2019.10.1
可以看出天空等出现了过曝,而且相应的颜色都有部分失真,特别是烟花附近过曝严重。
通过rgb2hsv转换为hsv通道
通过hsv2rgb转换为rgb通道
V通道通常小于1,但是直方图均衡化为0-255,故:
floor(v * 255)
变换后:
v/255
综上代码如下:
%% clc clear all I=imread('D:\QQ接收文件夹\MobileFile\IMG_20191001_204030.jpg'); %% %%HSV OutImg=rgb2hsv(I); V=OutImg(:,:,3); V = floor(V * 255); %% %%变化后V V=hist_1(V); V = V / 255; %% %变化后图像 OutImg(:,:,3) = V; OutImg = hsv2rgb(OutImg); imshow(I); title('原图像') figure, imshow(OutImg); title('直方图均衡化后的图像') %% %直方图均衡化函数 function hist_img = hist_1(I) [M, N] = size(I); size_img = M*N; c = zeros(1,256);%统计每个每个像素值的个数 b= c;%转化前后的对照表 temp = I(:); temp = sort(temp); for i = 1:size_img c(temp(i)+1) = c(temp(i)+1)+1; end a = c;%求和 for i = 2:256 a(i) = c(i) + a(i-1); end min_cdf = 10000; for i = 1:256 if a(i)>0 if a(i) < min_cdf min_cdf = a(i); end end end for j = 1:256 if a(j) > 0 b(j) = round(255*(a(j)-min_cdf)/(size_img-min_cdf)); end end for i = 1:M for j = 1:N I(i,j) = b(I(i,j)+1); end end hist_img = I; end
对刚才的图像进行处理,结果如下:
可以看出对色彩的还原比较高,但是在灯的附近还是出现了过曝,整体来说画面的亮度有了较大的提升,且下方的座椅效果很好,比RGB通道的直方图均衡化要好。适用于没有特别亮的暗色照片增强。
综合对比:
左边为RGB,右边为HSV
推荐使用HSV通道。
参考链接,可参看:自己编写直方图均衡化函数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。