在MATLAB中计算与图像边框相交的对象数

信息处理 matlab 图像分割
2022-01-14 13:13:35

我有一个带有各种标志的 RGB 图像。我的主要目标是计算与图像边界接触的标志。

方法和问题

我首先加载图像 [图。1],然后将其转换为灰度并应用中值滤波器以去除一些噪声[图。2]。然后我用 0.2 的阈值对其进行二值化,得到图 3。此时我得到了我的二值化图像,但问题是属于同一符号的某些部分出现在各个区域,而不是仅一个区域。现在我的目标是合并属于同一个对象的区域,这样我就可以用它bwlabel来计算图像中有多少个标志,并用imclearborder它来去除边界中的那些,然后bwlabel再次使用来获得两者之间的差异他们俩。

我的方法是使用bwmorph,Dilate来扩大对象,然后尝试用 , 填充imfill它们holes但问题是,如果我少量扩张它们[图。4],imfill似乎没有填充它们,如果我将它们放大大量[图 5] 所有对象开始合并:(

代码

img=im2double(imread('image.png')); figure, imshow(img) 
img_gray=rgb2gray(img); imshow(img_gray);                                 
img_mediana=medfilt2(img_gray, [3 3]); figure, imshow(img_mediana);       
img_bin=im2bw(img_mediana, 0.2); imshow(img_bin)
img_dilate=bwmorph(img_bin, 'Dilate', 10); imshow(img_dilate)
img_fill=imfill(img_dilate, 'Holes'); figure, imshow(img_fill)

图 1

图 1 http://dl.dropbox.com/u/5272012/1.png

图 2

图 2 http://dl.dropbox.com/u/5272012/2.png

图 3

图 3 http://dl.dropbox.com/u/5272012/3.png

图 4

图 4 http://dl.dropbox.com/u/5272012/4.png

图 5

图 5 http://dl.dropbox.com/u/5272012/5.png

2个回答

在我看来,膨胀侵蚀是非常基本的工具。你有一个非常强大的信息库和相当不错的输入图像来做出这样的决定。

这是我的看法:

  1. 如果您从图 1 到图 3 取得了合理的成功,您可以识别和分割单个标志。

  2. 假设您事先知道符号,您可以应用一个不错的快速算法来进行模式匹配。如果不知道确切的图案 - 您可以识别图案的外部形状。

  3. 根据分类,您始终可以定义每个匹配图案的质心及其各自的宽度和高度。如果质心 X,Y 位置太靠近边界 - 即它位于边缘之外,同样您也可以申请 Y 轴。centroid(x)<0centroid(x)>imagewidthshapewidth

  4. 鉴于您只关心边缘上的内容 - 您应该只从每个边缘开始并从那里开始模式匹配。开始匹配部分图案/形状,如果部分图案/形状与边缘上正在切割的对象匹配

这里有一些参考资料可以帮助您很好地阐述问题。

这篇论文非常有助于了解有关您正在处理的标志/令牌的许多基础知识。

Anil K. Jain 和 Aditya Vailaya 基于形状的检索:商标图像数据库的案例研究 模式识别 1998 年,第一卷。31,第 9 期,第 1369-1390 页

有许多研究元素涉及部分或被遮挡的形状/模式匹配。

Eli Saber,Yaowu Xu, A. Murat Tekalp Partial shape recognition by sub-matrix matching for partial matching guide image labeling Pattern Recognition 38 (2005) 1560 – 1573

如果您采用这种方法,将为更具体的查询扩展此答案。

这是一个与您所寻求的相反的灵感。

从图3开始。

% Find background
labels = bwlabel(~fig3);
[n,idx] = hist(labels(:),0:max(labels(:)));
[bgrSize bgrLableIdx] = max(n);
bgr = (labels == idx(bgrLableIdx));
bgr = imopen(bgr,strel('disk',3));

% Remove border objects and cleanup
borderCleared = imclearborder(~bgr);
borderCleared = imopen(borderCleared,strel('disk',3));

在此处输入图像描述