이 예제에서 문서 이미지 임계 값에 가장 적합한 알고리즘은 무엇입니까?


31

표시된 이미지에 다양한 이진화 알고리즘을 구현하려고합니다. 여기에 이미지 설명을 입력하십시오

코드는 다음과 같습니다.

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

% 이제 계산 작업이 나중에 더 쉬워 지도록 이미지 크기를 조정합니다.

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

이제 niblack 및 % sauvola 알고리즘에 필요한 평균 및 표준 편차를 찾습니다.

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

niblack 임계 값 알고리즘 구현 비율 :

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

종료

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

내가 얻은 결과는 다음과 같습니다. 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

보시다시피 결과 이미지가 어두운 곳에서 저하됩니다. 누군가 내 결과를 최적화하는 방법을 제안 할 수 있습니까?


1
색상 정보를 사용하여 밝기 대신 배경을 버릴 수 있습니까?
endolith

존경하는 선생님 / 부인. 이미지 처리에 프로젝트를하고 있습니다. 나는 흥미로운 이진화 개념입니다. 코딩을 확인하고 수정하십시오 ... 코딩을하고 프로그램을 실행하십시오. 그러나 일부 오류는이 코딩이 발생합니다 ... 정의되지 않은 함수 또는 변수 'g'. 또 다른 하나는 msp의 오류 (행 31) k = kittlerMet (g); .. 해결 방법 ... 코드를 수정하십시오 ...
muthu

답변:


49

이미지의 밝기가 균일하지 않으므로 균일 한 임계 값으로 작업해서는 안됩니다. 적응 임계 값이 필요합니다. 이미지 전체를 밝게하기 위해 이미지를 전처리하여 구현할 수 있습니다 (Mathematica로 작성된 코드는 Matlab 버전을 직접 구현해야합니다).

밝기를 균일하게 만드는 간단한 방법은 닫는 필터를 사용하여 이미지에서 실제 텍스트를 제거하는 것입니다.

white = Closing[src, DiskMatrix[5]]

여기에 이미지 설명을 입력하십시오

필터 크기는 글꼴 획 너비보다 크고 제거하려는 얼룩 크기보다 작게 선택해야합니다.

편집 : 의견에 폐쇄 작업이 무엇을하는지 설명하라는 요청을 받았습니다. 그것은 A의 형태 팽창 a로 이어 형태 학적 침식 . 확장은 기본적으로 이미지의 모든 위치에서 구조 요소를 이동하고 마스크 아래에서 가장 밝은 픽셀을 선택합니다.

  • 구조 요소보다 작은 어두운 구조를 제거
  • 구조화 요소의 크기에 따라 더 큰 어두운 구조 축소
  • 밝은 구조 확대

침식 작업은 반대입니다 (구조 요소 내부에서 가장 어두운 픽셀을 선택합니다). 확장 이미지에 적용하면 다음과 같습니다.

  • 구조 요소보다 작기 때문에 제거 된 어두운 구조는 여전히 사라집니다.
  • 축소 된 어두운 구조는 원래 크기로 다시 확대됩니다 (모양이 매끄럽지 만).
  • 밝은 구조는 원래 크기로 축소됩니다

따라서 닫는 작업은 큰 어두운 개체와 밝은 개체를 약간만 변경하여 작은 어두운 개체를 제거합니다.

다음은 구조화 요소 크기가 다른 예입니다.

여기에 이미지 설명을 입력하십시오

구조화 요소의 크기가 증가함에 따라 점점 더 많은 문자가 제거됩니다. 반경이 5이면 모든 문자가 제거됩니다. 반경이 더 증가하면 더 작은 얼룩도 제거됩니다.

여기에 이미지 설명을 입력하십시오

이제 원본 이미지를이 "백색 이미지"로 나누면 (거의) 균일 한 밝기의 이미지를 얻을 수 있습니다.

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

여기에 이미지 설명을 입력하십시오

이 이미지는 이제 일정한 임계 값으로 이진화 할 수 있습니다.

Binarize[whiteAdjusted , 0.6]

여기에 이미지 설명을 입력하십시오


5
와우! 정말 멋지다! 거대한 +1!
Phonon

