OpenCV-去除图像中的噪点
c++
image-processing
opencv
5
0

我在这里有一张桌子的图像。.在右边的列中,背景充满了噪点

如何检测有噪声的区域?我只想对有噪声的零件应用某种滤波器,因为我需要对其进行OCR,任何一种滤波器都会降低整体识别度

哪种滤镜最能消除图像中的背景噪声?

如前所述,我需要对图像进行OCR

在此处输入图片说明

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

结果:

在此处输入图片说明

收藏
评论

我在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))

替代方法的最终结果

最后结果希望能帮助到你!

收藏
评论

据我所知,中值滤波器是降低噪声的最佳解决方案。我建议对3x3窗口使用中值过滤器。参见函数cv :: medianBlur()

但是在与OCR同时使用任何噪音过滤功能时要小心。它会导致识别精度下降。

另外,我建议尝试使用一对函数(cv :: erode()和cv :: dilate())。但是我不确定这将是最好的解决方案,然后使用窗口3x3的cv :: medianBlur()。

收藏
评论

我会使用中值模糊(可能是5 * 5内核)。

如果您打算应用OCR图像。我建议您注意以下几点:

  1. 使用中值过滤器过滤图像。
  2. 在过滤后的图像中查找轮廓,您将仅获得文本轮廓(将其称为F )。
  3. 在原始图像中查找轮廓(将其称为O )。
  4. 隔离O中与F中任何轮廓相交的所有轮廓。

更快的解决方案:

  1. 在原始图像中查找轮廓。
  2. 根据大小过滤它们。
收藏
评论

我的解决方案基于阈值,只需4个步骤即可得到结果图像。

  1. 通过OpenCV 3.2.0读取图像。
  2. 应用GaussianBlur()平滑图像,尤其是灰色区域。
  3. 遮盖图像以将文本更改为白色,其余部分更改为黑色。
  4. 将遮罩的图像反转为白色的黑色文本。

该代码在Python 2.7 。可以轻松将其更改为C++

import numpy as np
import cv2
import matplotlib.pyplot as plt
%matplotlib inline 

# read Danish doc image 
img = cv2.imread('./imagesStackoverflow/danish_invoice.png')

# apply GaussianBlur to smooth image
blur = cv2.GaussianBlur(img,(5,3), 1) 

# threshhold gray region to white (255,255, 255) and sets the rest to black(0,0,0)
mask=cv2.inRange(blur,(0,0,0),(150,150,150))

# invert the image to have text black-in-white
res = 255 - mask

plt.figure(1)
plt.subplot(121), plt.imshow(img[:,:,::-1]), plt.title('original') 
plt.subplot(122), plt.imshow(blur, cmap='gray'), plt.title('blurred')
plt.figure(2)
plt.subplot(121), plt.imshow(mask, cmap='gray'), plt.title('masked')
plt.subplot(122), plt.imshow(res, cmap='gray'), plt.title('result')
plt.show()

以下是通过代码绘制的图像,以供参考。

在此处输入图片说明

这是2197 x 3218像素的结果图像

在此处输入图片说明

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号