如何为边缘检测执行水平排序过滤?
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',..)
,我们得到了一个结构,该结构具有图像中存在的区域的不同属性。
此处,计算区域的 area
和 eccentricity
属性。 eccentricity
值帮助我们识别一个区域是圆形的还是线性的。对于圆形,值为 0
,对于直线,值为 1
imgstat = regionprops(L,'Area','Eccentricity');
area = [imgstat.Area];
ecc = [imgstat.Eccentricity];
由于图像中有 129 (size(imgstat)
) 个区域,因此每个区域都有一些面积和偏心率值。使用反复试验来确定 area
和 eccentricity
属性所需的值。
应用近似的属性值得到车牌的边界,并将区域索引存储在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);
结果如下:
我对车牌号做了一些识别,但在对它们进行提取时卡住了。我读到的参考资料指出我必须执行水平排名过滤,但我不知道该怎么做。
代码:
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',..)
,我们得到了一个结构,该结构具有图像中存在的区域的不同属性。
此处,计算区域的 area
和 eccentricity
属性。 eccentricity
值帮助我们识别一个区域是圆形的还是线性的。对于圆形,值为 0
,对于直线,值为 1
imgstat = regionprops(L,'Area','Eccentricity');
area = [imgstat.Area];
ecc = [imgstat.Eccentricity];
由于图像中有 129 (size(imgstat)
) 个区域,因此每个区域都有一些面积和偏心率值。使用反复试验来确定 area
和 eccentricity
属性所需的值。
应用近似的属性值得到车牌的边界,并将区域索引存储在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);
结果如下: