使用python opencv实现照明规范化

使用python opencv实现照明规范化,python,opencv,Python,Opencv,我正在做一个深入学习的图像分类项目,希望实现论文第4.4节中提供的光照归一化,但没有得到预期的结果 在论文的第4.4节中,使用高斯kerenl滤波器获得背景图像,然后从YCrCb颜色空间中的Y通道中减去它,我尝试再现结果,但与图4中的文章不同 下面是我的代码 image = cv2.imread(file) cv2.imshow("origin", image) # illumination normalize ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR

我正在做一个深入学习的图像分类项目,希望实现论文第4.4节中提供的光照归一化,但没有得到预期的结果

在论文的第4.4节中,使用高斯kerenl滤波器获得背景图像,然后从YCrCb颜色空间中的Y通道中减去它,我尝试再现结果,但与图4中的文章不同

下面是我的代码

image = cv2.imread(file)
cv2.imshow("origin", image)

# illumination normalize
ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)
y, cr, cb = cv2.split(ycrcb)

# get background which paper says (gaussian method using standard deviation 5 pixel)
gaussian = cv2.GaussianBlur(y, (0, 0), 5, 5)

# subtract background from Y channel which paper says
y = y - gaussian
ycrcb = cv2.merge([y, cr, cb])

output = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR)
cv2.imshow("output", output)
但下面的输出结果图像与图4所示的不同

->


有人知道怎么做吗?感谢您的大力帮助:-

您有两个问题。首先,您需要根据图像大小与参考中使用的299像素大小的比例调整高斯模糊的sigma。其次,您需要将差异偏向于接近中灰色。根据亮度需要调整偏置

下面是我如何在Python/OpenCV中实现它的

输入:

结果:

import cv2
import numpy as np

# read input
image = cv2.imread('retina2.jpg')
hh, ww = image.shape[:2]
print(hh, ww)
max = max(hh, ww)

# illumination normalize
ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)

# separate channels
y, cr, cb = cv2.split(ycrcb)

# get background which paper says (gaussian blur using standard deviation 5 pixel for 300x300 size image)
# account for size of input vs 300
sigma = int(5 * max / 300)
print('sigma: ',sigma)
gaussian = cv2.GaussianBlur(y, (0, 0), sigma, sigma)

# subtract background from Y channel
y = (y - gaussian + 100)

# merge channels back
ycrcb = cv2.merge([y, cr, cb])

#convert to BGR
output = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR)

# save results
cv2.imwrite('retina2_proc.jpg', output)

# show results
cv2.imshow("output", output)
cv2.waitKey(0)