如何为边缘检测执行水平排序过滤?

How to perfom horizontal rank filtering for edge detection?

我对车牌号做了一些识别,但在对它们进行提取时卡住了。我读到的参考资料指出我必须执行水平排名过滤,但我不知道该怎么做。

代码:

a = imread('Izy.jpg');
b = imresize(a,0.5);
c = rgb2gray(b);
Py = [ -1,0,1; -1,0,1 ; -1,0,1];        
Gp = conv2(c,Py);
Gpx = edge(Gp,'prewitt');
cl = bwareaopen(Gpx,10);
imshow(cl)

我读过一些参考资料,说我们必须使用垂直边缘 prewitt;我正在使用水平排名过滤来提取车牌号。

我刚刚尝试了一个代码来处理这个特定的图像,但不是通用的。这里我们有输入图像。

a = imread('Izy.jpg');
b = imresize(a,0.5);
c = rgb2gray(b);

到这里为止的代码将图像读入变量 a,将其缩小到一半大小(存储在 b 中),然后将其从 3 通道图像转换为灰度图像(存储在 b 中) c)。我建议在 Prewitt 检测器上使用 Canny 边缘检测器,如下所示:

Gpx = edge(c,'canny');
L = bwlabel(Gpx,8);

  • 检测到边缘的二进制图像(存储在Gpx中)将有多个前景图像或区域。区域是像素的集合,其中每个成员像素至少连接到它的 8 个相邻像素中的一个。这些区域使用 bwlabel() 标记并存储在 L.
  • 使用regionprops('properties','properties',..),我们得到了一个结构,该结构具有图像中存在的区域的不同属性。

此处,计算区域的 areaeccentricity 属性。 eccentricity 值帮助我们识别一个区域是圆形的还是线性的。对于圆形,值为 0,对于直线,值为 1

imgstat = regionprops(L,'Area','Eccentricity');
area = [imgstat.Area];
ecc = [imgstat.Eccentricity];

由于图像中有 129 (size(imgstat)) 个区域,因此每个区域都有一些面积和偏心率值。使用反复试验来确定 areaeccentricity 属性所需的值。

应用近似的属性值得到车牌的边界,并将区域索引存储在label中。 logical_result 从标记图像中提取并存储所需区域。

label = find((area > 150) & (ecc < 0.95) & (ecc > 0.9));
logical_result = ismember(L,label);
figure;imshow(logical_result)

图像存储在logical_result

现在,从logical_result计算边界值。这些值作为索引恢复,因此我们必须使用 ind2sub() 将它们转换为下标。从边界值我们可以从原始图像中提取感兴趣的区域

[row, col] = ind2sub([size(c,1), size(c,2)],find(logical_result == 1));
result = c(min(row):max(row),min(col):max(col));
imshow(result);

结果如下: