Was sind die besten Algorithmen für das Dokument-Image-Thresholding in diesem Beispiel?

31

Ich versuche, verschiedene Binarisierungsalgorithmen für das gezeigte Bild zu implementieren: Bildbeschreibung hier eingeben

Hier ist der Code:

clc;
clear;
x=imread('n2.jpg');     %load original image

% Jetzt ändern wir die Größe der Bilder, damit wir später leichter rechnen können.

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

% Jetzt finden wir den Mittelwert und die Standardabweichung, die für Niblack- und% Sauvola-Algorithmen erforderlich sind

m = mean(v(:))
s=std(v(:))
k=-.4;
value=m+ k*s;
temp=v;

% implementierender Niblack-Schwellenwertalgorithmus:

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

% implementiert Sauvola-Schwellenwertalgorithmus:

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

Ende

figure;
imshow(t2);
title('result by sauvola');

Die Ergebnisse, die ich erhalten habe, sind wie folgt: Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Wie Sie sehen können, sind die resultierenden Bilder an den dunkleren Stellen abgebaut. Könnte jemand bitte vorschlagen, wie ich mein Ergebnis optimieren kann?

Kennzeichen
quelle
1
Können Sie Farbinformationen verwenden, um den Hintergrund anstatt nur der Helligkeit wegzuwerfen?
Endolith
Sehr geehrter Herr / Frau. Ich mache ein Projekt zur Bildverarbeitung. Ich bin ein interessantes Binarisierungskonzept. Bitte überprüfe und korrigiere die Kodierung. Ich nehme die Kodierung und führe das Programm aus. Aber einige Fehler treten bei dieser Kodierung auf. und eine andere ist Fehler in msp (Zeile 31) k = kittlerMet (g); .. Wie man es löst ... Bitte korrigieren Sie die Codierung ...
muthu

Antworten:

49

Ihr Bild hat keine einheitliche Helligkeit, daher sollten Sie nicht mit einer einheitlichen Schwelle arbeiten. Sie benötigen eine adaptive Schwelle. Dies kann implementiert werden, indem das Bild vorverarbeitet wird, um die Helligkeit im gesamten Bild gleichmäßiger zu machen (Code, der in Mathematica geschrieben wurde, muss die Matlab-Version selbst implementiert werden):

Eine einfache Möglichkeit, die Helligkeit zu vereinheitlichen, besteht darin, den eigentlichen Text mithilfe eines Abschlussfilters aus dem Bild zu entfernen:

white = Closing[src, DiskMatrix[5]]

Bildbeschreibung hier eingeben

Die Filtergröße sollte größer als die Schriftbreite und kleiner als die Größe der Flecken gewählt werden, die Sie entfernen möchten.

EDIT: Ich wurde in den Kommentaren gebeten zu erklären, was eine Abschlussoperation macht. Es ist eine morphologische Erweiterung, gefolgt von einer morphologischen Erosion . Die Dilatation bewegt das Strukturierungselement im Wesentlichen an jeder Position im Bild und wählt das hellste Pixel unter der Maske aus.

  • Entfernen dunkler Strukturen, die kleiner als das Strukturierungselement sind
  • Schrumpfen größerer dunkler Strukturen um die Größe des Strukturierungselements
  • Vergrößerung heller Strukturen

Die Erosionsoperation bewirkt das Gegenteil (sie wählt das dunkelste Pixel innerhalb des Strukturierungselements aus). Wenn Sie es also auf das erweiterte Bild anwenden, geschieht Folgendes:

  • Die dunklen Strukturen, die entfernt wurden, weil sie kleiner als das strukturierende Element sind, sind immer noch verschwunden
  • die dunkleren Strukturen, die geschrumpft wurden, werden wieder auf ihre ursprüngliche Größe vergrößert (obwohl ihre Form glatter sein wird)
  • Die hellen Strukturen werden auf ihre ursprüngliche Größe reduziert

Der Schließvorgang entfernt also kleine dunkle Objekte mit nur geringfügigen Änderungen an größeren dunklen Objekten und hellen Objekten.

Hier ein Beispiel mit verschiedenen Strukturelementgrößen:

Bildbeschreibung hier eingeben

Mit zunehmender Größe des Strukturierungselements werden immer mehr Zeichen entfernt. Bei einem Radius von 5 werden alle Zeichen entfernt. Wenn der Radius weiter vergrößert wird, werden auch die kleineren Flecken entfernt:

Bildbeschreibung hier eingeben

Teilen Sie nun das Originalbild durch dieses "weiße Bild", um ein Bild mit (nahezu) gleichmäßiger Helligkeit zu erhalten:

whiteAdjusted = Image[ImageData[src]/ImageData[white]*0.85]

Bildbeschreibung hier eingeben

Dieses Bild kann jetzt mit einem konstanten Schwellenwert digitalisiert werden:

Binarize[whiteAdjusted , 0.6]

Bildbeschreibung hier eingeben

