4

我在MATLAB中有一个问题如下:

假设我有一个如下所示的矩阵。我想要做的是计算以黄色给出的像素的平均值。(答案是 108) 在此处输入图像描述

如果给定的选项是outside,这将被计算。

另一方面,如果选项为inside,则执行图像中的操作。 在此处输入图像描述

**我想编写一个算法来找出标有零的区域内部或外部的平均值,具体取决于手动设置的选项。**

**** 4 个社区** 或8 个社区** 可以考虑。我想在 MATLAB 中计算它。你们能帮帮我吗?

4

2 回答 2

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
于 2013-12-02T17:24:52.487 回答
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
于 2013-12-03T00:43:34.507 回答