用MATLAB进行图像处理

图像处理概念、算法和MATLAB

无偏差计数物体

在今天的文章中,我想看看两种计算单位面积对象的方法。例如,我们如何估计这幅图像中单位面积的物体数量:

我可以简单地计算连接组件的数量,然后划分整个图像区域。(在本文中,我假设每个像素的面积为1.0。)

url =“https://blogs.mathworks.com/images/steve/2012/rice - bw - 2. - png”;bw = imread (url);cc = bwconncomp (bw)
cc = Connectivity: 8 ImageSize: [256 256] NumObjects: 95 PixelIdxList: {1x95 cell}
objects_per_unit_area = cc.NumObjects / (bw,1) * size(bw,2))
objects_per_unit_area = 0.0014

然而,这种方法是错误的图像处理手册, John C. Russ,第5版,CRC出版社,2007,第565-567页。“当特征与视场边缘相交时,计算所有能看到的特征是不恰当的。”Russ给出了两种更好的方法。

第一种方法忽略接触一对相邻边的对象,比如上边和左边。Russ指出,这“相当于根据每个特征的右下角来计数”,并将其类比为通过数鼻子来计数房间里的人数。(我得问一下开发商计算机视觉系统工具箱团队寻求鼻子检测的帮助。)

图像处理工具箱有一个功能,imclearborder,删除所有触摸图像边界的对象。稍加创新,我们就可以使用该函数来标识所有不触及顶部和左侧边框的对象。

我们首先在图像的左侧和顶部填充0。

Bw2 = padarray(bw,[1 1],0,“以前”);

由于填充,没有对象接触的左边框和顶边框bw2.调用imclearborder然后,在这个图像上,将删除原始图像中所有接触底部和右侧边框的对象,但它将保留接触顶部和左侧边框的对象。

bw3 = imclearborder (bw2);

现在让我们删除左边的填充列和顶部的填充行。

bw4 = bw3(2:结束,2:结束);imshow (bw4)

现在单位面积的物体数量是多少?

cc = bwconncomp (bw4);objects_per_unit_area_2 = cc.NumObjects / (size(bw4,1) * size(bw4,2))
objects_per_unit_area_2 = 0.0013

第一种方法计算了原始图像中的所有物体,误差在10-11%左右。

/ /使用abs_per_unit_area - objects_per_unit_area...objects_per_unit_area
ans = 0.1053

Russ描述的另一种方法是对所有不接触任何边缘的物体进行加权计数。重量计数补偿了具有一定水平和垂直范围的物体接触特定视场边缘的相对可能性。每个对象的加权计数的公式为

$ C = \frac{W_x W_y}{(W_x - F_x) (W_y - F_y)} $$

其中$W_x$和$W_y$是图像在x和y方向上的尺寸,$F_x$和$F_y$是对象在这些方向上的最大投影尺寸。

我们利用了图像处理工具箱的功能regionprops来计算每个对象的边界框,从中我们可以确定$F_x$和$F_y$。

先清理所有触摸任何图像边界的对象。

bw5 = imclearborder (bw);

接下来,计算所有剩余对象的边界框。

s = regionprops (bw5的边界框(“大小));

例如,这是第五个被检测到的物体的边界框:

(5)
ans = BoundingBox: [17.5000 166.5000 20 24]

我将使用MATLAB的高级语法来转换结构数组年代变成一个普通的p × 4矩阵包含所有的边界框。第二行代码显示前7个对象的边界框。

s.BoundingBox bboxes =猫(1);: bboxes (1:7)
Ans = 9.5000 86.5000 25.0000 17.0000 10.5000 18.5000 26.0000 16.0000 17.5000 37.5000 19.0000 23.0000 17.5000 108.5000 10.0000 29.0000 17.5000 166.5000 20.0000 24.0000 23.5000 59.5000 9.0000 31.0000 28.5000 212.5000 17.0000 28.0000

$F_x$是第三列,$F_y$是第四列。

Fx = bboxes (: 3);财政年度= bboxes (: 4);

$W_x$和$W_y$是根据图像的大小计算的。

(王寅,Wx) = (bw)大小;

现在计算一个加权计数的向量,每个对象不接触边界。

C = (Wx *王寅)。/ ((Wx - Fx)。*(王寅-财政年度));C (1:7)
Ans = 1.1871 1.1872 1.1868 1.1736 1.1970 1.1792 1.2027

最后一步是将计数相加,然后除以总图像面积。

objects_per_unit_area = sum(C) / (Wx*Wy)
objects_per_unit_area_3 = 0.0012

Russ评论说,最后一种方法可能对包含非凸对象的图像效果更好,这些对象可能会多次接触图像边界。

您在自己的工作中是否需要进行这种计算?请留下评论,告诉我们你的申请。




MATLAB®R2012b发布

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里以登录您的MathWorks帐户或创建一个新的帐户。