对图像进行降噪和过滤

时间:2016-08-08 03:08:07

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

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

这是我的形象:

enter image description here

我尝试使用 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))

我得到的是:

enter image description here

如您所见,所有数字都是混合在一起。因此,我无法将分开并逐一识别这些字符。

我期待的是这样的事情(我画了):

enter image description here

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

=============================================== ====================== 的更新

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

enter image description here

2 个答案:

答案 0 :(得分:6)

首先,这个图像似乎比模糊更加污损,而不是noize,所以没有充分的理由对其进行去噪,而是尝试去除。

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

然后你终于得到了文字表达。这就是通常如此认可的方式。 有好的book by Gonzalez&Woods,试着在那里寻找详细的解释。

答案 1 :(得分:1)

result using ChanVeseBinarize with binarized kernel

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

enter image description here

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