2013-12-02 2 views
4

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

Предположим, у меня есть такая матрица, как указано ниже. Я хочу рассчитать средние значения пикселей, заданные в желтом цвете. (АНС 108) enter image description here

Это будет вычислен, если параметр, переданный в вне.

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

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

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

+0

намек, бинаризации матрицу и использовать 'bwtraceboundary', чтобы найти соответствующие пиксели. – bla

+0

@natan вы можете быть более конкретным, пожалуйста, – roni

ответ

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 


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


% Выполните разведение

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 
+0

yep, вот и все ... Я сделал ваш код немного более кратким, вы получили мой +1 – bla

+0

Привет, я попытался запустить это, но я получаю сообщение об ошибке bwtraceboundary coommand. Он говорит: «Ошибка при использовании bwtraceboundary Ожидаемый входной номер 2, P, как вектор». Я перепроверял код, он кажется правильным. Может ли кто-нибудь сказать мне, почему эта ошибка отображается? – roni

+0

Это сработало для меня, когда я побежал. Убедитесь, что startRow и startCol являются векторами одинакового размера. На данный момент у меня нет Matlab, поэтому я не могу это проверить. – kkuilla

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 
Смежные вопросы