史蒂夫与MATLAB图像处理

图像处理的概念、算法和MATLAB

bwlabel搜索顺序

我已经收到了几个问题在过去几个月里搜索的功能bwlabel以及是否可以改变。今天的文章讨论了搜寻顺序问题,如何有用它可能或可能不会改变它,以及如何使用regionprops重新排序标签对象。

首先,简要回顾bwlabel:需要一个二进制图像,bw,并产生一个标签矩阵,l。L的元素是整数值大于或等于0。等于0元素的背景。等于1的元素组成一个对象,等于2的元素构成第二个对象,等等。这是一个小例子。

bw = false (5,5);bw (1:2, 1:2) = true;bw (4:5, 1:2) = true;bw (1:2, 4:5) = true;bw (4:5 4:5) = true
bw = 1 1 0 1 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 1 0 1 1
L = bwlabel (bw)
L = 1 1 0 3 3 1 1 0 3 3 0 0 0 0 0 2 2 0 4 4 2 2 0 4 4

所以bwlabel发现四个连接组的前景像素bw。自bwlabel扫描的像素bw列的顺序,它发现对象在左下角第二个,这就是为什么那些像素都贴有“2”l

有时人们问bwlabel可以搜索沿着行而不是沿着列,因为他们想让对象在右上角第二次被发现。

搜索订单bwlabel是由在MATLAB的内存存储顺序的元素。搜索沿行可能大大延缓作用。然而,它是可能的,的协助下regionprops有效的后处理输出bwlabel因此,对象是随心所欲地命令。

但我显示技术之前,我给一个例子,如何在二维排序对象并不总是简单,不管你的搜索。

这是扫描文本图像的一个片段我们之前看:

url =“https://blogs.mathworks.com/images/steve/186/scanned_page.png”;bw = imread (url);bw = ~ bw (1107:1194 17:135);imshow (bw)

也许有人会认为,bwlabel将标签左上角找到“s”作为第一个对象。但这不会发生。

L = bwlabel (bw);%显示对象标签。imshow (L = = 1)

为什么F发现第一?我们可以看到为什么放大图像的左上角。

集(gcf,“位置”,100 100 400 300)imshow (bw (1:50, 1:20),“InitialMag”,“健康”)

左上角的“F”上的衬线延伸到左边的字母“s”。Therefore, the columnwise scan performed bybwlabel首先发现“F”。

一点我们可以强制行操作标签搜索置换的二进制图像,然后输出bwlabel像这样:

L = bwlabel (bw)”;

但另一个惊喜在等待;第一个对象还没有发现“s”!

imshow (L = = 1)

找到“t”,因为“t”的垂直杆延伸高于顶部的“s”的性格。

同时,bwlabel将合并两个或两个以上的最初分配标签如果发现一路上显然两个或两个以上独立的对象实际上是连接。这可以改变标签以意想不到的方式。

记住这些警示,让我向您展示如何后处理的输出bwlabel对象进行排序。

首先,让我们使用regionprops一些对象可能有用的测量对象排序。

s = regionprops (L,的边界框(“大小),极值的,“重心”);

我们可以从左到右排序的对象根据边界框的左边缘。

盒=猫(1、s.BoundingBox);left_edge =盒(:1);(排序,sort_order) = (left_edge)进行排序;s2 = s (sort_order);

让我们想象,排序顺序。

I = im2uint8 (bw);我(~ bw) = 200;我(bw) = 240;集(gcf,“位置”,(100 100 400 300));imshow(我“InitialMag”,“健康”)举行k = 1:元素个数(s2)质心= s2 (k) .Centroid;文本(质心(1),重心(2),sprintf (' % d '、k));结束持有

一点,根据行操作搜索顺序,按字母排序(使用sortrows而不是排序在最左边的每个对象的极值。这是第一行的极值极值的输出regionprops

极值=猫(1、s.Extrema);left_most_top =极值(1:8:最终,);[排序,sort_order] = sortrows (fliplr (left_most_top));s2 = s (sort_order);imshow(我“InitialMag”,“健康”)举行k = 1:元素个数(s2)质心= s2 (k) .Centroid;文本(质心(1),重心(2),sprintf (' % d '、k));结束持有

注意人物仍然没有秩序井然的从左到右。这是因为高的得到排序。我们先试试排序在底部的每个字符而不是顶部,底部和量化坐标。最左边底部极值是6行极值的测量。

left_most_bottom =极值(6:8:最终,);左= left_most_bottom (: 1);底= left_most_bottom (:, 2);%数字转换坐标底部底= 6 *轮(底/ 6);[排序,sort_order] = sortrows((左下));s2 = s (sort_order);imshow(我“InitialMag”,“健康”)举行k = 1:元素个数(s2)质心= s2 (k) .Centroid;文本(质心(1),重心(2),sprintf (' % d '、k));结束持有

这是更好的,但进一步我想象一些高级分析文本的结构线在图像是必要的。

请注意,我没有修改标签的矩阵,l,在这些后处理步骤。下次我将展示如何重新贴标签于l




使用MATLAB®7.6发表

|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。