Frage

Ich versuche, die folgenden Minimum Fehler zu implementieren Thresholding (von J. Kittler und J. Illingworth) -Methode in MATLAB.

Sie können einen Blick auf die PDF haben:

Mein Code ist:

function [ Level ] = MET( IMG )
%Maximum Error Thresholding By Kittler
%   Finding the Min of a cost function J in any possible thresholding. The
%   function output is the Optimal Thresholding.

for t = 0:255 % Assuming 8 bit image
    I1 = IMG;
    I1 = I1(I1 <= t);
    q1 = sum(hist(I1, 256));

    I2 = IMG;
    I2 = I2(I2 > t);
    q2 = sum(hist(I2, 256));

    % J is proportional to the Overlapping Area of the 2 assumed Gaussians
    J(t + 1) = 1 + 2 * (q1 * log(std(I1, 1)) + q2 * log(std(I2, 1)))...
        -2 * (q1 * log(q1) + q2 * log(q2));
end

[~, Level] = min(J);

%Level = (IMG <= Level);

end

Ich habe es auf das folgende Bild versucht: Letters

Originalgröße Bild .

Das Ziel ist ein binäres Bild der Buchstaben (Hebrew Letters) zu extrahieren. I angewendet, um den Code auf Unterblöcke des Bildes (40 x 40). Doch ich habe Ergebnisse, die schlechter sind als K-Means Clustering-Methode .

Habe ich etwas verpasst? Jeder hat eine bessere Idee?

Danke.

P. S. Würde jemand add „Adaptive-Thresholding“ zu den Thementags (ich kann nicht, wie ich bin neu).

War es hilfreich?

Lösung

Ich denke, Ihr Code ist nicht ganz korrekt. Sie verwenden das absolute Histogramm des Bildes anstelle des relativen Histogramms, das in dem Papier verwendet wird. Darüber hinaus ist der Code eher ineffizient, da es zwei Histogramme pro möglicher Schwelle berechnet. Ich setzte den Algorithmus selbst. Vielleicht kann jemand davon Gebrauch machen:

function [ optimalThreshold, J ] = kittlerMinimimErrorThresholding( img )
%KITTLERMINIMIMERRORTHRESHOLDING Compute an optimal image threshold.
%   Computes the Minimum Error Threshold as described in
%   
%   'J. Kittler and J. Illingworth, "Minimum Error Thresholding," Pattern
%   Recognition 19, 41-47 (1986)'.
%   
%   The image 'img' is expected to have integer values from 0 to 255.
%   'optimalThreshold' holds the found threshold. 'J' holds the values of
%   the criterion function.

%Initialize the criterion function
J = Inf * ones(255, 1);

%Compute the relative histogram
histogram = double(histc(img(:), 0:255)) / size(img(:), 1);

%Walk through every possible threshold. However, T is interpreted
%differently than in the paper. It is interpreted as the lower boundary of
%the second class of pixels rather than the upper boundary of the first
%class. That is, an intensity of value T is treated as being in the same
%class as higher intensities rather than lower intensities.
for T = 1:255

    %Split the hostogram at the threshold T.
    histogram1 = histogram(1:T);
    histogram2 = histogram((T+1):end);

    %Compute the number of pixels in the two classes.
    P1 = sum(histogram1);
    P2 = sum(histogram2);

    %Only continue if both classes contain at least one pixel.
    if (P1 > 0) && (P2 > 0)

        %Compute the standard deviations of the classes.
        mean1 = sum(histogram1 .* (1:T)') / P1;
        mean2 = sum(histogram2 .* (1:(256-T))') / P2;
        sigma1 = sqrt(sum(histogram1 .* (((1:T)' - mean1) .^2) ) / P1);
        sigma2 = sqrt(sum(histogram2 .* (((1:(256-T))' - mean2) .^2) ) / P2);

        %Only compute the criterion function if both classes contain at
        %least two intensity values.
        if (sigma1 > 0) && (sigma2 > 0)

            %Compute the criterion function.
            J(T) = 1 + 2 * (P1 * log(sigma1) + P2 * log(sigma2)) ...
                     - 2 * (P1 * log(P1) + P2 * log(P2));

        end
    end

end

%Find the minimum of J.
[~, optimalThreshold] = min(J);
optimalThreshold = optimalThreshold - 0.5;

Andere Tipps

ist Thresholding ein ziemlich heikle Angelegenheit. In den vielen Jahren habe ich Bilder wurden Schwellwertbildung Ich habe gefunden, nicht eine einzige Technik, die immer gut funktioniert, und ich habe kommen die Ansprüche der allgemein hervorragende Leistung in CS Journale misstrauen.

Die maximale Fehler Schwellwertbildung Methode funktioniert nur auf gut bimodalen Histogramm (aber es funktioniert gut auf diesen). Ihr Bild sieht Signal und Hintergrund kann nicht deutlich genug für diese Schwellwertverfahren zur Arbeit getrennt werden.

Wenn Sie sicherstellen möchten, dass der Code funktioniert gut, könnten Sie ein Testprogramm wie folgt erstellen und prüfen Sie, ob Sie beide eine gute anfängliche Segmentierung erhalten, sowie auf welcher Ebene von ‚Bimodalität‘ down die Code bricht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top