计算区域内部或外部的邻域

时间:2013-12-02 16:56:29

标签: matlab image-processing nearest-neighbor neighbours

我在MATLAB中遇到如下问题:

假设我有一个如下所示的矩阵。我想要做的是计算以黄色给出的像素的平均值。 (ans是108) enter image description here

如果给出的选项之外,则会计算出来。

另一方面,如果选项以内部给出,则执行在图像中执行的操作。 enter image description here

**我想编写一个算法,根据手动设置的选项找出标有零的区域内外的平均值。 **

**** 4邻居**或 8邻居 **可能会被考虑。我想在MATLAB中计算它。你们能帮助我吗?

2 个答案:

答案 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