大家好,欢迎来到IT知识分享网。
Retinex图像增强算法详解
一、Retinex理论
1)物体的颜色由物体对长波(红)、中波(绿)和短波(蓝)光线的反射能力决定,而不是由反射光强度的绝对值决定;
2)物体的色彩不受光照非均性的影响,具有一致性;
3)Retinex理论是以色感一致性为基础。
如下图所示,
观察者所看到的图像S(x,y)是由入射图像L(x,y)和反射图像R(x,y)构成。即入射光照射在反射物体上,通过反射物体的反射,形成反射光进入人眼,从而形成图像。其公式如下表示:
观察者所看到的图像S(x,y)是由入射图像L(x,y)和反射图像R(x,y)构成。即入射光照射在反射物体上,通过反射物体的反射,形成反射光进入人眼,从而形成图像。其公式如下表示:
\[S(x,y) = R(x,y) \bullet L(x,y)\]
Retinex算法的核心就是估测入射图像L(x,y),从图像S(x,y)中来估测L(x,y)分量,并去除L(x,y)分量,从而得到反射图像R(x,y)。具体操作:
1)两边同时取对数:
\[\log [R(x,y)] = \log [S(x,y)] – \log [L(x,y)]\]
2)由于L(x,y)只能近似求取,因此用S(x,y)和高斯核进行卷积来表示。所以公式如下:
\[L{\rm{og}}(R(x,y)) = (Log(S(x,y)) – Log(S(x,y) * G(x,y)))\]
其中 * 代表卷积操作,G(x,y)代表高斯核。
3)对求取的R(x,y)映射到(0,255)之间。对于量化公式:
\[R(x,y) = (Value – Min)/(Max – Min)(255 – 0)\]
二、Retinex代码
import numpy as np import cv2 def replaceZeroes(data): min_nonzero = min(data[np.nonzero(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 = cv2.normalize(log_R,None,0,255,cv2.NORM_MINMAX) log_uint8 = cv2.convertScaleAbs(dst_R) return log_uint8 if __name__ == '__main__': img = r'E:\chengxu\CV\ls\2023.2\12345.jpg' 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 = cv2.merge([b_gray, g_gray, r_gray]) cv2.imshow('img',src_img) cv2.imshow('result',result) cv2.waitKey(0) cv2.destroyAllWindows()
转载:(68条消息) OpenCV—Python Retinex图像增强算法_SongpingWang的博客-CSDN博客_基于路径的retinex算法
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30681.html