MATLAB中的局部阈值法

MATLAB中的局部阈值法,matlab,image-processing,Matlab,Image Processing,我试图在matlab7.7中实现localthresholding。这就是我的原始图像的样子: 如图所示,Test一词用黑色覆盖。此图像是一幅尺寸为919x551的PNG图像。我想对这个图像应用局部阈值,这样我就可以清楚地看到单词Test 我已经实现了下面的代码,它通过将整个图像分割成60*60块的子图像来工作 然而,当我这样做的时候,我没有得到想要的输出 我的代码: clc; clear all; close all; im = imread('C:\samples\test100.png

我试图在
matlab7.7
中实现
localthresholding
。这就是我的
原始图像的样子:

如图所示,
Test
一词用黑色覆盖。此图像是一幅尺寸为919x551的
PNG
图像。我想对这个图像应用局部阈值,这样我就可以清楚地看到单词
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))
clc;
清除所有;
全部关闭;
im=imread('C:\samples\test100.png');
子批次(3,3,1);
imshow(im);
标题(“原始图像”);
im=RGB2灰色(im);
im=双(im);
子批次(3,3,2);
imshow(im);
标题(“灰度图像”);
[行列]=大小(im);
max_im=max(max(im));
h=零(1,最大值im+1);
!第一街区
对于n=1:1:60
对于m=1:1:60
a(n,m)=im(n,m);
结束
结束
a=a+1;
对于n=1:1:60
对于m=1:1:60
t=a(n,m);
h(t)=h(t)+1;
结束
结束
子批次(3,3,3);
巴(小时)
[X,Y]=ginput(1);
对于n=1:1:60
对于m=1:1:60

如果a(n,m)您可以水平扫描灰度图像,然后找到非零(或高于阈值)值的位置,并将该间隔设置为白色(256或1,如果使用)

j=1:551的

行=im(:,j)
测试=0;
im2=零(尺寸(im))
i=0;
%左黑区
while(test==0&&ithreshold
测试=1;
结束;
i=i+1;
结束;
%白色内部区域
while(test==1&&ithreshold
测试=0;
结束;
i=i+1;
结束;
%左黑区

你能提供一个链接来解释“局部阈值”吗如何解决子图像的问题?你如何确定阈值?@ParthDoshi你说你想应用局部阈值,我认为你心里有一个值;无论如何,在完全黑色的背景下,你可以使用一个小值,例如0.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;