我在OpenCV中尝试了一些过滤器/操作,它似乎工作得很好。
第1步: 放大图片-
kernel = np.ones((5, 5), np.uint8)
cv2.dilate(img, kernel, iterations = 1)
如您所见,噪点消失了,但字符很轻,所以我腐蚀了图像。
第2步: 侵蚀图像-
kernel = np.ones((5, 5), np.uint8)
cv2.erode(img, kernel, iterations = 1)
如您所见,噪音消失了,但是其他列上的某些字符损坏了。 我建议仅在嘈杂的列上运行这些操作。 您可能要使用HoughLines查找最后一列。 然后,您只能提取该列,进行扩散+腐蚀,然后将其替换为原始图像中的相应列。 另外,膨胀+侵蚀实际上是一个称为close的操作。 您可以直接使用-
cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
正如@Ermlg所建议的,具有3内核的midBlur也可以很好地工作。
cv2.medianBlur(img, 3)
替代步骤
如您所见,所有这些滤波器都起作用,但是最好仅在有噪声的部分实现这些滤波器。 为此,请使用以下命令:
edges = cv2.Canny(img, 50, 150, apertureSize = 3) // img is gray here
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, 1000, 50) // last two arguments are minimum line length and max gap between two lines respectively.
for line in lines:
for x1, y1, x2, y2 in line:
print x1, y1
// This gives the start coordinates for all the lines. You should take the x value which is between (0.75 * w, w) where w is the width of the entire image. This will give you essentially **(x1, y1) = (1896, 766)**
然后,您只能像这样提取该部分:
extract = img[y1:h, x1:w] // w, h are width and height of the image
然后,在此图像中实现过滤器(中位或关闭)。 消除噪点后,您需要将此滤波后的图像替换为原始图像中的模糊部分。 image [y1:h,x1:w] =中位数
这在C ++中很简单:
extract.copyTo(img, new Rect(x1, y1, w - x1, h - y1))
替代方法的最终结果
希望能帮助到你!