MATLAB图像处理-图像增强之彩色图像直方图均衡化(RGB通道和HSV通道两种)

直方图均衡化这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来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通道。
在这里插入图片描述

参考链接,可参看:自己编写直方图均衡化函数

  • 23
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值