本文系《数字图像处理原理与实践(MATLAB版)》一书之代码系列的Part6,辑录该书第281至第374页之代码,供有须要读者下载研究使用。代码运行结果请參见原书配图,建议下载代码前阅读下文:

关于《数字图像处理原理与实践(MATLAB版)》一书代码公布的说明

http://blog.csdn.net/baimafujinji/article/details/40987807

P338

i=double(imread('vase.tif'));
[C,S]=wavedec2(i,2,'db1');
a2=appcoef2(C,S,'db1',2);
dh1=detcoef2('h',C,S,1);
dv1=detcoef2('v',C,S,1);
dd1=detcoef2('d',C,S,1);
dh2=detcoef2('h',C,S,2);
dv2=detcoef2('v',C,S,2);
dd2=detcoef2('d',C,S,2);
[x,y]=size(i);
img = zeros(x,y);
img(1:x/4,1:y/4) =im2uint8(mat2gray(a2));
img(((x/4)+1):y/2,1:y/4) = im2uint8(mat2gray(dv2));
img(((x/4)+1):x/2,1:y/4) = im2uint8(mat2gray(dv2));
img(1:x/4,((y/4)+1):y/2) = im2uint8(mat2gray(dh2));
img(((x/4)+1):x/2,((y/4)+1):y/2) = im2uint8(mat2gray(dd2));
img(((x/2)+1):x,1:y/2) = im2uint8(mat2gray(dv1));
img(1:x/2,((y/2)+1):y) = im2uint8(mat2gray(dh1));
img(((x/2)+1):x,((y/2)+1):y) = im2uint8(mat2gray(dd1));
imshow(img,[]);

P341-1

X1 = imread('cathe1.bmp');
X2 = imread('cathe2.bmp');
XFUS = wfusimg(X1,X2,'sym4',5,'mean','max');
imshow(XFUS,[]);

P341-2

X1 = imread('cathe1.bmp');
X2 = imread('cathe2.bmp');
M1 = double(X1) / 256;
M2 = double(X2) / 256;
N = 4;
wtype = 'sym4';
[c0,s0] = wavedec2(M1, N, wtype);
[c1,s1] = wavedec2(M2, N, wtype);
length = size(c1);
Coef_Fusion = zeros(1,length(2));
%低频系数的处理,取平均值
Coef_Fusion(1:s1(1,1)) = (c0(1:s1(1,1))+c1(1:s1(1,1)))/2;
%处理高频系数。取绝对值大者。这里用到了矩阵乘法
MM1 = c0(s1(1,1)+1:length(2));
MM2 = c1(s1(1,1)+1:length(2));
mm = (abs(MM1)) > (abs(MM2));
Y  = (mm.*MM1) + ((~mm).*MM2);
Coef_Fusion(s1(1,1)+1:length(2)) = Y;
%重构
Y = waverec2(Coef_Fusion,s0,wtype);
imshow(Y,[]);

P344

I = imread('noise_lena.bmp');
[thr,sorh,keepapp] = ddencmp('den','wv',I);
de_I = wdencmp('gbl',I,'sym4',2,thr,sorh,keepapp);
imwrite(im2uint8(mat2gray(de_I)), 'denoise_lena.bmp');

P361

function diff_im = anisodiff(im, num_iter, delta_t, k, option)

im = double(im);
% 赋初值
diff_im = im;

% 用以计算方向梯度的卷积模板
hN = [0 1 0; 0 -1 0; 0 0 0];
hS = [0 0 0; 0 -1 0; 0 1 0];
hE = [0 0 0; 0 -1 1; 0 0 0];
hW = [0 0 0; 1 -1 0; 0 0 0];
hNE = [0 0 1; 0 -1 0; 0 0 0];
hSE = [0 0 0; 0 -1 0; 0 0 1];
hSW = [0 0 0; 0 -1 0; 1 0 0];
hNW = [1 0 0; 0 -1 0; 0 0 0];

