2

MATLAB で次のMinimum Error Thresholding (J. Kittler および J. Illingworth による) メソッドを実装しようとしています。

PDFをご覧ください:

私のコードは次のとおりです。

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

次の画像で試してみました。 手紙

元のサイズの画像.

ターゲットは、文字 (ヘブライ文字) のバイナリ イメージを抽出することです。画像のサブブロック (40 x 40) にコードを適用しました。それでも、 K-Means Clustering 法に劣る結果が得られました。

私は何か見落としてますか?誰でも良いアイデアがありますか?

ありがとう。

PS 誰でも「Adaptive-Thresholding」を件名タグに追加しますか (私は新しいのでできません)。

4

2 に答える 2

4

しきい値処理はかなりトリッキーな作業です。長年にわたり、私は画像のしきい値処理を行ってきましたが、常にうまく機能する単一の手法を見つけたわけではなく、CS ジャーナルでの普遍的に優れたパフォーマンスの主張に不信感を抱くようになりました.

最大エラーしきい値法は、適切なバイモーダル ヒストグラムでのみ機能します (ただし、これらのヒストグラムではうまく機能します)。画像は信号のように見え、背景は、このしきい値処理方法が機能するのに十分に明確に分離されていない可能性があります.

コードが正常に動作することを確認したい場合は、このようなテスト プログラムを作成し、最初のセグメンテーションが適切に行われるかどうかと、コードがどのレベルの「バイモダリティ」で壊れるかを確認できます。

于 2010-01-13T19:58:00.263 に答える
2

あなたのコードは完全には正しくないと思います。論文で使用されている相対ヒストグラムの代わりに、画像の絶対ヒストグラムを使用します。さらに、可能なしきい値ごとに2つのヒストグラムを計算するため、コードはかなり非効率的です。私は自分でアルゴリズムを実装しました。たぶん、誰かがそれを利用することができます:

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;
于 2011-06-08T14:16:54.537 に答える