从图像中删除嘈杂的线条 - opencv - python

信息处理 图像处理 Python opencv
2022-01-02 02:25:04

我想处理不同类型的图像以从嘈杂的图像中提取实际文本。我正在使用 open cv 来完成这项工作,它工作正常,但问题是我需要设置不同的下限阈值才能将嘈杂的图像转换为可读文本。是是否可以设置单个阈值,通过进行一些预处理来消除所有图像中的噪声?

主要目标:我正在尝试删除那条波浪状的水平线并使字符清晰易读

使用的代码:

import cv2

# Load an color image in grayscale
img = cv2.imread('it_captcha3.jpg',0)
ret, thresh_img = cv2.threshold(img, 180, 255, cv2.THRESH_BINARY_INV)
cv2.imshow('grey image',thresh_img)
cv2.imwrite("result11.jpg", thresh_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

验证码1:

在此处输入图像描述

处理后的图像:使用的阈值 -> 低:180 高 ->255,

在此处输入图像描述

验证码:2

在此处输入图像描述

处理后的图像:使用的阈值 -> 低:200 高 ->255

在此处输入图像描述

验证码:3

在此处输入图像描述

已处理:低 -> 165 高:255

在此处输入图像描述

2个回答

首先请记住,对于所有类型的噪声和所有类型的图像,没有单一的解决方案。话虽如此,我可以想到两个解决方案。首先是使用 Otsu 阈值:

ret,thresh_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)

这将尝试猜测正在使用的图像的良好阈值。

另一种解决方案是在阈值化后使用“关闭”形态变换。它会首先膨胀然后侵蚀图像并使用一个好的内核(它也称为结构元素)你可以删除线(虽然你也可以删除一些有用的像素!!)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (4,8))
morph_img = cv2.morphologyEx(thresh_img, cv2.MORPH_CLOSE, kernel)

在此处输入图像描述

以上是同时使用大津阈值和形态关闭的结果

您或许可以采取以下步骤:

  1. 使用 Otsu 阈值cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)获得仅纯白色和纯黑色的图像。(感谢@HKoshdel 指出)
  2. 使用霍夫变换查找图像中的曲线。(OpenCV只有直线的霍夫变换,你可以自己写一个来检测曲线 。http: //en.wikipedia.org/wiki/Generalised_Hough_transform
  3. 过滤掉小于或等于一个字母宽度的曲线线
  4. 现在从左到右逐个像素地遍历曲线,当它很细时删除它(当上下只有少量相同颜色的像素时),当它很粗时保留它(当它打断单词时)

最后,这种方式应该可以返回一个没有曲线并且有所有完整字母的图像