Изчислете квартала вътре или извън даден регион

Имам следния проблем в MATLAB:

Да предположим, че имам матрица като дадена по-долу. Това, което искам да направя, е да изчисля средните стойности на пикселите, дадени в жълто. (ans е 108) въведете описание на изображението тук

Това ще бъде изчислено, ако дадената опция е извън.

От друга страна, ако опцията е дадена като вътре, тогава операция, както е извършена на изображението. въведете описание на изображението тук

**Искам да напиша алгоритъм за откриване на средната стойност вътре или извън областта, маркирана с нули в зависимост от ръчно зададената опция. **

****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


% Сега това ще открие само границата на самия обект.
% Търсим най-близките ненулеви стойности до границата.
% За да получите най-близките ненулеви стойности,
% приложете разреждане към брояча изображение и
% след това го умножете по елементи с оригиналното изображение.
% Изчислете средната стойност на ненулевите стойности


% Извършете разреждане

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 са вектори с еднакъв размер. В момента нямам Matlab тук, така че не мога да го проверя. - 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