数字图像处理基本操作.docx
- 文档编号:24200372
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:24
- 大小:203.66KB
数字图像处理基本操作.docx
《数字图像处理基本操作.docx》由会员分享,可在线阅读,更多相关《数字图像处理基本操作.docx(24页珍藏版)》请在冰豆网上搜索。
数字图像处理基本操作
Matlab图像的读取和存储
图像的读取
l=imread(‘pout.tif');
imread是读取图像的函数。
pout.tif是matlab内置的图像,不管在什么程序内都可以直接读
取。
这里我们来说几种常见的情形
注:
Matlab文件夹内有test.m,1.jpg,image文件夹,同时image文件夹内有2.jpg
读取1.jpg
I=imread(‘1.jpg');
读取2.jpg
I=imread(‘imag^pg')相对寸路径的读取
读取D:
\1023\25\1.jpg
I=imread(‘D:
1.jpg'绝寸路径的读取
读取D:
\1023\25内20个图像。
fori=1:
20
I=imread([‘D:
',num2str(i),'.jpg']);
end
图像的显示
关于这三个函数用法的区别,主要的意思是:
imshow显示按照原来的比例,而image会改
变原来图像的比例。
imtool,很少用到。
一般用imshow就足够了。
那么什么时候用figure呢?
当程序中只显示一幅图像时,直接imshow就可以。
然后当图像
多的时候,就需要用到figuure;imshow(l1);figure;imshow(l2);figure;imshow(l3)
如果想要在一张图片内,显示好几个图怎么办呢?
title显示在图像的上方,起到提示的作
用。
l=imread('pout.tif);
subplot(221);imshow(I);title('1');
subplot(222);imshow(l);title
(2);
subplot(223);imshow(l);title(3);
subplot(224);imshow(l);title('4');
其中前面的22代表是2*2的分布,也可以是2*3,3*4等。
按照行来排列,从第一行开始分别为1234。
如图所示。
」
3
如果没有要求的话,直接用figure。
此时希望图2来显示某个图像,那么figure
(2),就指
定来显示某个图像。
当然了,如果仅有一个图像显示这样做,那么可能会被覆盖掉,因此,一个程序中的用法一定要统一,并且保证后面的,不要把前面的覆盖掉。
图像的存储
imwrite(l,'pout1.jpg');
同样,imwrite也有相对路径和绝对路径的存储,以及连续的存储方法。
同imread
imwrite(l,'pout1.jpg');
imwrite(l,'imagepout1.jpg');
imwrite(l,'D:
pout1.jpg');
imwrite(l,['image',num2str(i),'.jpg']);%i是变量,需要定义
这里的.jpg可以改成.bmp等,想要的格式。
需要注明的是,存储所选择的文件夹,需要已经建立好。
自动建立文件夹需要用mkdir函数。
mkdir(‘D:
1')%绝对路径的建立。
mkdir(‘1');%绝对路径文件夹的建立。
创建之后,在Matlab文件夹内。
这样就能够节省很多的人力。
当文件比较多的情况下,人工去建立的话,还容易出错。
代码:
l=imread('pout.tif);
figure;
subplot(221);imshow(l);title('1');
subplot(222);imshow(l);title('2');
subplot(223);imshow(l);title(3);
subplot(224);imshow(l);title('4');
whos;
mkdir('image')
imwrite(l,'image\pout2.jpg');
Matlab图像的叠加
将两幅图像比率叠加
源函数
function[imout]=ImageAdd(ima,imb,x,y,rate)
%UNTITLED此处显示有关此函数的摘要
%此处显示详细说明
[m,n,g]=size(ima);
[a,b,g1]=size(imb);
ima=im2double(ima);
imb=im2double(imb);
imout=zeros(m,n,g);
fori=1:
m
forj=1:
n
if(i<=a&&i>=x&&j>=y&&j<=b)
imout(i,j,:
)=((ima(i,j,:
)*(100-rate)+imb(i-x+1,j-y+1,:
)*rate))/100;
else
imout(i,j,:
)=ima(i,j,:
);
end
ilTf件¥1
Matlab图像颜色空间转换
程序
clear
rgb=imread('G:
\Learning\MultiMedia\666.jpg');
rgb2hsi(rgb);
rgb_r=rgb(:
:
1);
rgb_g=rgb(:
:
2);
rgb_b=rgb(:
:
3);
[n,m]=size(rgb);
zero=zeros(n,m/3);
Y=0.229*rgb_r+0.587*rgb_g+0.114*rgb_b;
U=-0.147*rgb_r-0.289*rgb_g+0.436*rgb_b;
V=0.615*rgb_r-0.515*rgb_g-0.100*rgb_b;
I=0.596*rgb_r-0.275*rgb_g-0.321*rgb_b;
Q=0.212*rgb_r-0.523*rgb_g+0.311*rgb_b;
Cr=0.5*rgb_r-0.4187*rgb_g-0.0813*rgb_b+128;
Cb=-0.1687*rgb_r-0.3313*rgb_g+0.5*rgb_b+128;
I=(rgb_r+rgb_g+rgb_b)/3;
R=cat(3,Y,zero,zero);
G=cat(3,zero,U,zero);
B=cat(3,zero,zero,V);
RGB=cat(3,Y,Cr,Cb);%通过修改参数的值可以显示各种颜色空间的效果
imshow(RGB);
subplot(2,2,1),imshow(R),title('红色分量');
subplot(2,2,2),imshow(G),title('绿色分量');
subplot(2,2,3),imshow(B),title('蓝色分量');subplot(2,2,4),imshow(RGB);
HIS:
functionhsi=rgb2hsi(rgb)
%提取单通道分量rgb=im2double(rgb);
r=rgb(:
:
1);
g=rgb(:
:
2);
b=rgb(:
:
3);%实现转换num=0.5*((r-g)+(r-b));
den=sqrt((r-g).A2+(r-b).*(g-b));
theta=acos(num./(den+eps));
H=theta;
H(b>g)=2*pi-H(b>g);
H=H/(2*pi);
num=min(min(r,g),b);
den=r+g+b;
den(den==0)=eps;
S=1-3.*num./den;
H(S==0)=0;
I=(r+g+b)/3;
hsi=cat(3,H,S,I);imshow(hsi);
CMY:
functionhsi=rgb2CMY(rgb)rgb=im2double(rgb);
r=rgb(:
:
1);
g=rgb(:
:
2);
b=rgb(:
:
3);
C=1-r;
M=1-g;
Y=1-b;
CMY=cat(3,C,M,Y);imshow(CMY);
实验内容:
读入彩色图像,提取其中的R、G、B颜色分量,并展示出来。
我们学习了多种表示图像的颜色空间,请编写程序将图像转换到YUV、YIQ、YCrCb、HIS、
CMY等颜色空间,并展示出来。
颜色空间的转化关系参考以下公式:
原始图片
三个色调分量
I=0.596R
Q=0.212R
YUV与RGB之间的转换
Y=0.229R+0.587G+0.114B
U=-0.147R—0.289G+0.436B
V=0.615R—0.515G—0.100B
YIQ与RGB之间的转换
Y=0.299R+0.587G+0.114B
—0.275G—0.321B
—0.523G+0.311B
YCrCb与RGB之间的转换
Y=0.2990R+0.5870G+0.1140B
Cr=0.5000R-0.4187G-0.0813B+128
Cb=-0.1687R-0.3313G+0.5000B+12
HSI与RGB之间的转换
1=(R+G+B)/3
H=arccos{0.5*((R-G)+(R-B))/((R-G)A2+(R-B)(G-B))9.5}
S=1-[min(R,G,B)/I]
图像DCT变换(包含三种滤波器的平滑和锐化效果比较)
代码
globalgmainData;
[fname,pname]=uigetfile('*.jpg','打开文件');
iffname==0
return;
end
[Data,map]=imread(fname);%读取图像数据
%new=rgb2gray(Data);
%imwrite(new,'new.bmp','bmp')
%Data=im2bw(Data,map,0.6);%im2bw转为二进制阈值0.6
%Data=+Data;%逻辑格式转为浮点格式
Data=rgb2gray(Data);
subplot(1,2,1);%准备显示两幅图像
imshow(Data);
functionDCTcode;
globalData;%全局变量,用于共享图像数据
[m,n]=size(Data);
fid=fopen('dct.bin','w+');%创建dct.bin用存储DCT和BTC混合编码后
的二进制文件。
%补0使尺寸为4的整数倍以便分块
m仁4*ceil(m/4);n1=4*ceil(n/4);
Datatemp=zeros(m1,n1);
Datatemp(1:
m,1:
n)=Data;
%
fwrite(fid,m1,'long');fwrite(fid,n1,'long');%在文件中记录图像大小
block=zeros(4,4);%4X4大小的子带
forj=1:
4:
n
fori=1:
4:
m
fort=0:
1:
3
forp=0:
1:
3
block(1+t,1+p)=Datatemp(i+t,j+p);%取出4X4数据块
end
end
%对变换后数据进编码后存储或发送,只取其中的2X2数据DctBlock=dct2(block);
%存储(发送)编码文件
fwrite(fid,DctBlock(1,1),'bit12');%直流分量,用12bit量化fwrite(fid,DctBlock(1,2),'bit9');%用9bit量化非直流分量fwrite(fid,DctBlock(2,1),'bit9');
fwrite(fid,DctBlock(2,2),'bit9');
end
end
fclose(fid);
functionIDctcode;
用于存
fid=fopen('dct.bin','r');m=fread(fid,1,'long');n=fread(fid,1,'long');data=zeros(m,n);%放图像数据temp=zeros(4,4);
block=zeros(4,4);
%读取方块数据
forj=1:
4:
n
fori=1:
4:
m
block(1,1)=fread(fid,1,'bit12');
block(1,2)=fread(fid,1,'bit9');
block(2,1)=fread(fid,1,'bit9');
block(2,2)=fread(fid,1,'bit9');
temp=idct2(block);
fort=0:
1:
3
forp=0:
1:
3
Data(i+t,j+p)=temp(1+t,1+p);
end
end
end
end
data=uint8(Data);
subplot(1,2,2);
imshow(data);%显示图像
fclose(fid);
图像的傅立叶变换
读入一幅图像;对图像做FFT。
使用’subplot'命令,同时显示原始图像
其频谱图;
代码及图像
l=imread('f:
\lena.jpg');%读入图像
F=fft2(im2double(l));%FFT
F=fftshift(F);%FFT频谱平移
F=real(F);
T=log(F+1);%频谱对数变换subplot(1,2,1),imshow(l),title('原始图像');
subplot(1,2,2),imshow(T,[]),title('原始图像其频谱图')
原皓團煤原始團擁苴频诺團
读入一幅图像,分别为图像添加椒盐、高斯噪声,做FFT变换。
使
用’subplot'命令,将原始图像、原始图像频谱图、添加噪声后的图像,以及噪声图像的频谱图同时显示出来。
得到原始图像的频谱图的方法同上,然后对原图像模拟叠加密度为
0.04的椒盐噪声,然后添加模拟均值为0方差为0.02的高斯噪声,然
后得到噪声图像的频谱图,方法同上,最后显示所有图像。
2.2代码及图像
l=imread('f:
\lena.jpg');%读入图像
F=fft2(im2double(l));%FFT
F=fftshift(F);%FFT频谱平移
F=real(F);
T=log(F+1);%频谱对数变换
subplot(3,2,1),imshow(l),title('原始图像');
subplot(3,2,2),imshow(T,[]),title('原始图像其频谱图’);
S=imnoise(l,'salt&pepper',0.04);%模拟叠加密度为0.04的椒盐噪声
K=fft2(im2double(S));%FFT
K=fftshift(K);%FFT频谱平移
K=real(K);
T=log(K+1);%频谱对数变换
subplot(3,2,3),imshow(S),title('添加椒盐噪声后的图像');subplot(3,2,4),imshow(T,[]),title('椒盐噪声频谱图');
G=imnoise(l,'gaussian',0,0.02);%模拟均值为0方差为0.02的高斯噪
声,
H=fft2(im2double(G));%FFT
H=fftshift(H);%FFT频谱平移
H=real(H);
T=log(H+1);%频谱对数变换
subplot(3,2,5),imshow(G),title('添加高斯噪声后的图像');subplot(3,2,6),imshow(T,[]),title('高斯噪声频谱图')
JS始團像武頻谱團
椒盐噪声频谱團
离斯噪声频谱團
逓加槻盐噪声后的團像
漳加高斯噪声后的團像
读入一幅图像,对图像分别进行高斯低通、巴特沃兹低通、高斯高通和巴特沃兹高通频域滤波,比较其锐化和平滑效果;
3.1实验过程
对于高斯低通频域滤波,首先求原图像的频谱图,然后根据二维高斯低通滤波器(GLPF)定
义,对频谱图做高斯低通滤波,使低频通过而使高频衰减,最后做快速傅里叶逆变换,结果
发现滤波后的图像变模糊,比原始图像减少尖锐的细节部分而突出平滑过渡部分;对于巴特
沃兹低通频域滤波,然后根据二级巴特沃思低通滤波器(BLPF)定义,对频谱图做巴特沃兹
低通滤波,使低频通过而使高频衰减,最后做快速傅里叶逆变换,结果发现滤波后的图像变
经对比图像后发现,经过巴特
模糊,比原始图像减少尖锐的细节部分而突出平滑过渡部分;沃思低通滤波的图像比经过高斯低通频域滤波的图像更平滑。
对于高斯高通频域滤波,首先求原图像的频谱图,然后根据截频距原点为D0的高斯高通滤波器(GHPF)定义,对频谱图做高斯高通滤波,使高频通过而使低频衰减,最后做快速傅里叶逆变换,结果发现滤波后的图像变锐化,比原始图像减少平滑过渡而突出边缘等细节部分;对于巴特沃兹高通频域滤波,然后根据二阶且截至频率距原点的距离为D0的巴特沃思高通滤波器(BHPF)定义,对频谱图做巴特沃兹高通滤波,使高频通过而使低频衰减,最后做快速傅里叶逆变换,结果发现滤波后的图像变锐化,比原始图像减少平滑过渡而突出边缘等细节部分;经对比图像后发现,经过高斯低通滤波的图像比经过高斯低通巴特沃思低通频域滤波的图像更平滑。
3.2代码及图像
%高斯低通频域滤波
I=imread('f:
\lena.jpg');
subplot(1,2,1),imshow(I),title('原始图像');
I=double(I);
S=fftshift(fft2(I));
[M,N]=size(S);
n=2;
d0=30;%GLPF滤波,d0=5,15,30(程序中以d0=30为例)
n1=floor(M/2);
n2=floor(N/2);
fori=1:
M
forj=1:
N
d=sqrt((i-门1)人2+。
-n2)^2);
h=1*exp(-1/2*(dA2/d0A2));
S(i,j)=h*S(i,j);
end
end
S=ifftshift(S);
S=uint8(real(ifft2(S)));
subplot(1,2,2),imshow(S),title('高斯低通滤波图像');
%巴特沃斯低通频域滤波
I=imread('f:
\lena.jpg');
subplot(1,2,1),imshow(I),title('原始图像
F=double(I);
%数据类型转换,MATLAB不支持图像的无符号整型的计算
G=fft2(F);
%傅立叶变换
G=fftshift(G);
%转换数据矩阵
[M,N]=size(G);
nn=2;
%二阶巴特沃斯(Butterworth)低通滤波器
d0=30;
%截止频率为30
m=fix(M/2);n=fix(N/2);
fori=1:
M
forj=1:
N
d=sqrt((i-m)A2+(j-n)A2);
h=1心+0.414*(d/d0)A(2*nn));%计算低通滤波器传递函数
result(i,j)=h*G(i,j);
end
end
result=ifftshift(result);
Y2=ifft2(result);
Y3=uint8(real(Y2));
subplot(1,2,2),imshow(Y3),title('巴特沃斯低通滤波')
%巴特沃斯高通频域滤波
I=imread('f:
\test.jpg');
subplot(121),imshow(I);title('原始图像');
F=double(I);%数据类型转换,MATLAB不支持图像的无符号整型的计算
G=fft2(F);%傅立叶变换
G=fftshift(G);%转换数据矩阵
[M,N]=size(G);
nn=2;%二阶巴特沃斯(Butterworth)高通滤波器
d0=30;
m=fix(M/2);n=fix(N/2);
fori=1:
M
forj=1:
N
d=sqrt((i-m)A2+(j-n)A2);
if(d==0)
h=0;
else
h=1/(1+0.414*(d0/d)A(2*nn));%计算传递函数
end
result(i,j)=h*G(i,j);
end
end
result=ifftshift(result);
J2=ifft2(result);
J3=uint8(real(J2));
subplot(122),imshow(J3);title('巴特沃斯高通滤波后图像');%滤波后图像显示
原始團煤巴特沃斯低迪址液
巴特沃断高逋滤滅后團像
原始图煨
高昕高通追漱后團像
…d蠢■
..a
1
mmsa
atiaaaaa
9sijdA
clearall;
MATLAB写的图像处理,直方图,灰度拉伸,均衡化代码
%绘制直方图
girl=imread('girl.bmp');
figure
(1);
%测量图像尺寸参数
subplot(3,3,1);imshow(girl);title('原图');[m,n]=size(girl);
计算每级灰度出现的概率,将其
fork=0:
255
GreyHist(k+1)=length(find(girl==k))/(m*n);%
存入GreyHist中相应位置endsubplot(2,2,2);
bar(0:
255,GreyHist)%绘制直方图title('girl的直方图')xlabel('灰度值')ylabel('出现概率')
%灰度拉伸
figure
(2);
girlgrey=girl;
prompt={'请输入系数a','请输入系数b'};
words='请输入线性拉伸函数:
';
answer=inputdlg(prompt,words,1,{'0.5','2'});
a=str2double(answer
(1));
b=str2double(answer
(2));
fori=1:
m
forj=1:
ngirl(i,j)=a*girl(i,j)+b;
endend
subplot(3,3,1);imshow(girl);title('灰度拉伸');
GreyHist=zeros(1,256);%预创建存放灰度出现概率的向量
fork=0:
255
GreyHist(k+1)=length(find(girl==k))/(m*n);%计算每级灰度出现的概率,将其
存入GreyHist中相应位置
end
subplot(2,2,2);
bar(0:
2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 基本 操作