Локальный порог в MATLAB - PullRequest
       17

Локальный порог в MATLAB

0 голосов
/ 30 января 2012

Я пытаюсь реализовать local thresholding в MATLAB 7.7.Вот как выглядит мой original image enter image description here:

Как видно, слово Test покрыто черным.Это изображение PNG с размерами 919x551.Я хочу применить локальное пороговое значение к этому изображению, чтобы можно было четко видеть слово 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))

Когда я пытаюсь запустить весь кодЯ получаю сообщение об ошибке:

???Неопределенная функция или метод 'local' для входных аргументов типа 'char'

Однако, когда я запускаю только код для 1-го блока, я получаю следующий вывод:

Enter image description here

Как я получу слово Test видимым, создав подизображения и затем объединив их вместе?

1 Ответ

2 голосов
/ 30 января 2012

Можно отсканировать изображение в градациях серого по горизонтали, а затем найти положение ненулевых (или выше пороговых) значений и установить этот интервал для заполнения белым (256 или 1, если используется im2double ).

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'), но вы можете немного изменить код, чтобы сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...