用MATLAB进行图像处理

图像处理概念,算法和MATLAB

使用imclearborder或regionprops识别边界接触对象

我看到过一些与识别二值图像中接触图像边界的对象有关的请求和问题。有时这个问题与…的用法有关 imclearborder ,有时问题是关于 regionprops .今天,我将向您展示如何以两种方式解决这个问题。

使用imclearborder

我将使用图像处理工具箱中的rice.png样本图像的二进制版本。
url =“https://blogs.mathworks.com/steve/files/rice - bw - 1. - png”
A = imread(url);
imshow (A)
这个函数 imclearborder 移除所有接触边界的对象。
B =不透明(A);
imshow (B)
这似乎与我们想要的正好相反。但是,我们可以通过使用MATLAB元素逻辑运算符将其转换为所需的结果,例如 (和) | (或) (不)。换句话说,我们想要的是前景像素 一个 而不是在 B .作为MATLAB表达式,它看起来像这样:
C = a & ~ b;
imshow (C)

使用regionprops

这个函数 regionprops 可以计算二进制图像对象的各种属性。下面是一个简单的例子,计算样本图像中每个物体的面积和质心。我用的形式是 regionprops 返回一个表。
道具=区域道具(“表”,,“面积”“重心”])
t = 97×2表
区域 重心
1 138 5.9855 35.0870
2 121 6.4463 62.0579
3. 67 2.1045 85.1940
4 178 4.5056 117.5674
5 157 9.4650 141.2675
6 286 11.8007 168.5350
7 195 12.0872 205.2974
8 135 9.4296 223.0296
9 176 21.3693 95.9716
10 208 24.1971 26.3125
11 199 28.1859 48.2563
12 188 22.1011 122.6011
13 216 28.2778 179.4630
14 143 28.3427 251.9720
我的寻找边界接触物体的技巧 regionprops 使用 BoundingBox 属性,因此包括该属性以及您想要度量的任何其他属性。
道具=区域道具(“表”,,区域,质心,边界框])
t = 97×3表
区域 重心 BoundingBox
1 138 5.9855 35.0870 0.5000 22.5000 13 22
2 121 6.4463 62.0579 0.5000 53.5000 13 16
3. 67 2.1045 85.1940 0.5000 73.5000 4 23
4 178 4.5056 117.5674 0.5000 102.5000 10 28
5 157 9.4650 141.2675 0.5000 132.5000 20. 16
6 286 11.8007 168.5350 0.5000 152.5000 26 33
7 195 12.0872 205.2974 0.5000 199.5000 24 12
8 135 9.4296 223.0296 0.5000 218.5000 20. 10
9 176 21.3693 95.9716 9.5000 86.5000 25 17
10 208 24.1971 26.3125 10.5000 18.5000 26 16
11 199 28.1859 48.2563 17.5000 37.5000 19 23
12 188 22.1011 122.6011 17.5000 108.5000 10 29
13 216 28.2778 179.4630 17.5000 166.5000 20. 24
14 143 28.3427 251.9720 18.5000 245.5000 23 11
对于任何特定的物体, BoundingBox 包含边界框的左、顶、宽和高的四元素向量。例如,这里是第20个对象的边界框:
: props.BoundingBox(20日)
ans = 1×4
35.5000 113.5000 9.0000 28.0000
通过将这些值与图像的大小进行比较,我们可以识别哪些物体接触了图像边界。
首先确定触及特定边界的对象。
left_coordinate = props.BoundingBox(:,1);
道具。TouchesLeftBorder = (left_coordinate == 0.5);
top_coordinate = props.BoundingBox(:,2);
道具。TouchesTopBorder = (top_coordinate == 0.5);
right_coordinate = left_coordinate + props.BoundingBox(:,3);
bottom_coordinate = top_coordinate + props.BoundingBox(:,4);
[M,N] = size(A);
道具。TouchesRightBorder = (right_coordinate == (N+0.5));
道具。TouchesBottomBorder =(底部坐标= (M+0.5))
t = 97×7表
区域 重心 BoundingBox TouchesLeftBorder TouchesTopBorder TouchesRightBorder TouchesBottomBorder
1 138 5.9855 35.0870 0.5000 22.5000 13 22 1 0 0 0
2 121 6.4463 62.0579 0.5000 53.5000 13 16 1 0 0 0
3. 67 2.1045 85.1940 0.5000 73.5000 4 23 1 0 0 0
4 178 4.5056 117.5674 0.5000 102.5000 10 28 1 0 0 0
5 157 9.4650 141.2675 0.5000 132.5000 20. 16 1 0 0 0
6 286 11.8007 168.5350 0.5000 152.5000 26 33 1 0 0 0
7 195 12.0872 205.2974 0.5000 199.5000 24 12 1 0 0 0
8 135 9.4296 223.0296 0.5000 218.5000 20. 10 1 0 0 0
9 176 21.3693 95.9716 9.5000 86.5000 25 17 0 0 0 0
10 208 24.1971 26.3125 10.5000 18.5000 26 16 0 0 0 0
11 199 28.1859 48.2563 17.5000 37.5000 19 23 0 0 0 0
12 188 22.1011 122.6011 17.5000 108.5000 10 29 0 0 0 0
13 216 28.2778 179.4630 17.5000 166.5000 20. 24 0 0 0 0
14 143 28.3427 251.9720 18.5000 245.5000 23 11 0 0 0 1
最后,计算对象是否接触任何边界使用 | ,即按元素的OR运算符。
道具。TouchesAnyBorder = props。TouchesLeftBorder |...
道具。TouchesTopBorder |...
道具。TouchesRightBorder |...
道具。TouchesBottomBorder
t = 97×8表
区域 重心 BoundingBox TouchesLeftBorder TouchesTopBorder TouchesRightBorder TouchesBottomBorder TouchesAnyBorder
1 138 5.9855 35.0870 0.5000 22.5000 13 22 1 0 0 0 1
2 121 6.4463 62.0579 0.5000 53.5000 13 16 1 0 0 0 1
3. 67 2.1045 85.1940 0.5000 73.5000 4 23 1 0 0 0 1
4 178 4.5056 117.5674 0.5000 102.5000 10 28 1 0 0 0 1
5 157 9.4650 141.2675 0.5000 132.5000 20. 16 1 0 0 0 1
6 286 11.8007 168.5350 0.5000 152.5000 26 33 1 0 0 0 1
7 195 12.0872 205.2974 0.5000 199.5000 24 12 1 0 0 0 1
8 135 9.4296 223.0296 0.5000 218.5000 20. 10 1 0 0 0 1
9 176 21.3693 95.9716 9.5000 86.5000 25 17 0 0 0 0 0
10 208 24.1971 26.3125 10.5000 18.5000 26 16 0 0 0 0 0
11 199 28.1859 48.2563 17.5000 37.5000 19 23 0 0 0 0 0
12 188 22.1011 122.6011 17.5000 108.5000 10 29 0 0 0 0 0
13 216 28.2778 179.4630 17.5000 166.5000 20. 24 0 0 0 0 0
14 143 28.3427 251.9720 18.5000 245.5000 23 11 0 0 0 1 1
最后,我将对结果进行快速的可视化检查。
L = bwlabel(A);
L_touches_border = ismember(L,find(props.TouchesAnyBorder));
L_touches_border imshowpair(一个)
|
  • 打印
  • 发送电子邮件

댓글

댓글을남기려면링크를클릭하여MathWorks계정에로그하거나계정을새로만드십시오。

Baidu
map