im = FirstImage == 0
% 找到对象坐标以满足 bwtraceboundary
的要求
objectCoord = find(im);
[startRow,startCol] = ind2sub(size(im),objectCoord(1) );
%find()
函数按列扫描矩阵,因此我们知道它将从左上角开始,并逐列向下工作。因此,边界的某些部分必须位于找到的第一个坐标东侧。这是确定起始坐标的一种方法。
contour = bwtraceboundary(im,[startRow startCol],'E' )
% 标记轮廓
contourimage = zeros(size(im));
contourind = sub2ind(size(contourimage),contour(:,1),contour(:,2))
contourimage(contourind) = 1;
contourimage =
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0
0 0 0 0 1 0 1 0
0 0 0 0 1 0 1 0
0 0 0 0 1 0 1 0
0 0 0 0 0 1 1 0
% 现在,这只会检测对象本身的边界。
% 我们正在寻找最近的非零值接近边界。
% 要获取最近的非零值,
% 对轮廓图像应用膨胀,
% 然��将其与原始图像逐元素相乘。
% 计算非零值的平均值。
% 进行膨胀操作
mask = bwmorph(contourimage,'dilate')
mask =
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1
0 0 0 1 1 1 1 1
0 0 0 1 1 1 1 1
0 0 0 1 1 1 1 1
0 0 0 1 1 1 1 1
0 0 0 1 1 1 1 1
% 将原始图像与mask
逐元素相乘。
% 对象本身将被清零,非零边界将保留。
A=mask.*FirstImage
A =
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 105 85 59 121 116
0 0 0 104 0 0 0 115
0 0 0 104 0 0 0 113
0 0 0 105 0 0 0 113
0 0 0 115 0 0 0 110
0 0 0 130 135 0 0 109
% 然后计算平均值
mean(A(A>0))
ans =
108.6875
bwtraceboundary
函数查找相关像素。 - bla