赞
踩
图像对比度增强的算法在很多场合都有用处,特别是在医学图像中,这是因为在众多疾病的诊断中,医学图像的视觉检查时很有必要的。医学图像由于本身及成像条件的限制,图像的对比度很低。因此,在这个方面已经开展了很多的研究。这种增强算法一般都遵循一定的视觉原则。众所周知,人眼对高频信号(边缘处等)比较敏感。虽然细节信息往往是高频信号,但是他们时常嵌入在大量的低频背景信号中,从而使得其视觉可见性降低。因此适当的提高高频部分能够提高视觉效果并有利于诊断。
ACE在图像处理方面可以有两种,
一种是:Automatic Color Equalization,即自动彩色均衡。【论文与代码】
一种是:Adaptive Contrast Enhancement,即自适应对比度增强
高动态范围图像是指在一幅图像中,既有明亮的区域又有阴影区域,为了使细节清晰,需要满足以下几点:
对于高动态范围处理,基于人眼视觉系统(HSV)在颜色连续和亮度连续方面得到较好的满足。该算法考虑了图像中颜色和亮度的空间位置关系,进行局部的自适应滤波,实现具有局部和非线性特征的图像亮度,色彩与对比度调整,同时满足灰度世界理论和白斑点假设。
算法原理
Rizzi等依据Retinex理论提出了自动颜色均衡算法,该算法考虑了图像中颜色和亮度的空间位置关系,进行局部特性的自适应滤波,实现具有局部和非线性特征的图像亮度与色彩调整和对比度调整,同时满足灰色世界理论假设和白色斑点假设。
R c = ∑ j ∈ s u b s e t , j ≠ p r ( I c ( p ) − I c ( j ) ) d ( p , j ) (1) R_c = \sum_{j\in subset,j \neq p }\frac{r(I_c(p) - I_c(j))}{d(p,j)} \tag{1} Rc=j∈subset,j=p∑d(p,j)r(Ic(p)−Ic(j))(1)
其中
R
c
(
p
)
Rc(p)
Rc(p)是中间结果,
I
c
(
p
)
−
I
c
(
j
)
I_c(p) - I_c(j)
Ic(p)−Ic(j)为2个点的亮度差,
d
(
p
,
j
)
d(p,j)
d(p,j) 表示距离度量函数,
r
(
∗
)
r(∗)
r(∗) 为亮度表现函数,需要是奇函数,这一步可以适应局部图像对比度,
r
(
∗
)
r(∗)
r(∗) 可以放大较小的差异,并丰富大的差异,根据局部内容扩展或者压缩动态范围。一般的,
r
(
∗
)
r(∗)
r(∗) 为:
r
(
x
)
=
{
1
x
<
−
T
x
/
T
−
T
⩽
x
⩽
T
−
1
x
>
T
r(x) = \left\{1x<−Tx/T−T⩽x⩽T−1x>T\right.
r(x)=⎩⎨⎧1x/T−1x<−T−T⩽x⩽Tx>T
对校正后的图像进行动态扩展。ACE算法是对单一色道进行的,对于彩色图片需要对每一个色道分别处理。一种简单的线性扩展可以表示为:
O
c
(
p
)
=
r
o
u
n
d
[
127.5
+
s
c
R
c
(
p
)
]
(2)
O_c(p) = round[127.5+s_cR_c(p)] \tag{2}
Oc(p)=round[127.5+scRc(p)](2)
其中:
s
c
s_c
sc斜率为:
[
(
m
c
,
0
)
,
(
m
c
,
255
)
]
[(m_c,0),(m_c,255)]
[(mc,0),(mc,255)],
M
c
=
max
p
[
R
c
(
p
)
]
,
m
c
=
min
p
[
R
c
(
p
)
]
M_c = \max_{p}[R_c(p)],m_c = \min_{p}[R_c(p)]
Mc=maxp[Rc(p)],mc=minp[Rc(p)]
还可以将其映射到
[
0
,
255
]
[0,255]
[0,255]的空间中:
L
(
x
)
=
R
(
x
)
−
min
R
max
R
−
min
R
L(x) = \frac{R(x) - \min R}{ \max R - \min R}
L(x)=maxR−minRR(x)−minR
自动彩色均衡算法改进:
式(1)算法复杂度较高,对于一副像素数为N的图像,需要执行O(N2)级次非线性映射计算,图像尺寸越大,耗时越多,所以针对式(1)产生了许多加速改进算法。例如:LLLUT加速策略,使用快速傅里叶变换替换卷积,将ACE转换为对规范直方图均衡化的一种平滑和局部修正的方法,并给出了求解最优模型:
a
r
g
min
I
1
2
∑
x
(
I
(
x
)
−
1
2
)
2
−
1
4
M
∑
x
∑
y
≠
x
ω
(
x
,
y
)
S
α
(
I
(
x
)
−
I
(
y
)
)
arg \min_I\frac{1}{2}\sum_{x}(I(x)-\frac{1}{2})^2 -\frac{1}{4M}\sum_x\sum_{y\neq x}\omega(x,y)S\alpha (I(x)-I(y))
argImin21x∑(I(x)−21)2−4M1x∑y=x∑ω(x,y)Sα(I(x)−I(y))
对于改进方法,可以考虑的因素:
多项式逼近展示:
ACE的增强效果普遍与retinex好。需要注意的是,ACE中当前像素是与整个图像的其他像素做差分比较,计算复杂度非常非常高,这也是限制它应用的最主要原因。
本文主要基于两个假设:
(1)对一副图像ACE增强后得到输出Y,如果对Y再进行一次ACE增强,输出仍然是Y本身;
(2)对一副图像的ACE增强结果进行尺寸缩放得到Y,对Y进行ACE增强,输出仍然是Y本身。
如果上面假设成立,我们就可以对图像进行缩放得到
I
1
I_1
I1,对
I
1
I_1
I1 的ACE增强结果进行尺度放大(与I尺寸一样)得到
Y
1
Y_1
Y1,那么
Y
Y
Y 和
Y
1
Y_1
Y1 是非常接近的,我们只需要在Y1基础上进一步处理即可。
这里就又引申了两个细节问题:
为叙述方便,这里假设后面的图像都是归一化到 [0,1] 之间的浮点数图像。
ACE算法的计算公式为:
Y
=
∑
g
(
I
(
x
0
)
−
I
(
x
)
)
∑
w
(
x
0
,
x
)
Y = \frac{ \sum g(I(x_0)-I(x))}{\sum w(x_0,x)}
Y=∑w(x0,x)∑g(I(x0)−I(x))
import cv2 import numpy as np import math def stretchImage(data, s=0.005, bins = 2000): #线性拉伸,去掉最大最小0.5%的像素值,然后线性拉伸至[0,1] ht = np.histogram(data, bins); d = np.cumsum(ht[0])/float(data.size) lmin = 0; lmax=bins-1 while lmin<bins: if d[lmin]>=s: break lmin+=1 while lmax>=0: if d[lmax]<=1-s: break lmax-=1 return np.clip((data-ht[1][lmin])/(ht[1][lmax]-ht[1][lmin]), 0,1) g_para = {} def getPara(radius = 5): #根据半径计算权重参数矩阵 global g_para m = g_para.get(radius, None) if m is not None: return m size = radius*2+1 m = np.zeros((size, size)) for h in range(-radius, radius+1): for w in range(-radius, radius+1): if h==0 and w==0: continue m[radius+h, radius+w] = 1.0/math.sqrt(h**2+w**2) m /= m.sum() g_para[radius] = m return m def zmIce(I, ratio=4, radius=300): #常规的ACE实现 para = getPara(radius) height,width = I.shape zh,zw = [0]*radius + range(height) + [height-1]*radius, [0]*radius + range(width) + [width -1]*radius Z = I[np.ix_(zh, zw)] res = np.zeros(I.shape) for h in range(radius*2+1): for w in range(radius*2+1): if para[h][w] == 0: continue res += (para[h][w] * np.clip((I-Z[h:h+height, w:w+width])*ratio, -1, 1)) return res def zmIceFast(I, ratio, radius): #单通道ACE快速增强实现 height, width = I.shape[:2] if min(height, width) <=2: return np.zeros(I.shape)+0.5 Rs = cv2.resize(I, ((width+1)/2, (height+1)/2)) Rf = zmIceFast(Rs, ratio, radius) #递归调用 Rf = cv2.resize(Rf, (width, height)) Rs = cv2.resize(Rs, (width, height)) return Rf+zmIce(I,ratio, radius)-zmIce(Rs,ratio,radius) def zmIceColor(I, ratio=4, radius=3): #rgb三通道分别增强,ratio是对比度增强因子,radius是卷积模板半径 res = np.zeros(I.shape) for k in range(3): res[:,:,k] = stretchImage(zmIceFast(I[:,:,k], ratio, radius)) return res if __name__ == '__main__': m = zmIceColor(cv2.imread('p4.bmp')/255.0)*255 cv2.imwrite('zmIce.jpg', m)
鸣谢
文献地址:https://www.researchgate.net/publication/253622155_Real-Time_Adaptive_Contrast_Enhancement_For_Imaging_Sensors
C++:https://blog.csdn.net/weixin_45709330/article/details/104447450
论文与源码:http://www.ipol.im/pub/art/2012/g-ace/
https://blog.csdn.net/zmshy2128/article/details/53470357#comments
https://www.cnblogs.com/Imageshop
https://blog.csdn.net/weixin_45709330/article/details/104447336
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。