我需要使用Python CV删除图像多个部分中的变黑部分。我尝试了去噪效果不理想的问题。
例如我需要删除表格标题中的变黑部分(下图),并将标题背景转换为白色,内容为黑色。
任何人都可以帮助我选择正确的库或解决方案来克服这一问题吗?
这是@eldesgraciado的方法的改进版本,该方法使用形态学的命中或未命中操作对Python中的目标像素进行过滤,以过滤点状图案。区别在于,我们没有用二进制图像减去掩码来降低文本质量,而是先对二进制图像进行扩展,然后按位进行扩展,并保留文本质量。
获得二进制图像。加载图像,灰度,Otsu's threshold
执行形态学命中或遗漏操作。我们用cv2.getStructuringElement
创建一个点阵图形内核,然后使用cv2.getStructuringElement
卷积图像
[Remove points。我们用二进制图像cv2.filter2D
遮罩
修复损坏的文本像素。然后,我们cv2.filter2D
然后cv2.bitwise-xor
使用输入图像和彩色背景像素为白色的定型蒙版
二进制图像
cv2.bitwise-xor
点罩
删除点
cv2.dilate
膨胀以修复阈值处理中损坏的文本像素
结果
cv2.bitwise_and
代码
如您所见,很难过滤虚线图案。它显然与文本重叠。我至少看到两个选择:1)利用模式的周期性,并执行频率滤波。 2)尝试对目标像素使用morphic hit or miss操作,目的是隔离它们。
让我们检查一下选项2。噪声的样式非常独特。如果使用所有斑点都为白色的二进制图像,则您要寻找的图案是白色像素(1)
,周围是8个黑色像素(0):这是您得到的面具:
现在,只需将此蒙版减去原始(二进制)图像,即可得到:
import cv2
import numpy as np
# Load image, grayscale, Otsu's threshold
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Perform morphological hit or miss operation
kernel = np.array([[-1,-1,-1], [-1,1,-1], [-1,-1,-1]])
dot_mask = cv2.filter2D(thresh, -1, kernel)
# Bitwise-xor mask with binary image to remove dots
result = cv2.bitwise_xor(thresh, dot_mask)
# Dilate to fix damaged text pixels
# since the text quality has decreased from thresholding
# then bitwise-and with input image
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
dilate = cv2.dilate(result, kernel, iterations=1)
result = cv2.bitwise_and(image, image, mask=dilate)
result[dilate==0] = [255,255,255]
cv2.imshow('dot_mask', dot_mask)
cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.imshow('dilate', dilate)
cv2.waitKey()
如您所见,部分列标题妨碍了操作。如果您想要白色背景和黑色斑点,只需反转图像:
[ 0, 0, 0 ]
[ 0, 1, 0 ]
[ 0, 0, 0 ]