İkilik bir resimde verilen noktadan başlayarak boşluğu doldurma (flood fill)
Açıklama: İkilik bir resimde verilen noktadan başlayarak boşluğu doldurur.
Girdiler: bw -> Boşluklu (delikli) nesneler içeren ikilik resim, r -> başlangıç noktasının satır (y) değeri, c -> başlangıç noktasının sütun (x) değeri
Çıktı: bwOut -> Verilen resmin, istenilen noktadan başlayarak beyaz çeperlere kadar boyanmış hali
Örnek:
bw = bwperim(imread('circles.png'));
r = 100; c = 100;
subplot(1,2,1)
imshow(bw)
hold on
plot(c, r, 'r*')
hold off
title('Önceki hali')
subplot(1,2,2)
imshow(floodFill(bw, r, c))
title('Boşluğu doldurduktan sonra')
Burada 4′lük komşuluk değeri kullanılıyor. 8′lik kullanmak için çapraz komşuları da eklemek gerekli.
Kaynak: Steve on Image Processing – Neighbor indexing
English description: Flood fill algorithm
Kaynak kod
% floodFill.m: İkilik bir resimde verilen noktadan başlayarak boşluğu
% doldurur.
%
% Girdiler: bw -> Boşluklu (delikli) nesneler içeren ikilik resim
% r -> başlangıç noktasının satır (y) değeri
% c -> başlangıç noktasının sütun (x) değeri
%
% Çıktı : bwOut -> Verilen resmin, istenilen noktadan başlayarak beyaz
% çeperlere kadar boyanmış hali
%
% Örnek:
% bw = bwperim(imread('circles.png'));
% r = 100; c = 100;
%
% subplot(1,2,1)
% imshow(bw)
% hold on
% plot(c, r, 'r*')
% hold off
% title('Önceki hali')
% subplot(1,2,2)
% imshow(floodFill(bw, r, c))
% title('Boşluğu doldurduktan sonra')
%
function bwOut = floodFill(bw, r, c)
% Resmin etrafına 1'ler ekleyelim ki kod sınırlara geldiğinde patlamasın.
% Dikkat: Bundan sonra indexkleme yaparken birer fazla yapmamız lazım
bw = padarray(bw, [1 1], 1);
% İlk verilen noktadan başlayarak komşularına bakacağız ve boyayarak
% gideceğiz. Sonraki adıma geçerken daha önceden görmediğimiz noktalara ve
% de siyah olan noktalara gitmeliyiz.
% İlk olarak tek nokta aktif. MATLAB'da bir bw matrisinin bw(r,c) diye
% çağırılması ikili indekslemedir.
% Aynı noktaya bw(idx) olarak da ulaşabiliriz fakat sütun sütun
% ilerlenildiğini hesaba katmalıyız. sub2ind fonksiyonu ile ikili indeksten
% doğrusal indekse geçelim.
activePixels = sub2ind(size(bw), r+1, c+1); % Doğrusal indeksleme yapalım
bwOut = bw; % Eldeki resimle başlayalım
M = size(bw, 1);
% Doğrusal indeksleme kullanırken herhangi bir x noktasının yönleri ve yeni
% indeksleri alttaki gibi olur
% Kuzey, x-1
% Doğu, x+M
% Güney, x+1
% Batı, x-M
neighborOffsets = [-1, M, 1, -M];
% Aktif noktalar bitene dek
while ~isempty(activePixels)
% Şu anki aktif noktaları beyaza boya.
bwOut(activePixels) = 1;
% Yeni aktif liste şu ankilerin komşuları olacak
% 'bsxfun' verilen ikili
activePixels = bsxfun(@plus, activePixels, neighborOffsets);
% 2 boyutlu değişkeni (matrisi) tek boyuta (vektöre) doğrusallaştır.
activePixels = activePixels(:);
% Aktif noktalardan beyaz yerleri sil. Bunu yapmazsak algoritma sonsuz
% döngüye girer
activePixels(bwOut(activePixels)) = [];
% Remove duplicates from the list.
activePixels = unique(activePixels);
end
% Eklediğimiz 1 birimlik kenarları kaldır
bwOut = bwOut(2:end-1, 2:end-1);