Niki Estner
quelle
5
Wow! Das ist wirklich cool! Riesige +1!
Phonon
@nikie +1 Sehr schön - was genau meinst du damit, dass der schließende Filter "größer als der Schriftstrich gewählt werden muss"? Breite oder Länge eines Buchstabens? Was macht ein Abschlussfilter eigentlich? Vielen Dank!
Spacey
1
@Mohammad: Ich habe meiner Antwort eine kleine Erklärung hinzugefügt. Und ja, das sind nichtlineare Operationen. Die übliche Überschrift ist morphologische Bildverarbeitung.
Niki Estner
1
@nikie Egal, das Weiß ist das Maximum, nicht das Schwarz. :-)
Spacey
1
@gdelfino: Normalerweise versuche ich, dies zu vermeiden, indem ich eine ausreichend große Maske verwende und aus Clip[ImageData[white],{eps,Infinity}]Sicherheitsgründen dort verwende, wo eps eine kleine Zahl ist.
Niki Estner
6

Nikies Antwort scheint die beste zu sein und scheint auch zu funktionieren und Ergebnisse zu erzielen. Es ist also ein klarer Gewinner.

Aber nur zur Dokumentation, ich füge noch eine Referenz hinzu, das könnte sehr schnell gehen.

Diese Technik wird als adaptives Schwellenwertverfahren bezeichnet, bei dem der Hintergrund nicht explizit erlernt werden muss.

Anstatt den am besten geeigneten globalen Schwellenwert zu finden , können wir das Bild in ein lokales Fenster unterteilen (etwa 7x7 oder entsprechend) und Schwellenwerte finden, die sich ändern, wenn das Fenster überquert wird.

Die folgende Referenz beschreibt die genaue Methode. http://homepages.inf.ed.ac.uk/rbf/HIPR2/adpthrsh.htm

Diese Methode wäre relativ rechnerisch schneller.

Dipan Mehta
quelle
Sind diese beiden Dinge nicht im Wesentlichen gleich? Schätzen des lokalen Mittels des Signals vor dem Schwellenwert?
Maurits
1
@ Maurits Es sieht so aus, als ob die Hauptunterschiede die Reihenfolge und die verwendeten Statistiken sind. Zum Beispiel wird in den Öffnungs- / Schließoperatoren (die aus Dilatation und Erosion bestehen, jedoch in einer anderen Reihenfolge) ein Fenster gerastert und die maximale Anzahl aufgenommen. (Unter anderem). In der adaptiven Schwelle kann jedoch der Mittelwert / Median anstelle des max.
Spacey
OP hat es auch auf SO gefragt , was ich beantwortet habe. Aber im Prinzip glaube ich nicht, dass es einen Unterschied zwischen den Antworten gibt, man schätzt immer die lokalen Statistiken. Wenn Sie eine adaptive Schwellenwertbildung durchführen, lernen Sie dabei auch den Hintergrund.
Maurits
6

Ein anderer Weg mit einem Bandpassfilter (in MATLAB). Das Herumspielen mit den Unterschieden der Gaußschen Parameter kann zu besseren Ergebnissen führen. Das Verfahren besteht im Wesentlichen darin, das Bild mit einem Bandpassfilter zu filtern, um die Hintergrundflecken mit niedriger Frequenz zu entfernen und auf [0,1] zu normalisieren, die für den Befehl "Grauwert" (Schwellenwertbild) erforderlich sind.

Bild laden und in Graustufen-Doppel umwandeln:

I = imread('hw.jpg');
I = rgb2gray(I);
I = double(I);

Bildbeschreibung hier eingeben

Filtern Sie mit der Differenz des Gaußschen Kernels und normalisieren Sie:

J = imgaussian(I,1.5) - imgaussian(I,0.5);
J = J - min(J(:));
J = J / max(J(:));

Bildbeschreibung hier eingeben

Berechne die Schwelle und mache 010101:

T = J > graythresh(J);

Bildbeschreibung hier eingeben

geometrikal
quelle
4

Dies ist ein guter Matlab-Code für adaptives Thresholding: http://www.mathworks.com/matlabcentral/fileexchange/8647-local-adaptive-thresholding

MyCarta
quelle
Argh! Benötigt allerdings die Bildverarbeitungs-Toolbox. : - /
Spacey
Tatsächlich. Entschuldigung, wenn Sie es nicht haben. DIPImage ist jedoch eine kostenlose Image Tolbox für Matlab. diplib.org/documentation Es gibt einige Methoden für die Schwellenwertbildung (Abschnitt "Segmentierung überprüfen") und Sie können auch alle morphologischen Operationen wie das Schließen ausführen. Der Entwickler hat auch ein Blog cb.uu.se/~cris/blog/index.php/archives/tag/matlab
MyCarta
0

Ich werde diese Codierung versuchen. Aber ich habe keine richtige Antwort ...

clc;
clear;
x=imread('base2.jpg');
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);
m = mean(v(:))
s=std(v(:))
k=-2;
value=m+ k*s;
temp=v;
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');

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

end
figure;
imshow(t2);
title('result by sauvola');

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Muthu
quelle
2
Wenn dies zur Beantwortung der Frage gedacht ist, erläutern Sie bitte, was Sie tun und warum.
Matt L.