1、单尺度SSR(Single Scale Retinex)
import cv2
import numpy as np
import matplotlib.pyplot as plt
#SSR
def replaceZeroes(data):
min_nonzero = min(data[np.nonzero(data)])
data[data == 0] = min_nonzero
return data
def SSR(img,ksize):
L_blur = cv2.GaussianBlur(img,(ksize,ksize),0) # 对输入图像进行高斯模糊处理
img = replaceZeroes(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)
# log_R = cv2.subtract(dst_img,dst_Lblur)
# array = cv2.normalize(array,None,0,255,cv2.NORM_MINMAX),指定将图片的像素值放缩到 0-255 之间,线性量化
# 量化操作,量化的方式对处理效果有决定性影响,目前没有论文能够对这一块选用什么方式讲清楚
dst_R = cv2.normalize(log_R,None,0,255,cv2.NORM_MINMAX)
# array = cv2convertScaleAbs(src, dst=None, alpha=None, beta=None)
# 输入深度图数组中的每个值srci(它是16位的,数据类型是uint16),先乘以系数α,再加上偏置β,最后将结果取绝对值,
# 并截取为8位(uint8),然后返回与原数组相同维度的数组dst。
dsr_R = np.exp(dst_R)
log_uint8 = cv2.convertScaleAbs(dst_R)
return log_uint8
# 效果一样,手动实现缩放
# minvalue,maxvalue,minloc,maxloc = cv2.minMaxLoc(log_R)
# for i in range(h):
# for j in range(w):
# log_R[i,j] = (log_R[i,j]-minvalue)*255.0/(maxvalue-minvalue)
# log_uint8 = cv2.convertScaleAbs(log_R)
# return log_uint8
img = cv2.imread("C:\\Users\\HP\\Desktop\\ssr_test.PNG")
b,g,r = cv2.split(img)
img = cv2.merge([r,g,b])
ssr_img = SSR(img,3)
plt.subplot(3,1,1)
plt.imshow(img)
plt.subplot(3,1,2)
plt.imshow(ssr_img)
float_img.shape,blur_img.shape