Witam, mam za zadanie obliczenie pola powierzchni obrazu oraz jego obwód jednak zupełnie nie wiem jak sie za to zabrać. Byłabym wdzięczna za pomoc z kodem lub o jakieś wskazówki. Załączam przykładowy obraz.
Z góry dziękuje!
Całki, tutaj trzeba całek.
Myślę, że w Twoim przypadku sprawę załatwi:
i policzenie ile pikseli się zamalowało.
Przy floodfill, można dodatkowo zliczać piksele stykające się z tłem. Są trzy rodzaje takich pikseli:
- Biały piksel, którego trzech sąsiadów (sąsiedztwo von Neumanna) jest białych i jeden jest czarny - liczyć jako jedna jednostka.
- Biały piksel, którego dwóch sąsiadów jest białych i dwóch jest czarnych - liczyć jako dwie jednostki.
- Biały piksel, którego jeden sąsiad jest biały i trzech jest czarnych - liczyć jako trzy jednostki.
- Pikseli innych niż wymienione wyżej nie zlicza się.
Suma jednostek to będzie obwód.
Zamiast algorytmu flood fill, najprostszym jest pętla iterująca po wierszach zawierajaca w sobie pętlę iterującą po kolumnach, czyli dwie pętle iterujące po wszystkich pikselach. Do obwodu liczyć tak, jak napisałem wyżej, a do pola zliczać wszystkie białe piksele.
W Octave mi tak wyszło...
pole = 156273
obwod = 2948
figura = imread("Przechwytywanie.PNG")(:, :, 1); % czerwony kanal
pole = 0;
obwod = 0;
for r = 1:size(figura, 1) % for number of rows of the image
for c = 1:size(figura, 2) % for number of columns of the image
if figura(r, c) == 255
pole = pole + 1;
czarni_sasiedzi = 0;
if figura(r - 1, c) == 0
czarni_sasiedzi = czarni_sasiedzi + 1;
end
if figura(r + 1, c) == 0
czarni_sasiedzi = czarni_sasiedzi + 1;
end
if figura(r, c + 1) == 0
czarni_sasiedzi = czarni_sasiedzi + 1;
end
if figura(r, c - 1) == 0
czarni_sasiedzi = czarni_sasiedzi + 1;
end
obwod = obwod + czarni_sasiedzi;
end
end
end
pole
obwod
Wiem... w matlabie jestem noobem.
ps. trzeba zwrócić uwagę, że obrazek dodany przez OP ma szary pasek na dole. Więc jakby ktoś chciał badać figurę inaczej, np. czy kolor_piksela > 0
, to mu nie wyjdzie, chyba że dokona edycji obrazu.