【发布时间】:2017-06-26 01:56:51
【问题描述】:
我想在使用 OpenCV 进行图像二值化之前去除阴影。我已经尝试过 Otsu Method 和自适应阈值,但是对于有大面积阴影的图像,这两种方法都不会产生很好的效果。
有更好的解决方案吗?提前致谢。
]1
]2
【问题讨论】:
标签: python opencv image-processing
我想在使用 OpenCV 进行图像二值化之前去除阴影。我已经尝试过 Otsu Method 和自适应阈值,但是对于有大面积阴影的图像,这两种方法都不会产生很好的效果。
有更好的解决方案吗?提前致谢。
]1
]2
【问题讨论】:
标签: python opencv image-processing
由于您没有指定任何语言,我假设 Python 来说明。
一个不错的起点可能是采用我在this answer 中展示的方法并将其扩展为与多个渠道一起使用。
类似的东西
import cv2
import numpy as np
img = cv2.imread('shadows.png', -1)
rgb_planes = cv2.split(img)
result_planes = []
result_norm_planes = []
for plane in rgb_planes:
dilated_img = cv2.dilate(plane, np.ones((7,7), np.uint8))
bg_img = cv2.medianBlur(dilated_img, 21)
diff_img = 255 - cv2.absdiff(plane, bg_img)
norm_img = cv2.normalize(diff_img,None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)
result_planes.append(diff_img)
result_norm_planes.append(norm_img)
result = cv2.merge(result_planes)
result_norm = cv2.merge(result_norm_planes)
cv2.imwrite('shadows_out.png', result)
cv2.imwrite('shadows_out_norm.png', result_norm)
未归一化的结果如下:
以及归一化的结果:
【讨论】: