【问题标题】:Denoise and filter an image去噪和过滤图像
【发布时间】:2016-12-13 17:29:57
【问题描述】:

我正在进行车牌识别。我剪掉了盘子,但它非常模糊。因此我无法拆分数字/字符并识别它。

这是我的图片:

我已经尝试通过 scikit image 功能对其进行去噪

首先,导入库:

import cv2
from skimage import restoration
from skimage.filters import threshold_otsu, rank
from skimage.morphology import closing, square, disk

然后,我读取图像并将其转换为灰度

image = cv2.imread("plate.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

我尝试消除噪音

denoise = restoration.denoise_tv_chambolle(image , weight=0.1)
thresh = threshold_otsu(denoise)
bw = closing(denoise  > thresh, square(2))

我得到的是:

如您所见,所有数字混合在一起。因此,我无法将它们分开并逐个识别字符。

我期望的是这样的(我画的):

我正在寻求帮助如何更好地过滤图像?谢谢。

================================================ ======================= 更新

使用skimage.morphology.erosion后,得到:

【问题讨论】:

  • 您可以利用大量模糊,尝试使用大内核的opening。让我们知道您获得的结果..
  • “尝试opening with large kernel”是什么意思
  • 我的意思是 open 形态学运算,即 erode 后跟 dilate。尝试使用大内核并尝试不同的大小。
  • 其实@CLWONG,我不熟悉 scikit,但我可以在 OpenCV 中提供帮助。另一种方法是您应该阅读如何修改 api 中的结构元素。谷歌是您的朋友。形态学是基础知识,从长远来看会对您有所帮助,因此我建议您学习它们。
  • 在我看来,您不会通过任何图像处理从此类数据中获得合理的准确性。这是一个练习还是一个真正的应用程序?如果这是真的,我现在会投资于优化图像质量而不是代码。

标签: python image opencv image-processing scikit-image


【解决方案1】:

带有图像增强二值化内核的 ChanVeseBinarize 给了我这个结果。这有助于突出显示 4、8、1 和 2。我想您需要对每个字符进行单独的卷积,如果卷积的峰值高于阈值,我们可以假设该字母出现在峰值的位置.为了处理失真,您需要对给定字符的几种不同类型的字体进行卷积。

使用导数滤波器和一点点高斯平滑的另一个潜在改进。 K & X 不像之前的解决方案那样失真。

【讨论】:

  • 感谢您的回复。哪个 Python 库包含函数 ChanVeseBinarize
  • 我使用了具有直接实现的mathematica...我可以在Python 中找到的壁橱是github.com/kevin-keraudren/chanvese....I 有一点更好的解决方案,但会在它更确定之后发布。
【解决方案2】:

我同意您应该尝试优化输入图像质量的观点。

车牌模糊是运动模糊的典型示例。 去模糊的效果取决于模糊半径的大小。 一般车速越大,模糊半径越大,还原难度越大。

一个比较有效的简单解决方案是对图像进行去隔行扫描。

请注意,它仅比您的输入图像更具可读性。 在这里,我删除了每一行,并使用 PIL/Pillow 将图像大小调整为一半,这就是我得到的:

from PIL import Image
img=Image.open("license.jpeg")
size=list(img.size)
size[0] /= 2
size[1] /= 2
smaller_image=img.resize(size, Image.NEAREST)
smaller_image.save("smaller_image.png")

下一个更正式的方法是反卷积

由于模糊是使用图像的卷积来实现的,因此去模糊需要对图像进行卷积或反卷积的逆运算。有多种反卷积算法,例如 Wiener 反卷积, Richardson-Lucy 方法、Radon 变换和几种贝叶斯滤波。

您可以使用此code 应用 Wiener 反卷积算法。玩转角度、直径和信噪比,看看它是否提供了一些改进。

skimage.restoration 模块还提供了unsupervised_wienerrichardson_lucy 反卷积的实现。

在下面的代码中,我展示了这两种实现方式,但您必须修改 psf 以查看哪个更适合。

import numpy as np
import matplotlib.pyplot as plt
import cv2
from skimage import color, data, restoration
from scipy.signal import convolve2d as conv2

img = cv2.imread('license.jpg')
licence_grey_scale = color.rgb2gray(img)

psf = np.ones((5, 5)) / 25

# comment/uncomment next two lines one by one to see unsupervised_wiener and richardson_lucy deconvolution
deconvolved, _ = restoration.unsupervised_wiener(licence_grey_scale, psf)
deconvolved = restoration.richardson_lucy(licence_grey_scale, psf)

fig, ax = plt.subplots()
plt.gray()
ax.imshow(deconvolved)
ax.axis('off')
plt.show()

不幸的是,这些反卷积算法中的大多数都需要您提前知道 模糊内核(又名点扩散函数又名 PSF)。

这里因为你不知道 PSF,所以你将不得不使用盲反卷积。 盲反卷积尝试在不了解模糊核的情况下估计原始图像。

我没有用你的图像尝试过这个,但这里是盲反卷积算法的 Python 实现: https://github.com/alexis-mignon/pydeconv

请注意,尚未发现有效的通用盲反卷积算法,并且是一个活跃的研究领域。

【讨论】:

    【解决方案3】:

    首先,这张图片似乎被模糊而不是被噪点破坏了,所以没有很好的理由去去噪,请尝试去模糊。

    最简单的方法是逆滤波,甚至是维纳滤波。然后,您需要通过亮度级别将图像的背景与字母分开,例如使用分水岭算法。然后你会得到单独的字母,你需要通过其中一个分类器,例如,基于神经网络(即使是简单的前馈网络也可以)。

    然后你最终会得到文本表示。这就是通常做出这种认可的方式。 有很好的book by Gonzalez&Woods,尝试在那里寻找详细的解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2015-07-10
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多