我在MATLAB中遇到如下问题:
假设我有一个如下所示的矩阵。我想要做的是计算以黄色给出的像素的平均值。 (ans是108)
如果给出的选项在之外,则会计算出来。
另一方面,如果选项以内部给出,则执行在图像中执行的操作。
**我想编写一个算法,根据手动设置的选项找出标有零的区域内外的平均值。 **
**** 4邻居**或 8邻居 **可能会被考虑。我想在MATLAB中计算它。你们能帮助我吗?
答案 0 :(得分:5)
%首先,创建图像
FirstImage = [
108 113 121 129 128 124 117 101
114 76 60 110 98 74 121 109
114 62 52 105 85 59 121 116
110 59 54 104 0 0 0 115
104 55 54 104 0 0 0 113
96 48 51 105 0 0 0 113
94 60 69 115 0 0 0 110
99 108 122 130 135 0 0 109
];
SecondImage = [
0 0 0 0 0 0
138 137 137 137 0 0
138 127 129 135 138 0
132 97 99 133 135 0
134 108 110 137 137 0
141 140 140 140 139 0
138 138 138 140 0 0
0 0 0 0 0 0
];
%使图像成为二进制并反转,使图像中的零为1
%这是为了使其与bwtraceboundary
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
答案 1 :(得分:2)
另一种解决方案:
使用:
BW = ~(FirstImage>0);
或:
BW = SecondImage>0;
然后:
[B,L] = bwboundaries(BW,'noholes');
B=cell2mat(B);
m=zeros(size(BW));
m(sub2ind(size(BW),B(:,1),B(:,2)))=1