首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对水平秩滤波进行边缘检测?

如何对水平秩滤波进行边缘检测?
EN

Stack Overflow用户
提问于 2016-09-20 06:13:58
回答 1查看 322关注 0票数 0

我对车牌号码做了一些识别,但当我对它们进行提取时,我被卡住了。我读过引用,状态我必须执行水平秩过滤,但我不知道如何去做。

代码:

代码语言:javascript
运行
复制
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;我正在使用水平秩滤波来提取版本号。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-21 06:14:37

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

代码语言:javascript
运行
复制
a = imread('Izy.jpg');
b = imresize(a,0.5);
c = rgb2gray(b);

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

代码语言:javascript
运行
复制
Gpx = edge(c,'canny');
L = bwlabel(Gpx,8);

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

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

代码语言:javascript
运行
复制
imgstat = regionprops(L,'Area','Eccentricity');
area = [imgstat.Area];
ecc = [imgstat.Eccentricity];

由于我们在图像中有129个(size(imgstat))区域,每个区域都会有一些区域和偏心值。使用试用和错误来标识areaeccentricity属性的所需值。

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

代码语言:javascript
运行
复制
label = find((area > 150) & (ecc < 0.95) & (ecc > 0.9));
logical_result = ismember(L,label);
figure;imshow(logical_result)

存储在logical_result中的图像

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

代码语言:javascript
运行
复制
[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);

这将产生以下结果:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39586904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档