我对车牌号码做了一些识别,但当我对它们进行提取时,我被卡住了。我读过引用,状态我必须执行水平秩过滤,但我不知道如何去做。
代码:
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;我正在使用水平秩滤波来提取版本号。
发布于 2016-09-21 06:14:37
我只是尝试了一个代码来处理这个特定的图像,但不是一般的。这里我们有输入图像。
a = imread('Izy.jpg');
b = imresize(a,0.5);
c = rgb2gray(b);
这里之前的代码将图像读入变量a
,将其缩小到一半大小(存储在b
中),然后将其从3通道图像转换为灰度(存储在c
中)。我建议使用Canny边缘检测器而不是Prewitt检测器,如下所示:
Gpx = edge(c,'canny');
L = bwlabel(Gpx,8);
Gpx
中)将有多个前景图像或区域。区域是像素的集合,每个成员像素连接到至少一个相邻像素。使用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);
这将产生以下结果:
https://stackoverflow.com/questions/39586904
复制相似问题