MATLAB中的局部阈值处理

时间:2012-01-30 14:31:56

标签: matlab image-processing

我正在尝试在local thresholding中实施MATLAB 7.7。这就是我的original image看起来像enter image description here

正如所见,Test这个词被黑色覆盖。此图片是尺寸为PNG的{​​{1}}图片。我想对此图片应用局部阈值处理,以便我可以清楚地看到919x551这个词。

我已经实现了以下代码,它将整个图像划分为60 * 60块的子图像。

然而,当我这样做时,我没有得到所需的输出。

我的代码:

Test

当我尝试运行整个代码时,我得到一个错误:

  

???未定义的函数或方法'local'用于'char'类型的输入参数

但是,当我只运行第一个块的代码时,我得到以下输出。

Enter image description here

如何通过创建子图像然后将它们合并在一起来获得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)) 这个词?

1 个答案:

答案 0 :(得分:2)

您可以水平扫描灰度图像,然后找到非零(或高于阈值)值的位置,并将该间隔设置为白色填充(如果使用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”)的字母不起作用,但您可以稍微修改代码来执行此操作。