Próbuję zaimplementować różne algorytmy binaryzacji na pokazanym obrazie:
Oto kod:
clc;
clear;
x=imread('n2.jpg'); %load original image
% Teraz zmieniamy rozmiar obrazów, aby praca obliczeniowa stała się dla nas łatwiejsza.
size(x);
x=imresize(x,[500 800]);
figure;
imshow(x);
title('original image');
z=rgb2hsv(x); %extract the value part of hsv plane
v=z(:,:,3);
v=imadjust(v);
% teraz znajdujemy średnią i standardowe odchylenie wymagane dla algorytmów niblack i% sauvola
m = mean(v(:))
s=std(v(:))
k=-.4;
value=m+ k*s;
temp=v;
% implementujących algorytm progowania niblacka:
for p=1:1:500
for q=1:1:800
pixel=temp(p,q);
if(pixel>value)
temp(p,q)=1;
else
temp(p,q)=0;
end
end
end
figure;
imshow(temp);
title('result by niblack');
k=kittlerMet(g);
figure;
imshow(k);
title('result by kittlerMet');
% implementujących algorytm progowy sauvoli:
val2=m*(1+.1*((s/128)-1));
t2=v;
for p=1:1:500
for q=1:1:800
pixel=t2(p,q);
if(pixel>value)
t2(p,q)=1;
else
t2(p,q)=0;
end
end
koniec
figure;
imshow(t2);
title('result by sauvola');
Wyniki, które uzyskałem są następujące:
Jak widać, powstałe obrazy są degradowane w ciemniejszych miejscach. Czy ktoś mógłby zasugerować, jak zoptymalizować mój wynik?
image-processing
matlab
znak
źródło
źródło
Odpowiedzi:
Twój obraz nie ma jednolitej jasności, więc nie powinieneś pracować z jednolitym progiem. Potrzebujesz progu adaptacyjnego. Można to zaimplementować poprzez wstępne przetworzenie obrazu w celu ujednolicenia jasności obrazu (kod napisany w Mathematica, musisz zaimplementować wersję Matlab dla siebie):
Prostym sposobem na wyrównanie jasności jest usunięcie faktycznego tekstu z obrazu za pomocą filtra zamykającego:
Rozmiar filtra należy wybrać większy niż szerokość obrysu czcionki i mniejszy niż rozmiar plam, które próbujesz usunąć.
EDYCJA: W komentarzach poproszono mnie o wyjaśnienie, co robi operacja zamknięcia. Jest to rozszerzenie morfologiczne, po którym następuje erozja morfologiczna . Dylatacja zasadniczo przesuwa element strukturyzujący w każdej pozycji obrazu i wybiera najjaśniejszy piksel pod maską, w ten sposób:
Operacja erozji działa odwrotnie (wykrywa najciemniejszy piksel wewnątrz elementu strukturyzującego), więc jeśli zastosujesz go na rozszerzonym obrazie:
Dlatego operacja zamykania usuwa małe ciemne obiekty z niewielkimi zmianami w większych ciemnych i jasnych obiektach.
Oto przykład z różnymi rozmiarami elementów strukturalnych:
Wraz ze wzrostem wielkości elementu strukturyzującego coraz więcej znaków jest usuwanych. Przy promieniu = 5 wszystkie znaki są usuwane. W przypadku dalszego zwiększenia promienia usuwane są również mniejsze plamy:
Teraz wystarczy podzielić oryginalny obraz przez ten „biały obraz”, aby uzyskać obraz o (prawie) jednolitej jasności:
Ten obraz można teraz poddać binaryzacji ze stałym progiem:
źródło
Clip[ImageData[white],{eps,Infinity}]
tam, gdzie eps jest małą liczbą, aby być bezpiecznym.Odpowiedź Nikie wydaje się najlepsza, a także wydaje się działać i przynosić rezultaty. Jest to więc wyraźny zwycięzca.
Jednak tylko do dokumentacji dodam jeszcze jedno odniesienie, które może być bardzo szybkie.
Ta technika nazywa się Adaptacyjnym progiem, który nie wymaga wyraźnego poznania tła.
Zasadniczo, zamiast znaleźć najbardziej odpowiedni globalny próg - możemy podzielić obraz na okno lokalne (powiedzmy o 7x7 lub odpowiednio) i znaleźć progi, które zmieniają się w miarę przechodzenia okna.
Poniższe odniesienie szczegółowo opisuje dokładną metodę. http://homepages.inf.ed.ac.uk/rbf/HIPR2/adpthrsh.htm
Ta metoda byłaby względnie szybsza obliczeniowo.
źródło
Innym sposobem jest użycie filtra pasmowoprzepustowego (w MATLAB). Zabawa z różnicą parametrów Gaussa może dać lepsze wyniki. Proces polega w zasadzie na filtrowaniu pasmowym obrazu w celu usunięcia plamek tła niskiej częstotliwości, normalizacji do [0,1] wymaganej dla polecenia „graythresh”, obraz progowy.
Załaduj obraz i przekonwertuj do podwójnej skali szarości:
Filtruj używając różnicy jądra Gaussa i normalizuj:
Obliczyć próg i zrobić 010101:
źródło
Jest to dobry kod Matlaba do adaptacyjnego progowania: http://www.mathworks.com/matlabcentral/fileexchange/8647-local-adaptive-thresholding
źródło
Spróbuję tego kodowania, ale nie mam poprawnej odpowiedzi ...
źródło