İ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);