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,我得到:
我同意你应该尝试优化输入图像质量的观点.
车牌模糊是运动模糊的典型示例.你的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_wiener和richardson_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
注意,尚未发现有效的通用盲解卷积算法,并且该算法是一个活跃的研究领域.
首先,这个图像看起来更像是模糊,而不是通过noize,所以没有充分的理由对其进行去噪,而是尝试去模糊.
最简单的是反向滤波甚至是维纳滤波.然后你需要通过光度级别将图像的背景与字母分开,例如使用分水岭算法.然后你将获得单独的字母,你需要通过一个分类器,例如,基于神经网络(即使是简单的前馈网也可以).
然后你最终会获得文本表示.这就是通常如此认可的方式.Gonzalez&Woods有一本好书,试着在那里寻找详细的解释.
使用图像增强二值化内核的 ChanVeseBinarize 给了我这个结果。这有助于突出显示 4、8、1 和 2。我想您需要对每个字符进行单独的卷积,如果卷积的峰值高于阈值,我们可以假设该字母出现在峰值位置。为了解决失真问题,您需要对给定字符的几种不同类型的字体进行卷积。
使用导数滤波器和一点高斯平滑的另一个潜在改进。K 和 X 不像以前的解决方案那样扭曲。
| 归档时间: |
|
| 查看次数: |
5149 次 |
| 最近记录: |