⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 errordiff.m

📁 在二值化前,将像素与阈值的误差扩散到周围像素上,提高图像的二值化质量
💻 M
字号:
%******************************************************
% filename:ErrorDiff.m
% function:在二值化前,将像素与阈值的误差扩散到周围像素上
% date:2006.03.23
% programmer:wt
%******************************************************
function ErrorDiff()
clc,clear

I=imread('E:\work\picture\L0.jpg');
if isrgb(I)
    I=rgb2gray(I);
end
I=double(I);
% 选取原始图像的均值作误差扩散的阈值
t=mean(mean(I));
[m n]=size(I);
% 误差扩散到右,左下,下,右下四个像素上,比例如下
%    * 7
%  3 5 1
t1=16;
I1=Diff_16(I,m,n,t,t1);

% 误差扩散比例
%     * 7 5
% 3 5 7 5 3
% 1 3 5 3 1
t2=48;
I2=Diff_48(I,m,n,t,t2);

% 误差扩散比例
%     * 8 4
% 2 4 8 4 2
% 1 2 4 2 1
t3=42;
I3=Diff_42(I,m,n,t,t3);
% 误差扩散比例
%          **    32
% 12    26    30    16
%    12    26    12
%  5    12    12     5
t4=200;
I4=Diff_200(I,m,n,t,t4);
% 显示图像
%imshow(uint8(I),[]);
figure,imshow(uint8(I1),[]),title('1975:Floyd&Steinberg');
imwrite(logical(I1),'E:\work\picture\L0_16.bmp');
figure,imshow(uint8(I2),[]),title('1976:Jarvis,Judice&Ninke');
imwrite(logical(I2),'E:\work\picture\L0_48.bmp');
figure,imshow(uint8(I3),[]);title('1981:Stucki');
imwrite(logical(I3),'E:\work\picture\L0_42.bmp');
figure,imshow(uint8(I4),[]);title('1985:Stevenson&Arce');
imwrite(logical(I4),'E:\work\picture\L0_200.bmp');
return
%****************************************
%sub1 图像二值化
%****************************************
function bw=ImageToBw(I,t)
Pixelhigh=find(I>=t);
Pixellow=find(I<t);
I(Pixelhigh)=1;
I(Pixellow)=0;
bw=I;
return
%****************************************
%sub2 误差扩散系数为16
%****************************************
function  A=Diff_16(I,m,n,t,t1)
col=zeros(m,1);                     %图像矩阵的左右各加一列,下加一行
row=zeros(1,n+2);
I=[col,I,col];
I=[I;row];
[m1 n1]=size(I);
for i=1:m1-1
    for j=2:n1-1
        I(i,j)=cut(I(i,j));
      if I(i,j)>=t                      %分为两种情况,大于阈值时
        e=(I(i,j)-255)/t1;
        I(i,j+1)=I(i,j+1)+7*e;
        I(i+1,j-1)=I(i+1,j-1)+3*e;
        I(i+1,j)=I(i+1,j)+5*e;
        I(i+1,j+1)=I(i+1,j+1)+e;
      else
        e=I(i,j)/t1;                       %小于阈值时
        I(i,j+1)=I(i,j+1)+7*e;
        I(i+1,j-1)=I(i+1,j-1)+3*e;
        I(i+1,j)=I(i+1,j)+5*e;
        I(i+1,j+1)=I(i+1,j+1)+e;
    end
end
end
I=I(1:m1-1,2:n1-1);    % 舍去增加的行和列
A=ImageToBw(I,t);
return
%****************************************
%sub3 误差扩散系数为48
%****************************************
function B=Diff_48(I,m,n,t,t2)
col=zeros(m,2);                     %图像矩阵的左右各加两列,下加两行
row=zeros(2,n+4);
I=[col,I,col];
I=[I;row];
[m1 n1]=size(I);
for i=1:m1-2
    for j=3:n1-2
        I(i,j)=cut(I(i,j));
      if I(i,j)>=t                      %分为两种情况,大于阈值时
        e=(I(i,j)-255)/t2;
        I(i,j+1)=I(i,j+1)+7*e;
        I(i,j+2)=I(i,j+2)+5*e;
        I(i+1,j-2)=I(i+1,j-2)+3*e;
        I(i+1,j-1)=I(i+1,j-1)+5*e;
        I(i+1,j)=I(i+1,j)+7*e;
        I(i+1,j+1)=I(i+1,j+1)+5*e;
        I(i+1,j+2)=I(i+1,j+2)+3*e;
        I(i+2,j-2)=I(i+2,j-2)+e;
        I(i+2,j-1)=I(i+2,j-1)+3*e;
        I(i+2,j)=I(i+2,j)+5*e;
        I(i+2,j+1)=I(i+2,j+1)+3*e;
        I(i+2,j+2)=I(i+2,j+2)+e;
      else
        e=I(i,j)/t2;                       %小于阈值时
        I(i,j+1)=I(i,j+1)+7*e;
        I(i,j+2)=I(i,j+2)+5*e;
        I(i+1,j-2)=I(i+1,j-2)+3*e;
        I(i+1,j-1)=I(i+1,j-1)+5*e;
        I(i+1,j)=I(i+1,j)+7*e;
        I(i+1,j+1)=I(i+1,j+1)+5*e;
        I(i+1,j+2)=I(i+1,j+2)+3*e;
        I(i+2,j-2)=I(i+2,j-2)+e;
        I(i+2,j-1)=I(i+2,j-1)+3*e;
        I(i+2,j)=I(i+2,j)+5*e;
        I(i+2,j+1)=I(i+2,j+1)+3*e;
        I(i+2,j+2)=I(i+2,j+2)+e;
    end