@nikie +1 아주 좋았습니다-필터를 닫으면 정확히 "글꼴 획보다 크게"무엇을 의미합니까? 문자의 너비 또는 길이? 또한 '실제'폐쇄 필터는 무엇입니까? 감사!
Spacey

1
@Mohammad : 나는 내 대답에 약간의 설명을 추가했습니다. 그리고 그렇습니다. 이것은 비선형 연산입니다. 일반적인 제목은 형태 학적 이미지 처리입니다.
Niki Estner

1
@nikie 걱정하지 마세요. 흰색은 검은 색이 아니라 최대 값입니다. :-)
Spacey

1
@gdelfino : 나는 보통 충분히 큰 마스크를 사용하여 그것을 피하려고 노력하고 Clip[ImageData[white],{eps,Infinity}]eps가 작은 수인 곳에서 사용 하여 안전합니다.
Niki Estner

6

Nikie의 답변이 가장 좋을뿐만 아니라 작동하고 결과를 산출하는 것 같습니다. 확실한 승자입니다.

그러나 하나의 참조를 추가하는 문서에 대해서는 매우 빠릅니다.

이 기술을 적응 임계 값이라고 하며 배경을 명시 적으로 학습 할 필요가 없습니다 .

기본적으로 가장 적합한 전역 임계 값 을 찾는 대신 이미지를 로컬 창 (예 : 약 7x7 또는 적절)으로 분할하고 창이 이동함에 따라 변경되는 임계 값을 찾을 수 있습니다.

아래의 참조는 정확한 방법을 자세히 설명합니다. http://homepages.inf.ed.ac.uk/rbf/HIPR2/adpthrsh.htm

이 방법은 비교적 계산 속도가 빠릅니다.


그 두 가지가 본질적으로 동일하지 않습니까? 즉 임계 값 이전에 신호의 로컬 평균을 추정합니까?
Maurits

1
@Maurits 주요 차이점은 사용 된 순서와 통계입니다. 예를 들어, 팽창 및 침식으로 구성되지만 다른 순서로 열리는 개폐 연산자에서는 창을 래스터 스캔하고 최대 값을 가져옵니다. (다른 것들 사이). 그러나 적응 임계 값에서 평균 / 중앙값을 최대 값 대신 사용할 수 있습니다.
Spacey

OP도 SO 에 물었습니다 . 그러나 원칙적으로 대답 사이에 차이가 있다고 생각하지 않으며 항상 로컬 통계를 추정합니다. 적응 임계 값을 설정하면 프로세스의 배경도 배웁니다.
Maurits

6

MATLAB에서 대역 통과 필터를 사용하는 다른 방법입니다. 가우스 매개 변수의 차이를 가지고 놀면 더 나은 결과를 얻을 수 있습니다. 프로세스는 기본적으로 이미지를 대역 통과 필터링하여 저주파 배경 블로 브를 제거하고 임계 값 이미지 'graythresh'명령에 필요한 [0,1]로 정규화합니다.

이미지를로드하고 회색조 이중으로 변환 :

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

여기에 이미지 설명을 입력하십시오

가우스 커널과 정규화의 차이를 사용하여 필터링 :

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

여기에 이미지 설명을 입력하십시오

임계 값을 계산하고 010101을 만드십시오.

T = J > graythresh(J);

여기에 이미지 설명을 입력하십시오


4

다음은 적응 임계 값을위한 좋은 Matlab 코드입니다. http://www.mathworks.com/matlabcentral/fileexchange/8647-local-adaptive-thresholding


아아! 그래도 이미지 처리 도구 상자가 필요합니다. :-/
Spacey

과연. 없는 경우 죄송합니다. 그러나 DIPImage는 Matlab을위한 무료 Image Tolbox입니다. diplib.org/documentation 임계 값을 지정하는 몇 가지 방법 (세그먼트 섹션 확인)이 있으며 닫기와 같은 모든 형태 학적 작업을 수행 할 수도 있습니다. 개발자는 또한 블로그 cb.uu.se/~cris/blog/index.php/archives/tag/matlab
MyCarta

0

나는이 코딩을 시도 할 것이다. 그러나 나는 정답이 없다 ...

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

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


2
이것이 질문에 대답하기위한 것이라면,하고있는 일과 이유를 설명하십시오.
Matt L.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.