数字图像处理的答案解剖.docx
《数字图像处理的答案解剖.docx》由会员分享,可在线阅读,更多相关《数字图像处理的答案解剖.docx(27页珍藏版)》请在冰点文库上搜索。
数字图像处理的答案解剖
图片像素的降低与恢复
I=imread('2.jpg');%读取图片
g=rgb2gray(I);%彩色图像灰度化
figure;imshow(I);%显示原图片
figure;imshow(g);%显示灰度值图片
%降低图像分辨率
g_down_1=g(1:
2:
end,1:
2:
end);%512
g_down_2=g_down_1(1:
2:
end,1:
2:
end);%256
g_down_3=g_down_2(1:
2:
end,1:
2:
end);%128
g_down_4=g_down_3(1:
2:
end,1:
2:
end);%64
g_down_5=g_down_4(1:
2:
end,1:
2:
end);%32
figure;imshow(g_down_1);%显示
figure;imshow(g_down_2);%显示
figure;imshow(g_down_3);%显示
figure;imshow(g_down_4);%显示
figure;imshow(g_down_5);%显示
%把降低分辨率的图像恢复原大小
G_up_5_near=imresize(g_down_3,8,'nearest');%最近邻法放大
G_up_5_bil=imresize(g_down_5,32,'bilinear');%双线性插值法放大
G_up_5_bic=imresize(g_down_5,32,'bicubic');%三次内插法放大
figure;imshow(G_up_5_near);%显示
figure;imshow(G_up_5_bil);%显示
figure;imshow(G_up_5_bic);%显示
图像的四则运算和减法运算
clear;clc;%清空变量及工作区
I=imread('11.jpg');%读取图片
I=rgb2gray(I);%彩色图像灰度化
I2=imread('22.jpg');%读取图片
I2=rgb2gray(I2);%彩色图像灰度化
K=imlincomb(0.6,I,0.4,I2);%计算两幅图像的线性组合
K=histeq(K);%进行直方图均衡化
imshow(K);
figure;
I1=imread('1.jpg');
I2=imread('2.jpg');
I=I1-I2;%图像相减
imshow(I);
histeq(X)函数实现直方图均衡。
因为此函数只能对灰度图像进
行直方图均衡。
故应先将彩图转为灰度图像
位图显示
clear;clc;
I=imread('aerial.tif');
I=double(I);
G_7=bitand(I,128);%求灰度值第七位
I_7=im2uint8(mat2gray(G_7));%转换为无符号八位整型
figure;imshow(I_7);%显示第七位位图
G_6=bitand(I,64);%求灰度值第6位
I_6=im2uint8(mat2gray(G_6));%转换为无符号八位整型
figure;imshow(I_6);%显示第6位位图
G_5=bitand(I,32);
I_5=im2uint8(mat2gray(G_5));
figure;imshow(I_5);
G_4=bitand(I,16);
I_4=im2uint8(mat2gray(G_4));
figure;imshow(I_4);
G_3=bitand(I,8);
I_3=im2uint8(mat2gray(G_3));
figure;imshow(I_3);
G_2=bitand(I,4);
I_2=im2uint8(mat2gray(G_2));
figure;imshow(I_2);
G_1=bitand(I,2);
I_1=im2uint8(mat2gray(G_1));
figure;imshow(I_1);
G_0=bitand(I,1);
I_0=im2uint8(mat2gray(G_0));
figure;imshow(I_0);
I_restore=G_7+G_6+G_5+G_4+G_3+G_2+G_1+G_0;%读取重新储存的图片
figure;imshow(uint8(I_restore));%显示
骨骼图的显示
%读取图像
I=imread('Fig0343(a)(skeleton_orig).tif');
%显示a图像
A=im2double(I);
subplot(2,4,1);
imshow(A);
title('(a)全身骨骼扫描图像');
%显示b图像
subplot(2,4,2);
A=double(A);
w1=fspecial('laplacian',0);
B=imfilter(A,w1,'corr','replicate');
imshow(B);%得到拉普拉斯变换后的图像
title('(b)经过拉普拉斯操作后的结果');
%显示c图像
subplot(2,4,3);
C=A+B;%得到A+B的结果
imshow(C);
title('(c)图a加图b得到的锐化图像');
%显示d图像
subplot(2,4,4);
w1=fspecial('sobel');%得到水平sobel模板
w2=w1';%转置得到竖直sobel模板
G1=imfilter(A,w1);%水平sobel梯度
G2=imfilter(A,w2);%竖直sobel梯度
D=abs(G1)+abs(G2);%sobel梯度
imshow(D);
title('(d)图a经sobel梯度处理后的结果');
%显示e图像
subplot(2,4,5);
e=fspecial('average',5);
E=imfilter(D,e,'corr','replicate');
imshow(E);
title('(e)使用5*5均值滤波器平滑后的sobel图像');
%显示f图像
subplot(2,4,6);
C=im2double(C);
E=im2double(E);
F=C.*E;imshow(F);
title('(f)图c和图e相乘形成的掩蔽图像');
%显示g图像
subplot(2,4,7);
G=abs(A)+abs(F);
imshow(G);
title('(g)由图a和图f求和得到的锐化后的图像');
%显示h图像
subplot(2,4,8);
imshow(imadjust(G,[],[],0.5));
title('(h)对图g应用幂律变换得到的最终结果');
灰度直方图操作
clear;clc;
I=imread('moon.tif');
figure;imshow(I);
figure;imhist(I);%显示灰度直方图
h=imhist(I,256);%长条图显示,宽度为1,
figure;bar(h);
h_scale=imhist(I,25);
x=linspace(0,255,25);%创建向量
figure;bar(x,h_scale);%长条图显示,宽度为25
I_equ=histeq(I,256);%直方图均衡化
figure;imhist(I_equ);
figure;imshow(I_equ);
figure;bar(imhist(I_equ));
图像锐化梯度算子的应用
clear;clc;
f=imread('building.tif');
f=im2double(f);
w1=fspecial('sobel');%得到水平sobel模板
w2=w1';%转置得到竖直sobel模板
g1=imfilter(f,w1,'replicate');%横向梯度算子结果
g2=imfilter(f,w2,'replicate');%纵向梯度算子结果
g=abs(g1)+abs(g2);%sobel梯度
imshow(f);figure;
imshow(g1);figure;
imshow(g2);figure;
imshow(g);
图像锐化拉普拉斯算子的引用
clear;clc;
f=imread('moon.tif');
w4=fspecial('laplacian',0);%生成拉普拉斯滤波器
w8=[111;1-81;111];
f=im2double(f);
g4=f-imfilter(f,w4,'replicate');%g4=f-imfilter(f,w4,'symmetric');
g8=f-imfilter(f,w8,'replicate');%g8=f-imfilter(f,w8,'symmetric');
[A,B]=find(g4<0);%找出矩阵中小于零元素所在行和列,并存在[A,B]中
fori=1:
length(A)%从1到length(A)循环
g4(A(i,1),B(i,1))=0;%令这些元素为0
end
[C,D]=find(g4>1);%找出矩阵中大于一元素所在行和列,并存在[c,d]中
fori=1:
length(C)%从1到length(C)循环
g4(C(i,1),D(i,1))=1;%令这些元素为1
end
figure;imshow(f);
%g4=im2uint8(mat2gray(g4));
%g8=im2uint8(mat2gray(g8));
figure;imshow(imfilter(f,w4,'replicate'))
figure;imshow(g4);
figure;imshow(imfilter(f,w8,'replicate'))
figure;imshow(g8);
平滑空间滤波器
clear;clc;
I=imread('pattern.tif');%读取图像
imshow(I);figure;%显示原图
h=fspecial('average',[1414]);%产生均值滤波器模板
g=imfilter(I,h,'replicate');%滤波
imshow(g);
%阈值分割
I=imread('galaxy.tif');
h=fspecial('average',[1515]);%产生均值滤波器模板
g=imfilter(I,h,'replicate');%滤波
level=graythresh(g);%通过计算获得输入图像的阈值
BW=im2bw(g,level);%通过阈值变换法把灰度图像转换成二值图像
imshow(BW);
%中值滤波
I=imread('imnoise.tif');
g=medfilt2(I,[33]);%窗口大小为3×3的中值滤波
%g=medfilt2(I,[33],'symmetric');
imshow(g);
%顺序滤波
A=imread('imnoise.tif');
B=ordfilt2(A,15,true(7),'symmetric');%图像作顺序统计滤波
figure;imshow(A);figure;imshow(B)
图像增强的三种方法
%inversetransformation
I=imread('breast.tif');
g=im2uint8(mat2gray(I));%图像数据类型转换为无符号八位整型。
g_inver=255-g;%图像反转
figure;imshow(I);
figure;imshow(g_inver);
%logtransform
I=imread('fourier.tif');
g=im2uint8(mat2gray(log(1+double(I))));%对图像进行对数变换
figure;imshow(I);
figure;imshow(g);
%powertransformmoon.tifaerial.tif
I=imread('aerial.tif');
g=im2uint8(mat2gray(double(I).^
(2)));%对图像进行幂律变换
%g=255-I;
figure;
imshow(I);
figure;
imshow(g);
理想低通滤波器
f=imread('dynamic_range.tif');索引形式读入
imshow(f);显示图像
title('Ôͼ');
f=im2double(f);按比例的将其缩放至double类型
F=fftshift(fft2(f));正半轴部分和负半轴部分的图像分别关于各自的中心对称
M=size(F,1);表示维数的第一项
N=size(F,2);表示维数的第二项
u=1:
M;u=[1,2,3,4,…M]
v=1:
N;v=[1,2,3,4,…N]
[V,U]=meshgrid(v,u);产生两个矩阵,第一个矩阵是由v作为行向量组成,第二个向量由u作为列向量组成
D=sqrt((U-(floor(M/2)+1)).^2+(V-(floor(N/2)+1)).^2);计算公式
H=zeros(M,N);产生一个mxn的全零矩阵
H(D<=235)=1;令D<=235在范围内的为1
G=F.*H;进行卷积
G_inv=ifft2(ifftshift(G));进行图像二维离散快速傅里叶变换
figure;建立图形
imshow(real(G_inv));显示图像
title('Â˲¨ºó');
alpha=sum(abs(F(D<=5)).^2)./sum(abs(F(:
)).^2)计算?
巴特沃斯低通滤波器
f=imread('pattern.tif');索引形式读入
imshow(f);显示图像
%title('Ôͼ');
f=im2double(f);按比例的将其缩放至double类型
F=fftshift(fft2(f));正半轴部分和负半轴部分的图像分别关于各自的中心对称
M=size(F,1);表示维数的第一项
N=size(F,2);表示维数的第二项
u=1:
M;u=[1,2,3,4,…M]
v=1:
N;v=[1,2,3,4,…N]
[V,U]=meshgrid(v,u);产生两个矩阵,第一个矩阵是由v作为行向量组成,第二个向量由u作为列向量组成
D=sqrt((U-(floor(M/2)+1)).^2+(V-(floor(N/2)+1)).^2);计算公式?
H=zeros(M,N);产生一个mxn的全零矩阵
D0=235;n=2;%2阶
H=1./(1+(D./D0).^(2*n));公式?
G=F.*H;进行卷积?
G_inv=ifft2(ifftshift(G));进行图像二维离散快速傅里叶变换
figure;建立图形
imshow(real(G_inv));显示图像
%title('Â˲¨ºó')
高斯低通滤波器
clear;clc;
f=imread('broken-text.tif');索引形式读入
imshow(f);显示图像
%title('Ôͼ');
f=im2double(f);按比例的将其缩放至double类型
F=fftshift(fft2(f));正半轴部分和负半轴部分的图像分别关于各自的中心对称
M=size(F,1);表示维数的第一项
N=size(F,2);表示维数的第二项
u=1:
M;u=[1,2,3,4,…M]
v=1:
N;v=[1,2,3,4,…N]
[V,U]=meshgrid(v,u);产生两个矩阵,第一个矩阵是由v作为行向量组成,第二个向量由u作为列向量组成
D=sqrt((U-(floor(M/2)+1)).^2+(V-(floor(N/2)+1)).^2);计算公式?
H=zeros(M,N);产生一个mxn的全零矩阵
D0=80;
H=exp(-D.^2./(2*D0.^2));公式
G=F.*H;
G_inv=ifft2(ifftshift(G));进行图像二维离散快速傅里叶变换
figure;imshow(real(G_inv));
%title('Â˲¨ºó')
高斯高通滤波器(同上)
clear;clc;
f=imread('chest_xray.tif');
imshow(f);
%title('Ôͼ');
f=im2double(f);
F=fftshift(fft2(f));
M=size(F,1);N=size(F,2);
u=1:
M;
v=1:
N;
[V,U]=meshgrid(v,u);
D=sqrt((U-(floor(M/2)+1)).^2+(V-(floor(N/2)+1)).^2);
L=zeros(M,N);
D0=2;截止频率=2
L=exp(-D.^2./(2*D0.^2));
H=1-L;低通变成高通
G=F.*H;
G_inv=ifft2(ifftshift(G));
figure;imshow(real(G_inv),[]);
%title('Â˲¨ºó')
巴特沃斯高通滤波器(同上)
f=imread('thumb_print.tif');
imshow(f);
%title('Ôͼ');
f=im2double(f);
F=fftshift(fft2(f));
M=size(F,1);N=size(F,2);
u=1:
M;
v=1:
N;
[V,U]=meshgrid(v,u);
D=sqrt((U-(floor(M/2)+1)).^2+(V-(floor(N/2)+1)).^2);
L=zeros(M,N);
D0=25;n=4;截止频率=25,设为4阶
L=1./(1+(D./D0).^(2*n));
H=1-L;低通变成高通
G=F.*H;
G_inv=real(ifft2(ifftshift(G)));
figure;imshow(G_inv);
%title('Â˲¨ºó')
I_thresh=G_inv;%指纹处理
[A,B]=find(I_thresh<0);找出矩阵中I_thresh<0元素所在行和列,并存在A,B中
[C,D]=find(I_thresh>=0);找出矩阵中I_thresh>=0元素所在行和列,并存在C,D中
fori=1:
length(A)取i分别为在1到length(A)的每一个数
I_thresh(A(i,1),B(i,1))=0;令这些元素为0
end
fori=1:
length(C)(同上)
I_thresh(C(i,1),D(i,1))=1;令这些元素为1
end
figure;imshow(I_thresh);
clear;clc;
I=zeros(512,512);产生一个512x512的全零矩阵
I(226:
286,240:
266)=1;
imshow(I);
F=fft2(I);
F_no_shift=abs(F);
F_shift=abs(fftshift(F));
%G_no_shift=log(1+F_no_shift);
G_shift=log(1+F_shift);
%figure;imshow(F_no_shift,[]);
%figure;imshow(G_no_shift,[]);
figure;imshow(F_shift,[]);
figure;imshow(G_shift,[]);
%
%%图像旋转
I2=imrotate(I,45,'bilinear','crop');
figure;imshow(I2);
F2=fft2(I2);
F2_shift=abs(fftshift(F2));
G2_shift=log(1+F2_shift);
figure;imshow(F2_shift,[]);
figure;imshow(G2_shift,[]);
振铃效应
f=zeros(512,512);
f(128,128)=255;
f(128,384)=255;
f(384,128)=255;
f(384,384)=255;
f(256,256)=255;
figure;imshow(f);
f=im2double(f);
F=fftshift(fft2(f));
M=size(F,1);N=size(F,2);
u=1:
M;
v=1:
N;
[V,U]=meshgrid(v,u);
D=sqrt((U-(floor(M/2)+1)).^2+(V-(floor(N/2)+1)).^2);
H=zeros(M,N);
H(D<=5)=1;
G=F.*H;
G_inv=ifft2(ifftshift(G));
figure;imshow(real(G_inv),[]);
拉普拉斯滤波器
clear;clc;
f=imread('moon.tif');
imshow(f);
%title('moon');
f=im2double(f);
F=fftshift(fft2(f));
M=size(F,1);N=size(F,2);
u=1:
M;
v=1:
N;
[V,U]=meshgrid(v,u);
H=zeros(M,N);
H=-4*pi^2*((U-(floor(M/2)+1)).^2+(V-(floor(N/2)+1)).^2);
G=F.*H;
G1=real(ifft2(ifftshift(G)));
figure;imshow(G1,[]);%线性映射0-255
G2=G1-min(G1(:
));
G2=G2/max(G2(:
));
G3=im2uint8(G2);
%figure;imshow(G3)%G3ÏßÐÔÓ³ÉäµÈͬÓÚimshow£¨G1,[]);
%title('±ê¶¨ºóµÄͼÏñ');
G2=f-G2;
figure;imshow(G2,[]);
%title('ÀÆÕÀ˹Ëã×ÓÔöǿͼÏñ');
%空间拉普拉斯算子
w4=fspecial('laplacian',0);
sp=imfilter(f,w4);
g4=f-sp;
figure;imshow(sp,[]);
figure;imshow(g4,[]);
第六章
edge_function
clear;clc;%清空命令窗口的所有输入和输出
I=imread('1.jpg');%读入wirebond_mask.tif图像
BW_sobel=edge(I,'sobel');%sobel图像边缘提取
imshow(BW_sobel);%显示图像
BW_prewitt=edge(I,'prewitt