小言_互联网的博客

An Integrated Neighborhood Dependent Approach for Nonlinear Enhancement of Color Images

443人阅读  评论(0)

一种基于邻域依赖的彩色图像非线性增强方法

参考
论文名称是An Integrated Neighborhood Dependent Approach for Nonlinear Enhancement of Color Images。
论文内容我就不详细叙述了。论文本身的篇幅很短,建议大家去看一下。而且参考链接里面写的也很明白。

论文的大致内容就是通过灰度图,动态范围压缩,高斯滤波结果,得到修复的灰度图。然后根据灰度图进行色彩恢复。
实现过程:
1.获取灰度图
论文里是按照标准公式得到的灰度图,但是和我知道的不太一样。YUV和RGB的转化公式三个系数只有两个系数一样,我很迷惑啊。这里就直接用自带的了。详细的可以看论文里。

clc
clear
I=im2double(imread('2.png'));
I1=rgb2gray(I);

2.进行动态压缩。这个地方参考的链接里面说他没懂,其实我也不懂。但是我查了一下,我的理解就是把亮度图像表现得范围扩大。动态压缩得到的增强后的灰度图 In
作者的说法是这种变换可以大大提高那些暗像素(区域)的亮度,而亮像素(区域)有较低甚至负的增强。公式(1)中的常数可以根据输入图像的整体强度水平进行调整,以便能够精细地调整亮度增强以获得最佳结果。

% 其中的0.24和0.5都是可以调整的常数
In=(I1.^(0.24)+(1-I1).*0.5+I1.^2)/2;

3.对比度增强。作者说亮度提升会使对比度减弱,所以需要增强对比度。这里也就是说其实动态压缩就是亮度增强的一种方法。
对比度增强的方法概述:

  1. 进行高斯滤波
  2. 通过高斯滤波的结果与原灰度图 I1 作比较(除法)得到 r1 ,作者没有说明 r1 的含义,我的理解是 r1 代表了每个像素的变化率。
  3. 将变化率 r1 作为指数,加强后的灰度图作为底数,求出最后的加强结果图Ri
  4. 用不同高斯核进行高斯滤波,并完成上述步骤共三次取平均值作为最终结果。
%通过高斯核对灰度增强图像做卷积运算
sigma=3;
window_1 = double(uint8(3*sigma)*2 + 1);
G1=fspecial('gaussian',window_1,sigma);
Guass1=imfilter(I1,G1,'conv','replicate','same');
r1=Guass1./I1;
R1=In.^r1;
sigma=20;
window_2 = double(uint8(3*sigma)*2 + 1);
G2=fspecial('gaussian',window_2,sigma);
Guass2=imfilter(I1,G2,'conv','replicate','same');
r2=Guass2./I1;
R2=In.^r2;
sigma=240;
window_3 = double(uint8(3*sigma)*2 + 1);
G3=fspecial('gaussian',window_3,sigma);
Guass3=imfilter(I1,G3,'conv','replicate','same');
r3=Guass3./I1;
R3=In.^r3;
R=(R1+R2+R3)/3;

4.色彩恢复
R对应的就是原来的灰度图I1 ,所以用RGB每个通道的值和I1 作比值然后再乘R就是修复之后的RGB每个通道的值了。

% R就是调整之后的I1,所以按照下面的式子来恢复
Rr=R.*(I(:,:,1)./I1);
Rg=R.*(I(:,:,2)./I1);
Rb=R.*(I(:,:,3)./I1);
rgb=cat(3,Rr,Rg,Rb);
imshow([I rgb]);

效果

这篇文章内容很短,而且代码也很简单。里面的三次卷积取平均有点像基于Retinex的MSR方法
但我还是看了差不多一天。好烦啊,我改成python的再试试,便于之后的工作。
好啦,我用了晚上的时间弄了一个python版本的。当然,这里有一些小问题:

  1. 卷积的问题
    因为在python里面我们所谓的卷积实际并不是matlab信号处理的卷积,计算的是相关性。
    我没有找到matlab中imfilter的完全替代,因为imfileter中的边缘处理在python中找不到对应的。直接用opencv-python中的cv2.GaussianBlur来代替是勉强可以的,有微小的差别。cv2.fileter需要自己计算出高斯核。filter2D详解计算高斯核的方法ogrid函数详解
    下面的图左边是用cv2.GaussianBlur,中间是用cv2.filter2D,右边是matlab中的imfileter算出的R矩阵,可以看到cv2.GaussianBlur更接近,但是实际还是有区别的。
  2. 在matlab中读取rgb图片会自动归一化,但是python中要手动归一化。并且在读取图片之后将图片转为float32来对应matlab中的double
  3. python数据类型转化的问题,参考
    经过计算之后,如果像素值超过了上限也就是1(对应没有归一化的255),在maltlab中进行数据类型转换会自动将其看为1。而在python中用a=a.astype(np.unit8)或a = np.uint8(a)的方法会变成a除255的余数。所以在python中需要强制使最终矩阵中的最大值等于1。Python替换NumPy数组中大于某个值的所有元素

当然,虽然和matlab是有一些区别,但是是可以实现的。结果如图,左边是python的结果,右边是matlab的结果,肉眼是看不出什么区别的。论文python代码下载链接在这里。

今天就到这里啦,祝大家生活愉快!


转载:https://blog.csdn.net/H_ran16/article/details/106337085
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场