降噪并过滤图像

VIC*_*TOR 9 python opencv image image-processing scikit-image

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

这是我的形象:

在此输入图像描述

我试图通过使用scikit图像功能去噪它.

首先,导入库:

import cv2
from skimage import restoration
from skimage.filters import threshold_otsu, rank
from skimage.morphology import closing, square, disk
Run Code Online (Sandbox Code Playgroud)

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

image = cv2.imread("plate.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Run Code Online (Sandbox Code Playgroud)

我试着消除噪音:

denoise = restoration.denoise_tv_chambolle(image , weight=0.1)
thresh = threshold_otsu(denoise)
bw = closing(denoise  > thresh, square(2))
Run Code Online (Sandbox Code Playgroud)

我得到的是:

在此输入图像描述

如您所见,所有数字都混合在一起.因此,我无法将它们分开并逐一识别这些角色.

我期待的是这样的(我画它):

在此输入图像描述

我正在寻求帮助,我怎样才能更好地过滤图像?谢谢.

================================================== =================== 更新:

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

在此输入图像描述

bha*_*arc 7

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

车牌模糊是运动模糊的典型示例.你的deburur有多好取决于模糊半径的大小.通常车辆的速度越大,模糊半径越大,因此更难以恢复.

有点工作的简单解决方案是对图像进行去隔行扫描.

在此输入图像描述

请注意,它只比输入图像稍微可读.在这里,我已经删除了每个备用线,并使用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")
Run Code Online (Sandbox Code Playgroud)

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

由于使用图像的卷积来实现模糊,因此去模糊需要进行图像的卷积或反卷积的逆.存在各种类型的反卷积算法,例如Wiener反卷积,Richardson-Lucy方法,Radon变换和一些类型的贝叶斯滤波.

您可以使用此代码应用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()
Run Code Online (Sandbox Code Playgroud)

不幸的是,大多数这些反卷积算法都要求您事先知道模糊内核(也称为点扩散函数,即PSF).

因为你不知道PSF,所以你必须使用盲解卷积.盲解卷积试图在不知道模糊内核的情况下估计原始图像.

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

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


tho*_*nev 6

首先,这个图像看起来更像是模糊,而不是通过noize,所以没有充分的理由对其进行去噪,而是尝试去模糊.

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

然后你最终会获得文本表示.这就是通常如此认可的方式.Gonzalez&Woods有一本好书,试着在那里寻找详细的解释.


Pal*_*Pal 1

使用带有二值化内核的 ChanVeseBinarize 的结果

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

在此输入图像描述

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