OpenCV—PythonRetinex图像增强算法
Retinex图像增强算法
⼀、单尺度SSR(Single Scale Retinex)理论
Retinex理论始于Land和McCann于20世纪60年代作出的⼀系列贡献,其基本思想是⼈感知到某点的颜⾊和亮度并不仅仅取决于该点进⼊⼈眼的绝对光线,还和其周围的颜⾊和亮度有关。Retinex这个词是由视⽹膜(Retina)和⼤脑⽪层(Cortex)两个词组合构成的.Land之所以设计这个词,是为了表明他不清楚视觉系统的特性究竟取决于此两个⽣理结构中的哪⼀个,抑或是与两者都有关系。
Land的Retinex模型是建⽴在以下的基础之上的:
真实世界是⽆颜⾊的,我们所感知的颜⾊是光与物质的相互作⽤的结果。我们见到的⽔是⽆⾊的,但是⽔膜—肥皂膜却是显现五彩缤纷,那是薄膜表⾯光⼲涉的结果;
每⼀颜⾊区域由给定波长的红、绿、蓝三原⾊构成的;
三原⾊决定了每个单位区域的颜⾊。
Retinex 理论的基本内容
物体的颜⾊是由物体对长波(红)、中波(绿)和短波(蓝)光线的反射能⼒决定的,⽽不是由反射光强度的绝对值决定的;
商品采购合同物体的⾊彩不受光照⾮均性的影响,具有⼀致性,
建材市场
即Retinex理论是以⾊感⼀致性(颜⾊恒常性)为基础的。
如下图所⽰,观察者所看到的物体的图像S是由物体表⾯对⼊射光L反射得到的,反射率R由物体本⾝决定,不受⼊射光L变化。
基于Retinex的图像增强的⽬的就是从原始图像S中估计出光照L,从⽽分解出R,消除光照不均的影响,以改善图像的视觉效果,正如⼈类视觉系统那样。
Retinex⽅法的核⼼就是估测照度L,从图像S中估测L分量,并去除L分量,得到原始反射分量R,即:
⼆、Retinex理论的理解
下⾯介绍两个经典的Retinex算法:
基于路径的Retinex以及基于中⼼/环绕Retinex。
Retinex理论,与降噪类似,该理论的关键就是合理地假设了图像的构成。如果将观察者看到的图像看成是⼀幅带有乘性噪声的图像,那么⼊射光的分量就是⼀种乘性的,相对均匀,且变换缓慢的噪声。Retinex算法所做的就是合理地估计图像中各个位置的噪声,并除去它。
在极端情况下,我们⼤可以认为整幅图像中的分量都是均匀的,那么最简单的估计照度L的⽅式就是在将图像变换到对数域后对整幅图像求均值。因此,我设计了以下算法来验证⾃⼰的猜想,流程如下:
import numpy as np
import cv2
def replaceZeroes(data):
min_nonzero = min(o(data)])
data[data == 0] = min_nonzero
return data
def SSR(src_img, size):
L_blur = cv2.GaussianBlur(src_img, (size, size), 0)
img = replaceZeroes(src_img)
L_blur = replaceZeroes(L_blur)
dst_Img = cv2.log(img/255.0)
dst_Lblur = cv2.log(L_blur/255.0)
dst_IxL = cv2.multiply(dst_Img,dst_Lblur)
log_R = cv2.subtract(dst_Img, dst_IxL)
dst_R = alize(log_R,None,0,255,cv2.NORM_MINMAX) log_uint8 = vertScaleAbs(dst_R)
return log_uint8
if __name__ == '__main__':
img = './gggg/20190701133802.png'
size = 3
src_img = cv2.imread(img)
b_gray, g_gray, r_gray = cv2.split(src_img)
b_gray = SSR(b_gray, size)
g_gray = SSR(g_gray, size)
r_gray = SSR(r_gray, size)
result = ([b_gray, g_gray, r_gray])
cv2.imshow('img',src_img)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、多尺度MSR(Multi-Scale Retinex)
MSR是在SSR基础上发展来的,优点是可以同时保持图像⾼保真度与对图像的动态范围进⾏压缩的同时,MSR也可实现⾊彩增强、颜⾊恒常性、局部动态范围压缩、全局动态范围压缩,也可以⽤于X光图像增强。最为经典的就是3尺度的,⼤、中、⼩,既能实现图像动态范围的压缩,⼜能保持⾊感的⼀致性较好。
import numpy as np
import cv2
def replaceZeroes(data):
min_nonzero = min(o(data)])开包子铺的爸爸
data[data == 0] = min_nonzero
return data七月棋牌
def MSR(img, scales):
weight = 1 / 3.0
鼠标自动双击>描写景物scales_size = len(scales)
h, w = img.shape[:2]
log_R = np.zeros((h, w), dtype=np.float32)
for i in range(scales_size):
img = replaceZeroes(img)
L_blur = cv2.GaussianBlur(img, (scales[i], scales[i]), 0)
L_blur = replaceZeroes(L_blur)
紫菜汤的做法
100首古诗大全
dst_Img = cv2.log(img/255.0)
dst_Lblur = cv2.log(L_blur/255.0)
dst_Ixl = cv2.multiply(dst_Img, dst_Lblur)
log_R += weight * cv2.subtract(dst_Img, dst_Ixl)
dst_R = alize(log_R,None, 0, 255, cv2.NORM_MINMAX) log_uint8 = vertScaleAbs(dst_R)
return log_uint8
if __name__ == '__main__':
img = './gggg/20190701133802.png'
scales = [15,101,301] # [3,5,9] #看不出效果有什么差别
src_img = cv2.imread(img)
b_gray, g_gray, r_gray = cv2.split(src_img)
b_gray = MSR(b_gray, scales)
g_gray = MSR(g_gray, scales)
r_gray = MSR(r_gray, scales)
result = ([b_gray, g_gray, r_gray])
cv2.imshow('img',src_img)
cv2.imshow('MSR_result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()