基于matlab的props = regionprops(I4, 'BoundingBox');的作用
时间: 2024-02-05 07:03:15 浏览: 167
在MATLAB中,regionprops函数的第二个参数可以指定需要计算的区域属性,例如,'BoundingBox'表示计算物体的最小外接矩形。因此,使用语句props = regionprops(I4, 'BoundingBox')可以计算出二值图像I4中的所有连通区域的最小外接矩形,并将结果存储在结构体数组props中。
该语句的作用是获取二值图像I4中所有连通区域的最小外接矩形。这些矩形可以用于目标检测、运动跟踪等应用中,例如可以在图像中标记出物体的位置和大小,或者计算物体的运动轨迹等。此外,BoundingBox是regionprops函数中一个计算速度较快的属性,因此在需要处理大量图像数据时,使用BoundingBox可以提高程序的运行速度。
相关问题
props1 = regionprops(labeledRegions1, ‘Centroid’, ‘Area’,‘Perimeter’, ‘BoundingBox’);怎么将’Centroid’的信息单独提取出来有多少办法
在MATLAB或类似环境中,当你使用`regionprops`函数时,例如`props1 = regionprops(labeledRegions1, 'Centroid', 'Area', 'Perimeter', 'BoundingBox')`,它会返回一个结构数组,其中包含每个区域的各种属性,包括`'Centroid'`。如果你想单独提取`Centroid`信息,可以按照以下步骤操作:
1. **直接访问**:你可以通过`props1 Centroid`直接访问这个属性,但结果通常是每个区域的`Centroid`作为矩阵的形式,每一行代表一个区域的坐标(可能二维)。
```matlab
centroids = props1.Centroid;
```
2. **循环提取**:如果你需要逐个区域的`Centroid`值,可以使用`numel(props1)`来获取区域的数量,然后用循环来读取每个区域的坐标。
```matlab
numRegions = numel(props1);
centroids = zeros(numRegions, 2); % 假设Centroid是二维的
for i = 1:numRegions
centroids(i,:) = props1(i).Centroid;
end
```
3. **分量提取**:如果你只需要`Centroid`的第一个分量(假设是x坐标),可以用`props1.Centroid(:,1)`;同样,第二分量(y坐标)可以用`props1.Centroid(:,2)`。
4. **创建结构体变量**:如果你想将`Centroid`作为单独的结构体存储,可以创建一个新的结构体变量接收这些信息,如`centroidsStruct = cell(size(props1))`, 然后对每个元素赋值。
```matlab
for i = 1:numel(props1)
centroidsStruct{i} = props1(i).Centroid;
end
```
clc I=imread('D:\课设图片\1.jpg'); [H,W,G]=size(I) ; subplot(331),imshow(I),title('原图'); I1=im2bw(I,0.6); subplot(332),imshow(I1),title('二值化'); se=strel('disk',5); I2=imclose(I1,se); I3=imopen(I2,se); I4=imopen(I3,se); subplot(333),imshow(I4),title('开运算闭运算'); L=bwlabel(I4); L1=edge(L,'canny'); subplot(334),imshow(L1),title('canny算子分割结果'); SE = strel('disk', 4); J = imdilate(I4, SE); subplot(335),imshow(J),title('1'); % 将二值图像转化为连通域标记图像 cc = bwconncomp(J); L = labelmatrix(cc); % 计算所有连通域的属性 props = regionprops(cc, 'area', 'BoundingBox'); % 根据面积筛选出面积大于 1000 的连通域 idx = find(area >= 2000 & area <= 3800); % 创建不同形状的平行四边形 ps1 = polyshape([200 236 315 300],[360 160 180 360]); ps2 = polyshape([420 500 400 350],[360 360 190 220]); % 绘制框选形状 figure; imshow(I); hold on; for i = 1:length(idx) % 判断连通域是否在 ps1 中 if ps1.isinterior(props(idx(i)).BoundingBox(1:2)) plot(ps1); end % 判断连通域是否在 ps2 中 if ps2.isinterior(props(idx(i)).BoundingBox(1:2)) plot(ps2); end end hold off;修改代码使输出的图片单独显示
你可以在每个 `subplot` 后添加 `figure;` 来使每张图片单独显示。修改后的代码如下:
```
clc
I=imread('D:\课设图片\1.jpg');
[H,W,G]=size(I) ;
figure; subplot(331),imshow(I),title('原图');
I1=im2bw(I,0.6);
figure; subplot(332),imshow(I1),title('二值化');
se=strel('disk',5);
I2=imclose(I1,se);
I3=imopen(I2,se);
I4=imopen(I3,se);
figure; subplot(333),imshow(I4),title('开运算闭运算');
L=bwlabel(I4);
L1=edge(L,'canny');
figure; subplot(334),imshow(L1),title('canny算子分割结果');
SE = strel('disk', 4);
J = imdilate(I4, SE);
figure; subplot(335),imshow(J),title('1');
% 将二值图像转化为连通域标记图像
cc = bwconncomp(J);
L = labelmatrix(cc);
% 计算所有连通域的属性
props = regionprops(cc, 'area', 'BoundingBox');
% 根据面积筛选出面积大于 1000 的连通域
idx = find(area >= 2000 & area <= 3800);
% 创建不同形状的平行四边形
ps1 = polyshape([200 236 315 300],[360 160 180 360]);
ps2 = polyshape([420 500 400 350],[360 360 190 220]);
% 绘制框选形状
figure; imshow(I); hold on;
for i = 1:length(idx)
% 判断连通域是否在 ps1 中
if ps1.isinterior(props(idx(i)).BoundingBox(1:2))
plot(ps1);
end
% 判断连通域是否在 ps2 中
if ps2.isinterior(props(idx(i)).BoundingBox(1:2))
plot(ps2);
end
end
hold off;
```
注意,你需要在运行代码前将 `D:\课设图片\1.jpg` 修改为你自己的图片路径,并且需要在 MATLAB 中运行此代码。
阅读全文