首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >去噪和滤波图像

去噪和滤波图像
EN

Stack Overflow用户
提问于 2016-08-08 03:08:06
回答 3查看 7.1K关注 0票数 10

我正在做一个车牌识别。我已经把盘子剪出来了,但是它是非常模糊的。因此,我无法拆分数字/字符并识别它。

这是我的形象:

我尝试通过使用scikit图像函数来去除 it。

首先,导入库:

代码语言:javascript
复制
import cv2
from skimage import restoration
from skimage.filters import threshold_otsu, rank
from skimage.morphology import closing, square, disk

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

代码语言:javascript
复制
image = cv2.imread("plate.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

我试着用消除噪音

代码语言:javascript
复制
denoise = restoration.denoise_tv_chambolle(image , weight=0.1)
thresh = threshold_otsu(denoise)
bw = closing(denoise  > thresh, square(2))

我得到的是:

如您所见,所有的数字都是混合在一起的。因此,我无法分离并逐个识别字符。

我所期望的是这样的东西(我画的):

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

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

在使用skimage.morphology.erosion之后,我得到了:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-17 03:40:07

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

另一个潜在的改进使用导数滤波器和一点点高斯平滑。K&X不像以前的解那样扭曲。

票数 1
EN

Stack Overflow用户

发布于 2016-08-15 16:49:36

首先,这个图像似乎更容易被模糊所玷污,而不是被noize所玷污,所以没有充分的理由去淡化它,而是尝试去模糊化。

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

然后你最终会得到文本表示。这就是人们通常如何认识到的。有好的冈萨雷斯和伍兹的书,尝试寻找详细的解释那里。

票数 7
EN

Stack Overflow用户

发布于 2016-08-16 09:27:06

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

车牌模糊是运动模糊的一个典型例子。你的模糊度取决于模糊半径有多大或多小。一般情况下,车速越大,模糊半径越大,因此很难恢复。

一个简单的解决方案,多少有些工作是去交错的图像。

请注意,它只比输入图像的可读性略高。在这里,我删除了每一条备用行,并使用PIL/Pillow将图像调整到一半大小,这就是我得到的结果:

代码语言:javascript
复制
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")

下一个也是更正式的方法是deconvolution.。

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

您可以使用此代码应用Wiener反褶积算法。播放角度,直径和信噪比,看看它是否提供了一些改进。

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

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

代码语言:javascript
复制
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

值得注意的是,一个有效的通用盲反褶积算法尚未被发现,是一个活跃的研究领域。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38820743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档