end
end
I=I(1:m1-2,3:n1-2);    % 舍去增加的行和列
B=ImageToBw(I,t);
return
%****************************************
%sub4 误差扩散系数为42
%****************************************
function C=Diff_42(I,m,n,t,t3)
col=zeros(m,2);                     %图像矩阵的左右各加两列,下加两行
row=zeros(2,n+4);
I=[col,I,col];
I=[I;row];
[m1 n1]=size(I);
for i=1:m1-2
    for j=3:n1-2
        I(i,j)=cut(I(i,j));
      if I(i,j)>=t                      %分为两种情况,大于阈值时
        e=(I(i,j)-255)/t3;
        I(i,j+1)=I(i,j+1)+8*e;
        I(i,j+2)=I(i,j+2)+4*e;
        I(i+1,j-2)=I(i+1,j-2)+2*e;
        I(i+1,j-1)=I(i+1,j-1)+4*e;
        I(i+1,j)=I(i+1,j)+8*e;
        I(i+1,j+1)=I(i+1,j+1)+4*e;
        I(i+1,j+2)=I(i+1,j+2)+2*e;
        I(i+2,j-2)=I(i+2,j-2)+e;
        I(i+2,j-1)=I(i+2,j-1)+2*e;
        I(i+2,j)=I(i+2,j)+4*e;
        I(i+2,j+1)=I(i+2,j+1)+2*e;
        I(i+2,j+2)=I(i+2,j+2)+e;
      else
        e=I(i,j)/t3;                       %小于阈值时
        I(i,j+1)=I(i,j+1)+8*e;
        I(i,j+2)=I(i,j+2)+4*e;
        I(i+1,j-2)=I(i+1,j-2)+2*e;
        I(i+1,j-1)=I(i+1,j-1)+4*e;
        I(i+1,j)=I(i+1,j)+8*e;
        I(i+1,j+1)=I(i+1,j+1)+4*e;
        I(i+1,j+2)=I(i+1,j+2)+2*e;
        I(i+2,j-2)=I(i+2,j-2)+e;
        I(i+2,j-1)=I(i+2,j-1)+2*e;
        I(i+2,j)=I(i+2,j)+4*e;
        I(i+2,j+1)=I(i+2,j+1)+2*e;
        I(i+2,j+2)=I(i+2,j+2)+e;
    end
end
end
I=I(1:m1-2,3:n1-2);    % 舍去增加的行和列
C=ImageToBw(I,t);
return
%****************************************
%sub5 误差扩散系数为200
%****************************************
function D=Diff_200(I,m,n,t,t4)
col=zeros(m,3);                     %图像矩阵的左右各加三列,上下各加三行
row=zeros(3,n+6);
I=[col,I,col];
I=[I;row];
[m1 n1]=size(I);
for i=1:m1-3
    for j=4:n1-3
      I(i,j)=cut(I(i,j));
      if I(i,j)>=t                      %分为两种情况,大于阈值时
        e=(I(i,j)-255)/t4;
        I(i,j+2)=I(i,j+2)+32*e;
        I(i+1,j-3)=I(i+1,j-3)+12*e;
        I(i+1,j-1)=I(i+1,j-1)+26*e;
        I(i+1,j+1)=I(i+1,j+1)+30*e;
        I(i+1,j+3)=I(i+1,j+3)+16*e;
        I(i+2,j-2)=I(i+2,j-2)+12*e;
        I(i+2,j)=I(i+2,j)+26*e;
        I(i+2,j+2)=I(i+2,j+2)+12*e;
        I(i+3,j-3)=I(i+3,j-3)+5*e;
        I(i+3,j-1)=I(i+3,j-1)+12*e;
        I(i+3,j+1)=I(i+3,j+1)+12*e;
        I(i+3,j+3)=I(i+3,j+3)+5*e;
      else
        e=I(i,j)/t4;                       %小于阈值时
        I(i,j+2)=I(i,j+2)+32*e;
        I(i+1,j-3)=I(i+1,j-3)+12*e;
        I(i+1,j-1)=I(i+1,j-1)+26*e;
        I(i+1,j+1)=I(i+1,j+1)+30*e;
        I(i+1,j+3)=I(i+1,j+3)+16*e;
        I(i+2,j-2)=I(i+2,j-2)+12*e;
        I(i+2,j)=I(i+2,j)+26*e;
        I(i+2,j+2)=I(i+2,j+2)+12*e;
        I(i+3,j-3)=I(i+3,j-3)+5*e;
        I(i+3,j-1)=I(i+3,j-1)+12*e;
        I(i+3,j+1)=I(i+3,j+1)+12*e;
        I(i+3,j+3)=I(i+3,j+3)+5*e;
    end
end
end
I=I(1:m1-3,4:n1-3);    % 舍去增加的行和列
D=ImageToBw(I,t);
return
%***********************************
%sub6 限幅
%***********************************
function E=cut(ee)
if ee>255
    ee=255; 
 elseif ee<0
    ee=0;
end
 E=ee;
return

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -