我面临着从车牌图像中分割字符的问题。 我使用了以下方法提取车牌字符“
如附件所示,如果车牌图像有阴影,由于二值化不当,我无法正确分割字符。图像中的阴影合并图像中的相邻字符。
我用不同的窗口大小对图像进行了阈值处理。结果附呈。如果图像中有阴影,如何从图像中分割字符?我正在使用OpenCV。
我在OpenCV中使用了以下函数来设置车牌图像的阈值:
cvAdaptiveThreshold(licensePlateImg, threshImg, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY_INV, wind);
我试过不同的窗口大小(wind
)和不同的adaptiveMethod
(ADAPTIVE_THRESH_MEAN_C and ADAPTIVE_THRESH_GAUSSIAN_C
)
获取阈值图像。
在开始之前,我知道你在OpenCV C++中寻求一个算法的实现,但是我的算法需要FFT和^ {CD1>}包是很棒的。因此,我将使用Python在OpenCV中实现该算法。代码实际上与C++ API非常相似,您可以很容易地将其转录过来。这样,它可以将我学习(或者更确切地说是重新学习)API所需的时间降到最低,我宁愿给你算法和我执行此任务所做的步骤,也不会浪费任何时间。
因此,我将给你一个大致的概述,我将做什么。然后我将向您展示使用
numpy, scipy
和OpenCV包的Python代码。作为对那些使用MATLAB的人的奖励,我会给你展示MATLAB的等价物,用MATLAB代码来引导!你能做的就是尝试使用homomorphic filtering。基本上,我们可以用光照和反射率的乘积来表示图像。假设光照是缓慢变化的,是动态范围的主要贡献者。这基本上是低频率的内容。反射率表示物体的细节,并假设变化很快。这也是造成局部对比度的主要因素,本质上是高频内容。
图像可以表示为这两者的乘积。同态滤波尝试并分割这些分量,我们分别对它们进行滤波。完成后,我们将结果合并在一起。由于这是一个乘法模型,因此通常使用log操作,以便我们可以将乘积表示为两个项的和。这两个项分别被过滤、缩放以强调或不强调它们对图像的贡献、求和,然后采取反日志。
明暗处理是由光照引起的,所以我们可以减少明暗处理对图像的贡献。我们还可以提高反射率,这样我们可以得到一些更好的边缘,因为边缘与高频信息相关联。
我们通常用低通滤光片来滤光,而用高通滤光片来滤光。在本例中,我将选择sigma为10的高斯核作为低通滤波器。通过取
1
并用低通滤波器减去即可得到高通滤波器。我将图像转换成对数域,然后使用低通和高通滤波器在频域中过滤图像。然后缩放低通和高通结果,将这些组件添加回原处,然后获取反日志。该图像现在更适合于阈值化,因为该图像具有较低的变化。作为额外的后处理,我做的是设置图像的阈值。这些字母比整体背景更暗,因此任何低于某个阈值的像素都将被归类为文本。我选择的门槛是65度。在这之后,我还清除了任何接触边界的像素,然后删除图像中总面积小于160(MATLAB)或120(Python)像素的任何区域。我还裁剪了图像中的一些列,因为它们不需要用于我们的分析。
以下是一些需要注意的事项:
警告1-去除边界
删除任何与边框接触的像素是内置在OpenCV中的而不是。然而,MATLAB有一个等价物,叫做^{} 。我将在我的MATLAB代码中使用它,但对于OpenCV,这是以下算法:
我在代码中创建了一个名为
imclearborder(imgBW, radius)
的方法,其中radius
是多少像素你想清理边界内的东西。警告2-删除特定区域下的像素区域
在OpenCV中,删除任何小于一定数量的区域也不会实现。在MATLAB中,这是使用^{} 方便地给出的。其基本算法是:
我创建了一个名为
bwareaopen(imgBW)
的方法来实现这一点。注意#3-用于删除像素区域的区域参数
对于Python代码,我不得不使用这个参数,我决定使用120。160用于MATLAB。对于python,120去掉了一些字符,这是不需要的。我猜我的
bwareaopen
实现与MATLAB的不同,这可能是我得到不同结果的原因。不用再麻烦了,这里是代码。请注意,我没有使用空间过滤。你可以在OpenCV中使用
filter2D
,并用高斯核卷积这个图像,但我没有这样做,因为使用低通和高通滤波器时,传统上是在频域进行同态滤波。您可以使用空间过滤来探索这一点,但您还必须在动手之前知道内核的大小。对于频域滤波,你只需要知道滤波器的标准差,这只是一个参数,而不是两个。另外,对于Python代码,我将您的图像下载到我的计算机上并运行脚本。对于MATLAB,在使用图像处理工具箱读取图像时,可以直接引用该图像的超链接。
Python代码
MATLAB代码
这就是我得到的结果:
Python
请注意,我重新排列了窗口,使它们在一列中对齐。
MATLAB软件
我认为如果你对你提供的第二个二值化图像应用形态学打开操作,你会得到一个好的图像。
相关问题 更多 >
编程相关推荐