% 各向异性扩散滤波
for t = 1:num_iter
% 计算梯度
    nablaN = conv2(diff_im,hN,'same');
    nablaS = conv2(diff_im,hS,'same');   
    nablaW = conv2(diff_im,hW,'same');
    nablaE = conv2(diff_im,hE,'same');   
    nablaNE = conv2(diff_im,hNE,'same');
    nablaSE = conv2(diff_im,hSE,'same');   
    nablaSW = conv2(diff_im,hSW,'same');
    nablaNW = conv2(diff_im,hNW,'same');
    % 计算扩散系数
    % OPTION  1: c(x,y,t) = exp(-(nablaI/kappa).^2)
    if option == 1
        cN = exp(-(nablaN/k).^2);
        cS = exp(-(nablaS/k).^2);
        cW = exp(-(nablaW/k).^2);
        cE = exp(-(nablaE/k).^2);
        cNE = exp(-(nablaNE/k).^2);
        cSE = exp(-(nablaSE/k).^2);
        cSW = exp(-(nablaSW/k).^2);
        cNW = exp(-(nablaNW/k).^2);
    % OPTION  2: c(x,y,t) = 1./(1 + (nablaI/kappa).^2)
    elseif option == 2
        cN = 1./(1 + (nablaN/k).^2);
        cS = 1./(1 + (nablaS/k).^2);
        cW = 1./(1 + (nablaW/k).^2);
        cE = 1./(1 + (nablaE/k).^2);
        cNE = 1./(1 + (nablaNE/k).^2);
        cSE = 1./(1 + (nablaSE/k).^2);
        cSW = 1./(1 + (nablaSW/k).^2);
        cNW = 1./(1 + (nablaNW/k).^2);
    end

% 计算一次迭代结果
    diff_im = diff_im + delta_t*(...
        cN.*nablaN + cS.*nablaS + cW.*nablaW + cE.*nablaE + ...
        cNE.*nablaNE + cSE.*nablaSE + cSW.*nablaSW + cNW.*nablaNW );
end

P363

num_iter=50; delta_t=0.125;
k=4; option=2;
i = imread('noise_lena.bmp');
diff = anisodiff(i, num_iter, delta_t, k, option);

P370

function x=Thomas(N, alpha, beta, gama, d)

x=d;
m=zeros(1,N); l=zeros(1,N);
m(1)=alpha(1);
for i=2:N
    l(i)=gama(i)/m(i-1);
    m(i)=alpha(i)-l(i)*beta(i-1);
end
y=zeros(1,N);
y(1)=d(1);
for i=2:N
    y(i)=d(i)-l(i)*y(i-1);
end

x=zeros(1,N);
x(N)=y(N)/m(N);
for i=N-1:-1:1
    x(i)=(y(i)-beta(i)*x(i+1))/m(i);
end

P371

function Ig=gauss(I,ks,sigma2)

[Ny,Nx]=size(I);
hks=(ks-1)/2;  % 高斯核的一半
%%- 一维卷积
if (Ny<ks)
    x=(-hks:hks);
    flt=exp(-(x.^2)/(2*sigma2));       % 一维高斯函数
    flt=flt/sum(sum(flt));             % 归一化
    
    x0=mean(I(:,1:hks)); xn=mean(I(:,Nx-hks+1:Nx));
    eI=[x0*ones(Ny,ks) I xn*ones(Ny,ks)];
    Ig=conv(eI,flt);
    Ig=Ig(:,ks+hks+1:Nx+ks+hks);
