MATLAB图像处理-图像增强之彩色图像直方图均衡化(RGB通道和HSV通道两种)
直方图均衡化这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方.
直方图均衡化这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。
代码中的直方图均衡化函数为自己编写,可参看:自己编写直方图均衡化函数
对RGB通道
通过这种方式取出RGB三通道,分别进行直方图均衡化,最后进行合成,再输出。
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
可以看出天空等出现了过曝,而且相应的颜色都有部分失真,特别是烟花附近过曝严重。
对HSV通道
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。
对于夜晚图像的增强,可以只对亮度通道进行增强。
通过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通道。
参考链接,可参看:自己编写直方图均衡化函数
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)