2010-01-13 6 views
2

내가 matlab에에서 다음과 같은 방법을 구현하기 위해 노력하고있어 : 최소 오류 임계 화 - 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 

: Letters http://i45.tinypic.com/xmvr52.jpg

Original size image.

대상은 문자 (히브리어 글자)의 이진 이미지를 추출하는 것입니다. 이미지의 하위 블록 (40 x 40)에 코드를 적용했습니다. 그러나 K-Means Clusters method보다 열세 인 결과가 있습니다.

내가 뭔가를 놓쳤습니까? 누구나 더 좋은 아이디어가 있습니까?

감사합니다.

P. 누구나 주제 태그에 "적응 형 임계 값"을 추가 할 수 있습니까?

+0

적응 형 클러스터링으로 더 좋은 결과를 얻는다고 보장 할 수는 없지만 알고리즘으로 다른 이미지를 사용해 보았습니까? –

+0

글쎄,이 3 더있어. 같은 결과, 끔찍한 결과. – Royi

답변

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

임계 값 지정은 다소 까다로운 작업입니다. 수년 동안 나는 이미지를 thresholding 해 왔지만 항상 잘 수행 할 수있는 기술은 하나도 발견하지 못했습니다. CS 저널에서 보편적으로 뛰어난 성능에 대한 주장을 불신하게되었습니다.

최대 오차 thresholding 방법은 멋지게 bimodal 히스토그램에서만 작동합니다 (그러나 잘 작동합니다). 이미지가 신호처럼 보이고 백그라운드가 명확하게 구분되지 않아 임계 값 계산 방법이 작동하지 않을 수 있습니다.

코드가 제대로 작동하는지 확인하려면이 같은 테스트 프로그램을 만들고 좋은 초기 세그먼트 화를 얻었을뿐만 아니라 코드가 분해되는 'bimodality'의 레벨을 확인하십시오.

+0

이런 종류의 이미지로 어떤 방법을 제안 하시겠습니까? 감사합니다. . – Royi

+1

솔직히? 나는 모른다. 나는 이런 종류의 이미지로 일한 적이 없으므로이 문제에 대한 직감이 거의 없다. 이것에 대한 히스토그램을 살펴 봤는데 배경이 끔직하게 비균질 적이지만 전경은 대부분 <0.12입니다.다른 말로하면 글자가 검게 균일합니다. 즉, 해당 글자에 해당하는 히스토그램의 피크가 매우 두드러 지므로 가장 높은 피크 이후 첫 번째 최소값에서 히스토그램을 자르고 합리적인 첫 번째 근사값을 얻을 수 있습니다. – Jonas

+0

이 첫 번째 근사값은 어떤 픽셀이 배경에 속하는지를 잘 보여줍니다. 그런 다음 배경을 더 밝고 어두운 부분으로 나눌 수 있습니다. 그런 다음 각 부분 내에서 히스테리시스 임계 값을 조정하여 초기 추측을 향상시킬 수 있습니다. 즉, 로컬 임계 값을 결정하여 해당 임계 값보다 작은 픽셀과 초기 추측의 픽셀에 연결되도록합니다 (초기 추정을 정리해야 할 수도 있음) 임계 값을 나타내지 만 연결되지 않은 픽셀은 버려집니다. – Jonas

관련 문제