else
    %%- 二维卷积
    x=ones(ks,1)*(-hks:hks); y=x';
    flt=exp(-(x.^2+y.^2)/(2*sigma2));  % 二维高斯函数
    flt=flt/sum(sum(flt));             % 归一化
    
    if (hks>1)
        xL=mean(I(:,1:hks)')'; xR=mean(I(:,Nx-hks+1:Nx)')';
    else
        xL=I(:,1); xR=I(:,Nx);
    end
    eI=[xL*ones(1,hks) I xR*ones(1,hks)];
    if (hks>1)
        xU=mean(eI(1:hks,:)); xD=mean(eI(Ny-hks+1:Ny,:));
    else
        xU=eI(1,:); xD=eI(Ny,:);
    end
    eI=[ones(hks,1)*xU; eI; ones(hks,1)*xD];
    Ig=conv2(eI,flt,'valid');
end

P372

Img = imread('Lena.bmp');
Img = double(Img);

[nrow, ncol] = size(Img);

N=max(nrow, ncol);
%储存三对角矩阵
alpha=zeros(1,N); beta=zeros(1,N); gama=zeros(1,N);
%储存中间结果
u1=zeros([nrow, ncol]);
u2=zeros([nrow, ncol]);
timestep=5;

%用以控制迭代次数
%iterations = 2;
%for times = 1:iterations
    I_temp=gauss(Img,3,1);
    Ix = 0.5*(I_temp(:,[2:ncol,ncol])-I_temp(:,[1,1:ncol-1]));
    Iy = 0.5*(I_temp([2:nrow,nrow],:)-I_temp([1,1:nrow-1],:));
    K = 10
    grad=Ix.^2+Iy.^2;
    g=1./(1+grad/K*K); %边缘压迫因子
    
    % 使用Thomas算法逐行求解u1
    for i=1:nrow
        beta(1)=-0.5*timestep*(g(i,2)+g(i,1));
        alpha(1)=1-beta(1);
        for j=2:ncol-1
            beta(j)=-0.5*timestep*(g(i,j+1)+g(i,j));
            gama(j)=-0.5*timestep*(g(i,j-1)+g(i,j));
            alpha(j)=1-beta(j)-gama(j);
        end
        gama(ncol)=-0.5*timestep*(g(i,ncol)+g(i,ncol-1));
        alpha(ncol)=1- gama(ncol);
        u1(i,:)=Thomas(ncol,alpha,beta,gama,Img(i,:));
    end
    
    % 使用Thomas算法逐列求解u2
    for j=1:ncol
        beta(1)=-0.5*timestep*(g(2,j)+g(1,j));
        alpha(1)=1-beta(1);
        for i=2:nrow-1
            beta(j)=-0.5*timestep*(g(i+1,j)+g(i,j));
            gama(j)=-0.5*timestep*(g(i-1,j)+g(i,j));
            alpha(j)=1-beta(j)-gama(j);
        end
        gama(nrow)=-0.5*timestep*(g(nrow,j)+g(nrow-1,j));
        alpha(nrow)=1- gama(nrow);
        u2(:,j)=Thomas(nrow,alpha,beta,gama,Img(:,j));
    end
    Img=0.5*(u1+u2);
    % 显示处理结果
    imshow(uint8(Img));
%end

(代码公布未完,请待兴许...)

《数字图像处理原理与实践(MATLAB版)》一书之代码Part6的更多相关文章

  1. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part2

    本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part2(P43~80),代码运行结果请參见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MA ...

  2. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part1

    本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part1(P1~42).代码运行结果请參见原书配图. P20 I = imread('lena.jpg');BW1 = ...

  3. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part5

    <数字图像处理原理与实践(MATLAB版)>一书之代码Part5 本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part5.辑录该书第225至第280页之代 ...

  4. 数字图像处理原理与实践(MATLAB版)勘误表

    本文系<数字图像处理原理与实践(MATLAB版)>一书的勘误表. [内容简单介绍]本书全面系统地介绍了数字图像处理技术的理论与方法,内容涉及几何变换.灰度变换.图像增强.图像切割.图像去噪 ...

  5. 《数字图像处理原理与实践(MATLAB文本)》书代码Part7

    这篇文章是<数字图像处理原理与实践(MATLAB文本)>一本书的代码系列Part7(由于调整先前宣布订单,请读者注意分页程序,而不仅仅是基于标题数的一系列文章),第一本书特色186经225 ...

  6. Reading | 《数字图像处理原理与实践(MATLAB版)》(未完待续)

    目录 一.前言 1.MATLAB or C++ 2.图像文件 文件头 调色板 像素数据 3.RGB颜色空间 原理 坐标表示 4.MATLAB中的图像文件 图像类型 image()函数 imshow() ...

  7. FPGA经典:Verilog传奇与基于FPGA的数字图像处理原理及应用

    一 简述 最近恶补基础知识,借了<<Verilog传奇>>,<基于FPGA的嵌入式图像处理系统设计>和<<基千FPGA的数字图像处理原理及应用>& ...

  8. MATLAB数字图像处理(一)基础操作和傅立叶变换

    数字图像处理是一门集计算机科学.光学.数学.物理学等多学科的综合科学.随着计算机科学的发展,数字图像处理技术取得了巨大的进展,呈现出强大的生命力,已经在多种领域取得了大量的应用,推动了社会的发展.其中 ...

  9. Win8MetroC#数字图像处理--2.2图像二值化函数

    原文:Win8MetroC#数字图像处理--2.2图像二值化函数 [函数代码] /// <summary> /// Binary process. /// </summary> ...

随机推荐

  1. BZOJ 2324: [ZJOI2011]营救皮卡丘( floyd + 费用流 )

    昨晚写的题...补发一下题解... 把1~N每个点拆成xi, yi 2个. 预处理i->j经过编号不超过max(i,j)的最短路(floyd) S->0(K, 0), S->xi(1 ...

  2. 在JSTL EL中处理java.util.Map,及嵌套List的情况

    关联的键查找存储在映射中的值. 在方括号中指定键,并将相应的值作为表达式的值返回.例如,表达式 ${map['key']} 返回与 map标识符所引用的 Map 中的 "key" ...

  3. QT显示如何减轻闪屏(双缓冲和NoErase)

    很多同志在些QT 程序后会遇见闪屏的问题, 有时速度非常快,但毕竟影响了显示效果,如何做到减轻屏幕抖动或闪屏呢?我曾试过如下的办法:1.使用双缓冲. 比如我们在一个Widget里面绘多个图的话, 先创 ...

  4. 领域驱动设计系列(2)浅析VO、DTO、DO、PO的概念、区别和用处

    PO:persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录.好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象. BO:business object业 ...

  5. Struts2 一张图片引发的bug

    今天如常的打开项目开放.写了一会保存测试.在登录时出了个错误当不影响正常使用.丫的昨天还好好的.行下手上的工作 开始找bug 错误核心代码如下: 10:34:46,442  WARN OgnlValu ...

  6. CCNP路由实验(1) -- EIGRP

    EIGRP(Enhanced Interior Gateway Routing Protocol,增强型内部网关路由协议)是Cisco公司开发的一个平衡混合型路由协议,它融合了距离向量和链路状态两种路 ...

  7. Dialog with HTML skin using CDHtmlDialog and SetWindowRgn

    Introduction This program demonstrates how to use CDHtmlDialog and SetWindowRgn functions to give a ...

  8. 动态子类化CComboBox以得到子控件EDIT及LISTBOX

    动态子类化CComboBox以得到子控件EDIT及LISTBOX Joise.LI写于2004-4-6 ComboBox是比较常用的一个控件,有三种样式:CBS_SIMPLE(简单),CBS_DROP ...

  9. C#实现 ffmpeg视频转码、播放

    近来公司项目要求实现全景相机的视频截取,但是截取的视频需求转码上传.经过研究采用ffmpeg转码,奉上一个详细介绍的博文: 最简单的基于FFMPEG的转码程序 主要是转码的操作过程,能够实现了从相机获 ...

  10. jQuery Lint: enables you to automatically inject jQuery Lint into the page as it is loaded (great for ad-hoc code validation)

    FireQuery is a Firebug extension for jQuery development jQuery Lint: enables you to automatically in ...