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