2012-01-30 2 views
0

MATLAB 7.7에 구현하려고합니다. 이것은 내 original image이 보이는 것입니다 enter image description here :MATLAB의 로컬 임계 값

본 단어 Test은 검은 색으로 덮여 있습니다. 이 이미지는 919x551PNG 이미지입니다. 이 이미지에 로컬 임계 값을 적용하여 단어 Test이 명확하게 표시되도록 할 수 있습니다.

전체 이미지를 60 * 60 블록의 하위 이미지로 나누어 작동하는 다음 코드를 구현했습니다.

그러나 내가 그렇게 할 때 원하는 출력을 얻지 못하고 있습니다.

내 코드 :

clc; 

clear all; 
close all; 

im = imread('C:\samples\test100.png'); 
subplot(3,3,1); 
imshow(im); 
title('original image'); 
im = rgb2gray(im); 
im = double(im); 

subplot(3,3,2); 
imshow(im); 
title('gray scale image'); 

[row col] = size(im); 
max_im = max(max(im)); 
h = zeros(1,max_im+1); 

!1st block 
for n = 1:1:60 
    for m = 1:1:60 
     a(n,m) = im(n,m); 
    end 
end 

a = a+1; 
for n = 1:1:60 
    for m = 1:1:60 
     t = a(n,m); 
     h(t) = h(t)+1; 
    end 
end 

subplot(3,3,3); 
bar(h) 
[X,Y] = ginput(1); 
for n = 1:1:60 
    for m = 1:1:60 
     if a(n,m)<X 
      a(n,m) = 0; 
     else 
      a(n,m) = 255; 
     end 
    end 
end 

subplot(3,3,4); 
imshow(uint8(a)) 
title('1st block image'); 

!2nd block 
for n = 1:1:60 
    for m = 61:1:60 
     b(n,m-60) = im(n,m) 
    end 
end 

b = b+1; 
for n = 1:1:60 
    for m = 1:1:60 
     t = b(n,m); 
     h(t) = h(t)+1; 
    end 
end 

figure(2) 
bar(h) 
[X,Y] = ginput(1); 
for n = 1:1:60 
    if b(n,m)<X 
     b(n,m) = 0; 
    else 
     b(n,m) = 255; 
    end 
end 

imshow(uint8(b)) 

!3rd block 
for n = 61:1:120 
    for m = 1:1:60 
     c(n-60,m) = im(n,m); 
    end 
end 

c = c+1; 
for n = 1:1:60 
    for m = 1:1:60 
     t = c(n,m); 
     h(t) = h(t)+1; 
    end 
end 

figure(3) 
bar(h) 
[X,Y] = ginput(1); 
for n = 1:1:60 
    for m = 1:1:60 
     if c(n,m)< X 
      c(n,m) = 0; 
     else 
      c(n,m) = 255; 
     end 
    end 
end 

imshow(uint8(c)) 

!final block 

for n = 1:1:row 
    for m = 61:1:col 
     d(n-60,m-60) = im(n,m); 
    end 
end 
d = d+1; 
for n = 1:1:60 
    for m = 1:1:60 
     t = d(n,m); 
     h(t) = h(t)+1; 
    end 
end 
figure(4); 

bar(h); 
[X,Y] = ginput(1); 
for n = 1:1:60 
    for m = 1:1:60 
     if d(n,m)<X 
      d(n,m) = 0; 
     else 
      d(n,m) = 255; 
     end 
    end 
end 

imshow(uint8(d)) 
s = [a b;c d]; 

figure(5); 
imshow(uint(s)) 

내가 같은 오류 얻을 전체 코드를 실행하려고 :

을 ??? 정의되지 않은 함수 또는 'char'유형의 입력 인수에 대한 'local'

그러나 첫 번째 블록의 코드 만 실행하면 다음 출력이 표시됩니다.

Enter image description here

가 어떻게 함께 병합 한 후 서브 이미지를 만들고으로 Test 보이는 단어를 얻을 것이다 ?

+0

"로컬 임계 값"에 대한 설명과 하위 이미지 문제를 해결하는 방법에 대한 링크를 제공 할 수 있습니까? –

+0

http://www.mathworks.com/matlabcentral/fileexchange/8647-local-adaptive-thresholding –

답변

2

그레이 스케일 이미지를 가로로 스캔 한 다음 0이 아닌 (또는 임계 값보다 높은) 값의 위치를 ​​찾고 흰색으로 채울 간격을 설정하십시오 (im2double을 사용하는 경우 256 또는 1).

for j=1:551 
    row = im(:,j) 
    test = 0; 
    im2=zeros(size(im)) 
    i=0; 

    %Left black area 
    while (test == 0 && i<919) 
     im2(i,j)=0; 
     if row(i)>threshold 
      test=1; 
     end; 
     i=i+1; 
    end; 

    %White inner area 
    while (test == 1 && i<919) 
     im2(i,j)=1 
     if row(i)>threshold 
      test=0; 
     end; 
     i=i+1; 
    end; 

    %Left black area 
    while (i<919) 
     im2(i,j)=0; 
     i=i+1; 
    end; 

빈 영역 (예 : 'p')이있는 문자에는 작동하지 않지만 코드를 약간 수정할 수 있습니다.

+0

임계 값은 어떻게 결정합니까? –

+0

@ParthDoshi 당신은 지역 임계 값 적용을 원한다고 말했고, 나는 당신이 염두에두고 가치 있다고 생각했습니다. 어쨌든 완벽하게 검은 색 배경을 사용하면 0.1과 같은 작은 값을 사용할 수 있지만 필요에 맞게 조정하여 민감도를 변경할 수 있습니다 – clabacchio