【问题标题】:How to denoise the image如何对图像进行去噪
【发布时间】:2019-10-07 15:17:04
【问题描述】:

我正在构建一个应用程序来识别一些图片。下面是示例:

下面是我用来转换图片的代码:

img = cv2.imread('9jxs.png', 0)
ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
plt.figure()
plt.subplot(221), plt.imshow(img, 'gray')
plt.show()

很明显,图片的结果是“9JXS”,我的问题是如何删除噪声像素,清理图片,然后我可以使用OCR组件识别

【问题讨论】:

  • 我觉得这个问题太笼统了。有很多选项可以实现您的需求。作为第一种方法:您可以尝试更改此行中的阈值 ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) 以将它们调整为文本/噪声的值。尽管可能每次噪音都以不同的音调出现。如果情况是它们总是较暗,您可以检测它们,计算轮廓并随后将它们从原始图像中删除。

标签: python opencv ocr


【解决方案1】:

对于这种特殊类型的图片,与图片的其余部分相比,线条似乎要暗得多。我会找到图片的min(),并将所有落在最小值 10% 以内的像素替换为邻居的平均值,或者更好的是,中值。

【讨论】:

  • 这是一个聪明的方法。如果没有测试,恐怕这会使 X 难以辨认 ocr
  • @MadPhysicist “不要害怕!” (c) =)
  • 可以制作图像的直方图并丢弃除中间峰值以外的所有内容
【解决方案2】:

恐怕这个问题没有简单的解决方案,否则验证码就没用了。 您可以尝试手动调整范围选择的参数并结合一些侵蚀,但我想这对于一般情况来说很难自动化。

import cv2 as cv
import numpy as np

def on_lb_trackbar(val):
    global lb
    lb = val
    cv.imshow(title, cv.erode(cv.inRange(img,lb,ub),erosion_kernel))

def on_ub_trackbar(val):
    global ub
    ub = val
    cv.imshow(title, cv.erode(cv.inRange(img,lb,ub),erosion_kernel))

img = cv.imread(r'udilN.png',cv.IMREAD_GRAYSCALE)

lb = 0
ub = 255
title = 'Range selection'
erosion_kernel = np.ones((5,3), np.uint8)

cv.namedWindow(title)
cv.createTrackbar('from', title , lb, 255, on_lb_trackbar)
cv.createTrackbar('to', title , ub, 255, on_ub_trackbar)

on_lb_trackbar(0)

【讨论】:

  • 嗨,Stef,感谢您的回复!图片和最终结果非常接近,我试了57和198的数字,但不能得到相同的结果,我们使用的图片是一样的吗?
  • 是的,这是您在问题中发布的图片,我只是手动裁剪它以删除轴并将其重新保存到原始 png 文件中。 Here 是裁剪前的原始版本。
猜你喜欢
  • 1970-01-01
  • 2014-04-25
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多