我在MATLAB中有一个问题如下:
假设我有一个如下所示的矩阵。我想要做的是计算以黄色给出的像素的平均值。(答案是 108)
如果给定的选项是outside,这将被计算。
另一方面,如果选项为inside,则执行图像中的操作。
**我想编写一个算法来找出标有零的区域内部或外部的平均值,具体取决于手动设置的选项。**
**** 4 个社区** 或8 个社区** 可以考虑。我想在 MATLAB 中计算它。你们能帮帮我吗?
我在MATLAB中有一个问题如下:
假设我有一个如下所示的矩阵。我想要做的是计算以黄色给出的像素的平均值。(答案是 108)
如果给定的选项是outside,这将被计算。
另一方面,如果选项为inside,则执行图像中的操作。
**我想编写一个算法来找出标有零的区域内部或外部的平均值,具体取决于手动设置的选项。**
**** 4 个社区** 或8 个社区** 可以考虑。我想在 MATLAB 中计算它。你们能帮帮我吗?
% 首先,创建图像
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
另一种解决方案:
使用:
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