Вычислить окрестности внутри или за пределами области

У меня есть проблема в MATLAB следующим образом:

Предположим, у меня есть матрица, подобная приведенной ниже. Что я хочу сделать, так это вычислить средние значения пикселей, указанных желтым цветом. (ответ равен 108) введите здесь описание изображения

Это будет рассчитано, если задана опция outside.

С другой стороны, если опция указана как внутри, то операция выполняется так же, как на изображении. введите здесь описание изображения

** Я хочу написать алгоритм, чтобы узнать среднее значение внутри или вне области, отмеченной нулями, в зависимости от параметра, установленного вручную. **

****4 район** или 8 район ** могут быть рассмотрены. Я хочу вычислить это в MATLAB. Вы можете мне помочь?


person roni    schedule 02.12.2013    source источник
comment
подсказка, бинаризуйте матрицу и используйте bwtraceboundary, чтобы найти соответствующие пиксели.   -  person bla    schedule 02.12.2013
comment
@natan можно поконкретнее пожалуйста   -  person roni    schedule 02.12.2013


Ответы (2)


% Во-первых, создайте изображения

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


% Теперь это обнаружит только границу самого объекта.
% Ищем ближайшие ненулевые значения к границе.
% Чтобы получить ближайшие ненулевые значения,
% применяем разбавление к счетчику image и
%, затем умножьте его поэлементно на исходное изображение.
% Вычислите среднее значение ненулевых значений


% Проведение разбавления

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
person kkuilla    schedule 02.12.2013
comment
да, вот и все ... Я сделал ваш код немного более кратким, вы получили мой +1 - person bla; 03.12.2013
comment
Привет, я пытался запустить это, но получаю сообщение об ошибке в команде bwtraceboundary. В нем говорится: «Ошибка при использовании bwtraceboundary». Ожидается, что входной номер 2, P, будет вектором. Я перепроверил код, он кажется правильным. Может ли кто-нибудь сказать мне, почему эта ошибка отображается? - person roni; 06.12.2013
comment
Это сработало для меня, когда я запустил его. Убедитесь, что startRow и startCol являются векторами одинакового размера. Матлаба у меня пока нет, так что проверить не могу. - person kkuilla; 06.12.2013
comment
Вы можете попробовать это: objectCoordinates = find(im›0); [startRow, startCol] = ind2sub(size(im), objectCoordinates(1)); контур = bwtraceboundary(im,[startRow startCol],'E' ); - person kkuilla; 06.12.2013

Другое решение:

используйте либо:

BW = ~(FirstImage>0);

or:

BW = SecondImage>0;

потом:

[B,L] = bwboundaries(BW,'noholes');
B=cell2mat(B);
m=zeros(size(BW));
m(sub2ind(size(BW),B(:,1),B(:,2)))=1
person bla    schedule 03.12.2013