如何使用OpenCV从扫描图像中移除阴影?

2024-09-29 03:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在使用OpenCV进行图像二值化之前移除阴影。我尝试了Otsu法和自适应阈值法,但是对于阴影区域较大的图像,这两种方法都不能给出很好的效果。

有更好的解决方案吗?提前谢谢。

[Sample image]1

[Sample image]2


Tags: 方法图像区域阈值解决方案opencv阴影效果
1条回答
网友
1楼 · 发布于 2024-09-29 03:24:00

因为您没有指定任何语言,所以我假设使用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)

非规范化结果如下:

enter image description here

以及标准化结果:

enter image description here

相关问题 更多 >