《数字图像处理》书中代码
数字图像处理 实验四dct编码
实验程序和结果:实验所使用的图像:1、利用Huffman进行JPEG图像压缩编码程序:I=imread('F\.jpg');pix(256)=struct('huidu',0.0,...%灰度值'number',0.0,...%对应像素的个数'bianma','');%对应灰度的编码[m n l]=size(I);fid=fopen('huffman.txt','w');%huffman.txt是灰度级及相应的编码表fid1=fopen('huff_compara.txt','w');%huff_compara.txt是编码表huf_bac=cell(1,l);for t=1:l%初始化结构数组for i=1:256pix(i).number=1;pix(i).huidu=i-1;%灰度级是0—255,因此是i-1pix(i).bianma='';end%统计每种灰度像素的个数记录在pix数组中for i=1:mfor j=1:nk=I(i,j,t)+1;%当前的灰度级pix(k).number=1+pix(k).number;endend%按灰度像素个数从大到小排序for i=1:255for j=i+1:256if pix(i).number<pix(j).numbertemp=pix(j);pix(j)=pix(i);pix(i)=temp;endendend%因为有的灰度值在图像中可能没有对应的像素值,所以要%找出在图像中存在像素的灰度级的个数,并保存在num中for i=256:-1:1if pix(i).number ~=0break;endendnum=i;count(t)=i;%记录每层灰度级%定义用于求解的矩阵clear huffmanhuffman(num,num)=struct('huidu',0.0,...'number',0.0,...'bianma','');huffman(num,:)=pix(1:num);%矩阵赋值for i=num-1:-1:1p=1;%算出队列中数量最少的两种灰度的像素个数的和sum=huffman(i+1,i+1).number+huffman(i+1,i).number;for j=1:i%如果当前要复制的结构体的像素个数大于sum就直接复制if huffman(i+1,p).number>sumhuffman(i,j)=huffman(i+1,p);p=p+1;else%如果当前要复制的结构体的像素个数小于或等于sum就插入和的结构体%灰度值为-1标志这个结构体的number是两种灰度像素的和huffman(i,j).huidu=-1;huffman(i,j).number=sum;sum=0;huffman(i,j+1:i)=huffman(i+1,j:i-1);break;endendend%开始给每个灰度值编码for i=1:num-1obj=0;for j=1:iif huffman(i,j).huidu==-1obj=j;break;elsehuffman(i+1,j).bianma=huffman(i,j).bianma;endendif huffman(i+1,i+1).number>huffman(i+1,i).number%说明:大概率的编0,小概率的编1,概率相等的,标号大的为1,标号小的为0 huffman(i+1,i+1).bianma=[huffman(i,obj).bianma '0'];huffman(i+1,i).bianma=[huffman(i,obj).bianma '1'];elsehuffman(i+1,i+1).bianma=[huffman(i,obj).bianma '1'];huffman(i+1,i).bianma=[huffman(i,obj).bianma '0'];endfor j=obj+1:ihuffman(i+1,j-1).bianma=huffman(i,j).bianma;endendfor k=1:count(t)huf_bac(t,k)={huffman(num,k)}; %保存endend%写出灰度编码表for t=1:lfor b=1:count(t)fprintf(fid,'%d',huf_bac{t,b}.huidu);fwrite(fid,' ');fprintf(fid,'%s',huf_bac{t,b}.bianma);fwrite(fid,' ');endfwrite(fid,'%');%先写灰度值,再写灰度级所对应的哈夫曼编码,并用将每个层级的灰度隔开end%按原图像数据,写出相应的编码,也就是将原数据用哈夫曼编码替代for t=1:lfor i=1:mfor j=1:nfor b=1:count(t)if I(i,j,t)==huf_bac{t,b}.huiduM(i,j,t)=huf_bac{t,b}.huidu;%将灰度级存入解码的矩阵fprintf(fid1,'%s',huf_bac{t,b}.bianma);fwrite(fid1,' ');%用空格将每个灰度编码隔开break;endendendfwrite(fid1,',');%用空格将每行隔开endfwrite(fid1,'%');%用%将每层灰度级代码隔开endfclose(fid);fclose(fid1);M=uint8(M);save('M')%存储解码矩阵编码结果:Huffman编码表:Huffman代码:Huffman解码程序:function huf_decode%哈夫曼编码解码load MI=imread('F:\Heat.jpg');subplot(1,2,1),imshow(I),title('原图')%读出原图subplot(1,2,2),imshow(M),title('huffman解码后的图')%读出解码后的图解码结果:2、利用行程编码进行图像压缩的MATLAB程序function yc%行程编码算法%读图I=imread('zbz.jpg');[m n l]=size(I);fid=fopen('yc.txt','w');%yc.txt是行程编码算法的灰度级及其相应的编码表%行程编码算法sum=0;for k=1:lfor i=1:mnum=0;J=[];value=I(i,1,k);for j=2:nif I(i,j,k)==valuenum=num+1;%统计相邻像素灰度级相等的个数if j==nJ=[J,num,value];endelse J=[J,num,value];%J的形式是先是灰度的个数及该灰度的值 value=I(i,j,k);num=1;endendcol(i,k)=size(J,2);%记录Y中每行行程行程编码数sum=sum+col(i,k);Y(i,1:col(i,k),k)=J;%将I中每一行的行程编码J存入Y的相应行中 endend%输出相关数据[m1,n1,l1]=size(Y);disp('原图像大小:')whos('I');disp('压缩图像大小:')whos('Y');disp('图像的压缩比:');disp(m*n*l/sum);%将编码写入yc.txt中for k=1:l1for i=1:m1for j=1:col(i,k)fprintf(fid,'%d',Y(i,j,k));fwrite(fid,' ');endendfwrite(fid,' ');endsave('Y')%存储,以便解码用save('col')fclose(fid);结果:编码代码:function yc_decode%行程编编码解码load Y %下载行程编码Yload col %下载Y中每行行程行程编码数[m,n,l]=size(Y);for k=1:lfor i=1:mp=1;for j=1:2:col(i,k)d=Y(i,j,k);%灰度值的个数for c=p:p+d-1X(i,c,k)=Y(i,j+1,k);%将d个灰度值存入X中endp=p+d;endendendI=imread('zbz.jpg');subplot(1,2,1),imshow(I),title('原图')%读出原图subplot(1,2,2),imshow(X),title('行程编码解码后的图')%读出解码后的图解码后:3、利用DCT进行图像压缩的MATLAB程序I=imread(‘rice.png’); %读入原图像;I=im2double(I); %将原图像转为双精度数据类型;T=dctmtx(8); %产生二维DCT变换矩阵B=blkproc(I,[8 8],’P1*x*P2’,T,T’); %计算二维DCT,矩阵T 及其转置T’是DCT函数P1*x*P2的参数Mask=[ 1 1 1 1 0 0 0 01 1 1 0 0 0 0 01 1 0 0 0 0 0 01 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0]; %二值掩膜,用来压缩DCT系数,只留下DCT系数中左上角的10个B2=blkproc(B,[8 8],’ P1.*x.’,mask); %只保留DCT变换的10个系数I2= blkproc(B2,[8,8],’P1*x*P2’,T’,T); %逆DCT,重构图像Subplot(1,2,1);Imshow(I);title(‘原图像’); %显示原图像Subplot(1,2,2);Imshow(I2);title(‘压缩图像’);%显示压缩后的图像实验结果:。
数字图像处理及matlab实现源代码【1】
% *-*--*-*-*-*-*-*-*-*-*-*-*图像处理*-*-*-*-*-*-*-*-*-*-*-*%{% (一)图像文件的读/写A=imread('drum.jpg'); % 读入图像imshow(A); % 显示图像imwrite(A,'drum.jpg');info=imfinfo('drum.jpg') % 查询图像文件信息% 用colorbar函数将颜色条添加到坐标轴对象中RGB=imread('drum.jpg');I=rgb2gray(RGB); % 把RGB图像转换成灰度图像h=[1 2 1;0 0 0;-1 -2 -1];I2=filter2(h,I);imshow(I2,[]);colorbar('vert') % 将颜色条添加到坐标轴对象中% wrap函数将图像作为纹理进行映射A=imread('4.jpg');imshow(A);I=rgb2gray(RGB);[x,y,z]=sphere;warp(x,y,z,I); % 用warp函数将图像作为纹理进行映射%}% subimage函数实现一个图形窗口中显示多幅图像RGB=imread('drum.jpg');I=rgb2gray(RGB);subplot(1,2,1);subimage(RGB); % subimage函数实现一个图形窗口中显示多幅图像subplot(1,2,2),subimage(I);% *-*--*-*-*-*-*-*-*-*-*-*-*图像处理*-*-*-*-*-*-*-*-*-*-*-*% (二)图像处理的基本操作% ----------------图像代数运算------------------%{% imadd函数实现两幅图像的相加或给一幅图像加上一个常数% 给图像每个像素都增加亮度I=imread('4.jpg');J=imadd(I,100); % 给图像增加亮度subplot(1,2,1),imshow(I);title('原图');subplot(1,2,2),imshow(J);title('增加亮度图');%% imsubtract函数实现将一幅图像从另一个图像中减去或减去一个常数I=imread('drum.jpg');J=imsubtract(I,100); % 给图像减去亮度subplot(1,2,1),imshow(I);%% immultiply实现两幅图像的相乘或者一幅图像的亮度缩放I=imread('drum.jpg');J=immultiply(I,2); % 进行亮度缩放subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%% imdivide函数实现两幅图像的除法或一幅图像的亮度缩放I=imread('4.jpg');J=imdivide(I,0.5); % 图像的亮度缩放subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%}% ----------------图像的空间域操作------------------%{% imresize函数实现图像的缩放J=imread('4.jpg');subplot(1,2,1),imshow(J);title('原图');X1=imresize(J,0.2); % 对图像进行缩放subplot(1,2,2),imshow(X1);title('缩放图');%% imrotate函数实现图像的旋转I=imread('drum.jpg');J=imrotate(I,50,'bilinear'); % 对图像进行旋转subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%% imcrop函数实现图像的剪切I=imread('drum.jpg');I2=imcrop(I,[1 100 130 112]); % 对图像进行剪切subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(I2);%}% ----------------特定区域处理------------------%{% roipoly函数用于选择图像中的多边形区域I=imread('4.jpg');c=[200 250 278 248 199 172];r=[21 21 75 121 121 75];BW=roipoly(I,c,r); % roipoly函数选择图像中的多边形区域subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(BW);%% roicolor函数式对RGB图像和灰度图像实现按灰度或亮度值选择区域进行处理a=imread('4.jpg');subplot(2,2,1),imshow(a);I=rgb2gray(a);BW=roicolor(I,128,225); % 按灰度值选择的区域subplot(2,2,4),imshow(BW);%% ploy2mask 函数转化指定的多边形区域为二值掩模x=[63 186 54 190 63];y=[60 60 209 204 601];bw=poly2mask(x,y,256,256); % 转化指定的多边形区域为二值掩模imshow(bw);hold onplot(x,y,'r','LineWidth',2);hold off%% roifilt2函数实现区域滤波a=imread('4.jpg');I=rgb2gray(a);c=[200 250 278 248 199 172];r=[21 21 75 121 121 75];BW=roipoly(I,c,r); % roipoly函数选择图像中的多边形区域h=fspecial('unsharp');J=roifilt2(h,I,BW); % 区域滤波subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%% roifill函数实现对特定区域进行填充a=imread('4.jpg');I=rgb2gray(a);c=[200 250 278 248 199 172];r=[21 21 75 121 121 75];J=roifill(I,c,r); % 对特定区域进行填充subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%}% ----------------图像变换------------------%{% fft2 和ifft2函数分别是计算二维的快速傅里叶变换和反变换f=zeros(100,100);subplot(1,2,1);imshow(f);f(20:70,40:60)=1;subplot(1,2,2);imshow(f);F=fft2(f); % 计算二维的快速傅里叶变换F2=log(abs(F));% 对幅值对对数figure;subplot(1,2,1),imshow(F),colorbar;subplot(1,2,2),imshow(F2),colorbar;%% fftsshift 函数实现了补零操作和改变图像显示象限f=zeros(100,100);subplot(2,2,1),imshow(f);title('f')f(10:70,40:60)=1;subplot(2,2,2),imshow(f);title('f取后')F=fft2(f,256,256);subplot(2,2,3),imshow(F);title('F')F2=fftshift(F); % 实现补零操作subplot(2,2,4),imshow(F2);title('F2')figure,imshow(log(abs(F2)));title('log(|F2|)')%% dct2 函数采用基于快速傅里叶变换的算法,用于实现较大输入矩阵的离散余弦变换% idct2 函数实现图像的二维逆离散余弦变换RGB=imread('drum.jpg');I=rgb2gray(RGB);J=dct2(I); % 对I进行离散余弦变换imshow(log(abs(J))),title('对原图离散后取对数'),colorbar;J(abs(J)<10)=0;K=idct2(J); % 图像的二维逆离散余弦变换figure,imshow(I),title('原灰度图')figure,imshow(K,[0,255]);title('逆离散变换');%% dctmtx 函数用于实现较小输入矩阵的离散余弦变figure;RGB=imread('4.jpg');I=rgb2gray(RGB);subplot(3,2,1),imshow(I),title('原灰度图');I=im2double(I);subplot(3,2,2),imshow(I),title('取双精度后');T=dctmtx(8); % 离散余弦变换subplot(3,2,3),imshow(I),title('离散余弦变换后');B=blkproc(I,[8,8],'P1*x*P2',T,T');subplot(3,2,4),imshow(B),title('blkproc作用I后的B');mask=[ 1 1 1 1 0 0 0 01 1 1 0 0 0 0 01 1 0 0 0 0 0 01 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0 ];B2=blkproc(B,[8,8],'P1.*x',mask);subplot(3,2,5),imshow(B2),title('blkproc作用B后的B2');I2=blkproc(B2,[8,8],'P1*x*P2',T',T);subplot(3,2,6),imshow(I2),title('blkproc作用B2后的I2');%% edge函数用于提取图像的边缘RGB=imread('4.jpg');I=rgb2gray(RGB);BW=edge(I);imshow(I);figure,imshow(BW);%% radon 函数用来计算指定方向上图像矩阵的投影RGB=imread('4.jpg');I=rgb2gray(RGB);BW=edge(I);theta=0:179;[R,XP]=radon(BW,theta); % 图像矩阵的投影figure,imagesc(theta,XP,R);colormap(hot);xlabel('\theta(degrees)');ylabel('x\prime');title('R_{\theta}(x\prime)');colorbar;%}% ----------------图像增强、分割和编码------------------%{% imhist 函数产生图像的直方图A=imread('4.jpg');B=rgb2gray(A);subplot(2,1,1),imshow(B);subplot(2,1,2),imhist(B);%% histeq 函数用于对图像的直方图均衡化A=imread('4.jpg');B=rgb2gray(A);subplot(2,1,1),imshow(B);subplot(2,1,2),imhist(B);C=histeq(B); % 对图像B进行均衡化figure;subplot(2,1,1),imshow(C);subplot(2,1,2),imhist(C);%% filter2 函数实现均值滤波a=imread('4.jpg');I=rgb2gray(a);subplot(2,2,1),imshow(I);K1=filter2(fspecial('average',3),I)/255; % 3*3的均值滤波K2=filter2(fspecial('average',5),I)/255; % 5*5的均值滤波K3=filter2(fspecial('average',7),I)/255; % 7*7的均值滤波subplot(2,2,2),imshow(K1);subplot(2,2,3),imshow(K2);subplot(2,2,4),imshow(K3);%% wiener2 函数实现Wiener(维纳)滤波a=imread('4.jpg');I=rgb2gray(a);subplot(2,2,1),imshow(I);K1=wiener2(I,[3,3]); % 3*3 wiener滤波K2=wiener2(I,[5,5]); % 5*5 wiener滤波K3=wiener2(I,[7,7]); % 7*7 wiener滤波subplot(2,2,2),imshow(K1);subplot(2,2,3),imshow(K2);subplot(2,2,4),imshow(K3);%% medfilt2 函数实现中值滤波a=imread('4.jpg');I=rgb2gray(a);subplot(2,2,1),imshow(I);K1=medfilt2(I,[3,3]); % 3*3 中值滤波K2=medfilt2(I,[5,5]); % 5*5 中值滤波K3=medfilt2(I,[7,7]); % 7*7 中值滤波subplot(2,2,2),imshow(K1);subplot(2,2,3),imshow(K2);subplot(2,2,4),imshow(K3);%}% ----------------图像模糊及复原------------------%{% deconvwnr 函数:使用维纳滤波器I=imread('qier.jpg');imshow(I);% 对图像进行模糊处理LEN=31;THETA=11;PSF1=fspecial('motion',LEN,THETA); % 运动模糊PSF2=fspecial('gaussian',10,5); % 高斯模糊Blurred1=imfilter(I,PSF1,'circular','conv'); % 得到运动模糊图像Blurred2=imfilter(I,PSF2,'conv'); % 得到高斯噪声模糊图像figure;subplot(1,2,1);imshow(Blurred1);title('Blurred1--"motion"'); subplot(1,2,2);imshow(Blurred2);title('Blurred2--"gaussian"');% 对模糊图像加噪声V=0.002;BlurredNoisy1=imnoise(Blurred1,'gaussian',0,V); % 加高斯噪声BlurredNoisy2=imnoise(Blurred2,'gaussian',0,V); % 加高斯噪声figure;subplot(1,2,1);imshow(BlurredNoisy1);title('BlurredNoisy1'); subplot(1,2,2);imshow(BlurredNoisy2);title('BlurredNoisy2');% 进行维纳滤波wnr1=deconvwnr(Blurred1,PSF1); % 维纳滤波wnr2=deconvwnr(Blurred2,PSF2); % 维纳滤波figure;subplot(1,2,1);imshow(wnr1);title('Restored1,True PSF'); subplot(1,2,2);imshow(wnr2);title('Restored2,True PSF');%% deconvreg函数:使用约束最小二乘滤波器I=imread('qier.jpg');imshow(I);% 对图像进行模糊处理LEN=31;THETA=11;PSF1=fspecial('motion',LEN,THETA); % 运动模糊PSF2=fspecial('gaussian',10,5); % 高斯模糊Blurred1=imfilter(I,PSF1,'circular','conv'); % 得到运动模糊图像Blurred2=imfilter(I,PSF2,'conv'); % 得到高斯噪声模糊图像figure;subplot(1,2,1);imshow(Blurred1);title('Blurred1--"motion"');subplot(1,2,2);imshow(Blurred2);title('Blurred2--"gaussian"');% 对模糊图像加噪声V=0.002;BlurredNoisy1=imnoise(Blurred1,'gaussian',0,V); % 加高斯噪声BlurredNoisy2=imnoise(Blurred2,'gaussian',0,V); % 加高斯噪声figure;subplot(1,2,1);imshow(BlurredNoisy1);title('BlurredNoisy1');subplot(1,2,2);imshow(BlurredNoisy2);title('BlurredNoisy2');NP=V*prod(size(I));reg1=deconvreg(BlurredNoisy1,PSF1,NP); % 约束最小二乘滤波reg2=deconvreg(BlurredNoisy2,PSF2,NP); % 约束最小二乘滤波figure;subplot(1,2,1);imshow(reg1);title('Restored1 with NP');subplot(1,2,2);imshow(reg2);title('Restored2 with NP');%% deconvlucy函数:使用Lucy-Richardson滤波器I=imread('qier.jpg');imshow(I);% 对图像进行模糊处理LEN=31;THETA=11;PSF1=fspecial('motion',LEN,THETA); % 运动模糊PSF2=fspecial('gaussian',10,5); % 高斯模糊Blurred1=imfilter(I,PSF1,'circular','conv'); % 得到运动模糊图像Blurred2=imfilter(I,PSF2,'conv'); % 得到高斯噪声模糊图像figure;subplot(1,2,1);imshow(Blurred1);title('Blurred1--"motion"');subplot(1,2,2);imshow(Blurred2);title('Blurred2--"gaussian"');% 对模糊图像加噪声V=0.002;BlurredNoisy1=imnoise(Blurred1,'gaussian',0,V); % 加高斯噪声BlurredNoisy2=imnoise(Blurred2,'gaussian',0,V); % 加高斯噪声figure;subplot(1,2,1);imshow(BlurredNoisy1);title('BlurredNoisy1');subplot(1,2,2);imshow(BlurredNoisy2);title('BlurredNoisy2');luc1=deconvlucy(BlurredNoisy1,PSF1,5); % 使用Lucy-Richardson滤波luc2=deconvlucy(BlurredNoisy1,PSF1,15); % 使用Lucy-Richardson滤波figure;subplot(1,2,1);imshow(luc1);title('Restored Image,NUMIT=5'); subplot(1,2,2);imshow(luc2);title('Restored Image,NUMIT=15');%}% deconvblind 函数:使用盲卷积算法a=imread('4.jpg');I=rgb2gray(a);figure;imshow(I);title('Original Image');PSF=fspecial('motion',13,45); % 运动模糊figure;imshow(PSF);Blurred=imfilter(I,PSF,'circ','conv'); % 得到运动模糊图像figure;imshow(Blurred);title('Blurred Image');INITPSF=ones(size(PSF));[J,P]=deconvblind(Blurred,INITPSF,30); % 使用盲卷积figure;imshow(J);figure;imshow(P,[],'notruesize');% *-*--*-*-*-*-*-*-*-*-*-*-*图像处理*-*-*-*-*-*-*-*-*-*-*-* %{% 对图像进行减采样a=imread('lena.jpg');%subplot(1,4,1);figure;imshow(a);title('原图');b=rgb2gray(a);%subplot(1,4,2);figure;imshow(b);title('原图的灰度图');[wid,hei]=size(b);%---4倍减采样----quartimg=zeros(wid/2+1,hei/2+1);i1=1;j1=1;for i=1:2:widfor j=1:2:heiquartimg(i1,j1)=b(i,j);j1=j1+1;endi1=i1+1;j1=1;end%subplot(1,4,3);figure;imshow(uint8(quartimg));title('4倍减采样')% ---16倍减采样---quanrtimg=zeros(wid/4+1,hei/4+1);i1=1;j1=1;for i=1:4:widfor j=1:4:heiquanrtimg(i1,j1)=b(i,j);j1=j1+1;endi1=i1+1;j1=1;end%subplot(1,4,4);.figure;imshow(uint8(quanrtimg));title('16倍减采样');%}% 图像类型% 将图像转换为256级灰度图像,64级灰度图像,32级灰度图像,8级灰度图像,2级灰度图像a=imread('4.jpg');%figure;subplot(2,3,1);imshow(a);title('原图');b=rgb2gray(a); % 这是256灰度级的图像%figure;subplot(2,3,2);imshow(b);title('原图的灰度图像');[wid,hei]=size(b);img64=zeros(wid,hei);img32=zeros(wid,hei);img8=zeros(wid,hei);img2=zeros(wid,hei);for i=1:widfor j=j:heiimg64(i,j)=floor(b(i,j)/4); % 转化为64灰度级endend%figure;subplot(2,3,3);imshow(uint8(img64),[0,63]);title('64级灰度图像');for i=1:widfor j=1:heiimg32(i,j)=floor(b(i,j)/8);% 转化为32灰度级endend%figure;subplot(2,3,4);imshow(uint8(img32),[0,31]);title('32级灰度图像');for i=1:widfor j=1:heiimg8(i,j)=floor(b(i,j)/32);% 转化为8灰度级endend%figure;subplot(2,3,5);imshow(uint8(img8),[0,7]);title('8级灰度图像');for i=1:widfor j=1:heiimg2(i,j)=floor(b(i,j)/128);% 转化为2灰度级endend%figure;subplot(2,3,6);imshow(uint8(img2),[0,1]);title('2级灰度图像');% *-*--*-*-*-*-*-*-*-*-*-*-*图像处理*-*-*-*-*-*-*-*-*-*-*-* %{% ------------------ 图像的点运算------------------I=imread('lena.jpg');figure;subplot(1,3,1);imshow(I);title('原图的灰度图');J=imadjust(I,[0.3;0.6],[0.1;0.9]); % 设置灰度变换的范围subplot(1,3,2);imshow(J);title('线性扩展');I1=double(I); % 将图像转换为double类型I2=I1/255; % 归一化此图像C=2; % 非线性扩展函数的参数K=C*log(1+I2); % 对图像的对数变换subplot(1,3,3);imshow(K);title('非线性扩展');M=255-I;figure;subplot(1,3,1);imshow(M);title('灰度倒置');N1=im2bw(I,0.4); % 将此图像二值化,阈值为0.4N2=im2bw(I,0.7); % 将此图像二值化,阈值为0.7 subplot(1,3,2);imshow(N1);title('二值化阈值0.4');subplot(1,3,3);imshow(N2);title('二值化阈值0.7');%}%{% ------------------ 图像的代数运算------------------% 将两幅图像进行加法运算I=imread('lena.jpg');I=rgb2gray(I);J=imread('rice.png');% 以下把两幅图转化为大小一样for i=1:size(I)for j=size(J):size(I)J(i,j)=0;endendI=im2double(I); % 将图像转化为double型J=im2double(J);% imshow(I);figure;imshow(J);K=I+0.3*J; % 将两幅图像相加subplot(1,3,1);imshow(I);title('人物图');subplot(1,3,2);imshow(J);title('背景图');subplot(1,3,3);imshow(K);title('相加后的图');imwrite(K,'i_lena1.jpg');%%% 将两幅图像做减运算,分离背景与原图A=imread('i_lena1.jpg');B=imread('rice.png');% 以下把两幅图转化为大小一样for i=1:size(A)for j=size(B):size(A)B(i,j)=0;endendC=A-0.3*B;a=imread('lena.jpg');subplot(2,2,1);imshow(a);title('原图图');subplot(2,2,2);imshow(A);title('混合图');subplot(2,2,3);imshow(B);title('背景图');subplot(2,2,4);imshow(C);title('分离后的图');%% 设置掩模,需要保留下来的区域,掩模图像的值为1,否则为0 A=imread('drum.jpg');A=rgb2gray(A);A=im2double(A);sizeA=size(A);subplot(1,2,1);imshow(A);title('原图');B=zeros(sizeA(1),sizeA(2)); % 设置模板B(100:400,100:500)=1;K=A.*B; % 两幅图像相乘subplot(1,2,2);imshow(K);title('局部图');%}%{% ------------------ 图像的缩放------------------A=imread('drum.jpg');B1=imresize(A,1.5); % 比例放大1.5杯,默认采用的是最近邻法进行线性插值B2=imresize(A,[420 384]); % 非比例放大到420:384C1=imresize(A,0.7); % 比例缩小0.7倍C2=imresize(A,[150 180]); % 非比例缩小到150:180figure;imshow(B1);title('比例放大图');figure;imshow(B2);title('非比例放大图');figure;imshow(C1);title('比例缩小图');figure;imshow(C2);title('非比例缩小图');% 检测非比例缩放得到的图片是否能还原到原图a=size(A)d=imresize(C2,[a(1),a(2)]);figure;imshow(d);%}% ------------------ 图像的旋转------------------I=imread('drum.jpg');J=imrotate(I,45); % 图像进行逆时针旋转,默认采用最近邻插值法进行插值处理K=imrotate(I,90); % 默认旋转出界的部分不被截出subplot(1,3,1);imshow(I);subplot(1,3,2);imshow(J);subplot(1,3,3);imshow(K);% 检测旋转后的图像是否失真P=imrotate(K,270);figure;imshow(P);。
(完整版)数字图像处理MATLAB程序【完整版】
第一部分数字图像处理实验一图像的点运算实验1.1 直方图一.实验目的1.熟悉matlab图像处理工具箱及直方图函数的使用;2.理解和掌握直方图原理和方法;二.实验设备1.PC机一台;2.软件matlab。
三.程序设计在matlab环境中,程序首先读取图像,然后调用直方图函数,设置相关参数,再输出处理后的图像。
I=imread('cameraman.tif');%读取图像subplot(1,2,1),imshow(I) %输出图像title('原始图像') %在原始图像中加标题subplot(1,2,2),imhist(I) %输出原图直方图title('原始图像直方图') %在原图直方图上加标题四.实验步骤1. 启动matlab双击桌面matlab图标启动matlab环境;2. 在matlab命令窗口中输入相应程序。
书写程序时,首先读取图像,一般调用matlab自带的图像,如:cameraman图像;再调用相应的直方图函数,设置参数;最后输出处理后的图像;3.浏览源程序并理解含义;4.运行,观察显示结果;5.结束运行,退出;五.实验结果观察图像matlab环境下的直方图分布。
(a)原始图像 (b)原始图像直方图六.实验报告要求1、给出实验原理过程及实现代码;2、输入一幅灰度图像,给出其灰度直方图结果,并进行灰度直方图分布原理分析。
实验1.2 灰度均衡一.实验目的1.熟悉matlab图像处理工具箱中灰度均衡函数的使用;2.理解和掌握灰度均衡原理和实现方法;二.实验设备1.PC机一台;2.软件matlab;三.程序设计在matlab环境中,程序首先读取图像,然后调用灰度均衡函数,设置相关参数,再输出处理后的图像。
I=imread('cameraman.tif');%读取图像subplot(2,2,1),imshow(I) %输出图像title('原始图像') %在原始图像中加标题subplot(2,2,3),imhist(I) %输出原图直方图title('原始图像直方图') %在原图直方图上加标题a=histeq(I,256); %直方图均衡化,灰度级为256subplot(2,2,2),imshow(a) %输出均衡化后图像title('均衡化后图像') %在均衡化后图像中加标题subplot(2,2,4),imhist(a) %输出均衡化后直方图title('均衡化后图像直方图') %在均衡化后直方图上加标题四.实验步骤1. 启动matlab双击桌面matlab图标启动matlab环境;2. 在matlab命令窗口中输入相应程序。
《数字图像处理》书中代码
《数字图像处理》书中代码例1-1m=uint8(zeros(128,128,1,27));for i=1:27[m(:,:,:,i),map]=imread('mri.tif',i);endmontage(m,map)例2-1a=imread('cameraman.tif'); %读入cameraman图像figure(1);imshow(a);b1=a+50; %b1=a+45图像灰度值增加45figure(2);imshow(b1);b2=1.2*a; %b=1.2*a图像对比度增大figure(3);imshow(b2)b3=0.65*a; %b=0.65*a图像对比度减少figure(4);imshow(b3);b4=-double(a)+255; %b4=-1*a+255,图像求补,注意把a的类型转换为double figure(5);imshow(uint8(b4)); %再把double类型转换为unit8例2-2%读入lena图像a=imread('cameraman.tif'); %读取原始图像figure(1);imshow(a); %显示原始图像xlabel ('(a)原始图像');%显示函数?)(x的曲线图x=1:255;y=x+x.*(255-x)/255;figure(2);plot(x,y); %绘制?)(x的曲线图xlabel ('(b)函数?)(x的曲线图');b1=double(a)+0.006*double(a) .*(255-double(a)); figure(3);imshow(uint8(b1)); %显示非线性处理图像xlabel('(c)非线性处理效果');例2-3clear;%%读入图像a=imread('cameraman.tif');imhist(a);title('原始cameraman图像的直方图');%%b=f(a)b1=1.25*double(a)+45;figure(2); imhist(uint8(b1));title ('变换后的直方图');例2-4clear;histgram=zeros(1,256); %生成直方图数组cdf=zeros(1,256);[cm,map]=imread('cameraman.tif);[a,b]=size(cm);for i=1:afor j=1:bk=cm(i,j);histgram(k)=histgram(k)+1;endend %得到直方图cdf(1)=histgram(1);for i=2:256cdf(i)=cdf(i-1)+histgram(i);endfor i=1:a %点运算for i=1:bk=cm(i,j);cm_equ(i,j)=cdf(k)*256/(a*b); endendimshow(uint8(cm_equ)); figure(2);imhist(uint8(cm_equ)); 例2-5I=imread('tire.tif');J=histeq(I);H=adapthisteq(I);figure(1),imshow(I);xlabel('原始图像');figure(2),imshow(J);xlabel('histeq均衡化');figure(3),imshow(H);xlabel('adapthisteq均衡化');例2-6a=imread('hill.jpg');s=size(a);b=double(a);c(:,:,1)=b(:,:,1)+b(:,:,2);c(:,:,2)=b(:,:,2);c(:,:,3)=b(:,:,3)-b(:,:,2);for i=1:s(1)for j=1:s(2)for k=1:s(3)if c(i,j,k)<0c(i,j,k)=0;endif c(i,j,k)>255c(i,j,k)=255;endendendendc=uint8(c);subplot(121);imshow(a);xlabel('原始图像');subplot(122);imshow(c);xlabel('新图像');例2-7a=imread('eight.tif');a1=imnoise(a,'gaussian',0,0.006); %对原始图像加高斯噪声,共得到4幅图像a2=imnoise(a,'gaussian',0,0.006);a3=imnoise(a,'gaussian',0,0.006);a4=imnoise(a,'gaussian',0,0.006);k=imlincomb(0.25,a1,0.25,a2,0.25,a3,0.25,a4); %线性组合subplot(131);imshow(a);subplot(132);imshow(a1);subplot(133);imshow(k,[]);例2-8clear;a=imread('rice.png'); %读取图像figure(1);imshow(a); %显示原始图像background=imopen(a,strel('disk',15)); %在a上进行形态学运算;ap=imsubtract(a,background); %减法运算函数figure(2);imshow(background); %图像输出背景figure(3);imshow(ap,[]); %减法运算结果例2-9a=imread('hill.jpg');b=imread('bom.jpg');s=size(a);m=s(1);n=s(2);b1=imresize(b,[m n]); %MATLAB实现乘法运算函数a=double(a);c=double(b1);d=a.*c/128;d=uint8(d);subplot(131);imshow(a);subplot(132);imshow(b);subplot(133);imshow(d);例2-10a=imread('lena.bmp');background=imopen(a,strel('disk',15));a1=imdivide(a,background);subplot(131);imshow(a); %原始图像subplot(132);imshow(background); %Background结果subplot(133);imshow(a1,[]); %除法运算结果例3-2clear;load woman; %读入图像数据data=uint8(X);[zipped,info]=huffencode(data); %调用Huffman编码程序进行压缩unzipped=huffdecode(zipped,info); %调用Huffman解码程序进行解码%显示原始图像和经编码后的图像,显示压缩比,并计算均方根误差得erms=0,%表示是Huffman无失真编码subplot(121);imshow(data);subplot(122);imshow(unzipped);erms=compare(data(:),unzipped(:))cr=info.ratiowhos data unzipped zipped%Huffencode函数对输入矩阵vector进行Huffman编码,返回编码后的向量(压缩数据)及相关信息function [zippend,info]=huffencode(vector)%输入和输出都是uint8格式%info返回解码需要的结构信息%info.pad是添加的比特数%info.huffcodes是Huffman码字%info.rows是原始图像行数%info.cols是原始图像列数%info.length是最大码长if~isa(vector,'uint8')eror('input argument must be a uint8 vector');end[m,n]=size(vector);vector=vector(:)';f=frequency(vector); %计算各符号出现的概率symbols=find(f~=0);f=f(symbols);[f,sortindex]=sort(f); %将符号按照出现的概率大小排列symbols=symbols(sortindex);len=length(symbols);symbols_index=num2cell(1:len);codeword_tmp=cell(len,1);while length(f)>1 %生成Huffman树,得到码字编码表index1=symbols_index{1};index2=symbols_index{2};codeword_tmp(index1)=addnode(codeword_tmp(index1),ui nt8(0));codeword_tmp(index2)=addnode(codeword_tmp(index2),ui nt8(1));f=[sum(f(1:2)) f(3:end)];symbols_index=[{[index1,index2]} symbols_index(3:end)];[f,sortindex]=sort(f);symbols_index=symbols_index(sortindex);endcodeword=cell(256,1);codeword(symbols)=codeword_tmp;len=0;for index=1:length(vector) %得到整个图像所有比特数len=len+length(codeword{double(vector(index))+1});endstring=repmat(uint(0),1,len);pointer=1;for index=1:length(vector) %对输入图像进行编码code=codeword{double(vector(index))+1};len=length(code);string(pointer+(0:len-1))=code;pointer=pointer+len;endlen=length(string);pad=8-mod(len,8); %非8整数倍时,最后补pad个0 if pad>0string=[string uint8(zeros(1,pad))];endcodeword=codeword(symbols);codlen=zeros(size(codeword));weights=2.^(0:23);maxcodelen=0;for index=1:length(codeword)len=length(codeword{index});if len>maxcodelenmaxcodelen=len;endif len>0code=sum(weights(codeword{index}==1)); code=bitset(code,len+1);codeword{index}=code;codelen(index)=len;endendcodeword=[codeword{:}];%计算压缩后的向量cols=length(string)/8;string=reshape(string,8,cols);weights=2.^(0:7);zipped=uint8(weights*double(string));%码表存储到一个稀疏矩阵huffcodes=sparse(1,1);for index=1:nnz(codeword)huffcodes(codeword(index),1)=symbols(index);end%填写解码时所需的结构信息info.pad=pad;info.huffcodes=huffcodes;info.ratio=cols./length(vector);info.length=length(vector);info.maxcodelen=maxcodelen;info.rows=m;info.cols=n;%huffdecode函数对输入矩阵vector进行Huffman编码,返回解压后的图像数据function vector=huffdecode(zipped,info,image) if ~isa(zipped,'uint8')error('input argument must be a uint8 vector');end%产生0,1序列,每位占一个字节len=length(zipped);string=repmat(uint8(0),1,len.*8);bitindex=1:8;for index=1:lenstring(bitindex+8.*(index-1))=uint8(bitget(zipped(index),bitindex)); endstring=logical(string(:)');len=length(string);%开始解码weights=2.^(0:51);vector=repmat(uint8(0),1,info.length);vectorindex=1;codeindex=1;code=0;for index=1:lencode=bitset(code,codeindex,string(index)); codeindex=codeindex+1;byte=decode(bitset(code,codeindex),info);if byte>0vector(vectorindex)=byte-1;codeindex=1;code=0;vectorindex=vectorindex+1;endendvector=reshape(vector,info.rows,info.cols);%函数addnode添加节点function codeword_new=addnode(codeword_old,item) codeword_new=cell(size(codeword_old));for index=1:length(codeword_old)codeword_new{index}=[item codeword_old{index}]; end%函数frequency计算各符号出现的概率function f=frequency(vector)if ~isa(vector,'uint8')error('input a argument must be a uint8 vector');endf=repmat(0,1,256);len=length(vector);for index=0:255f(index+1)=sum(vector==uint8(index));endf=f./len;%函数decode返回码字对应的符号function byte=decode(code,info)byte=info.huffcodes(code);例3-5clear all;format long e;symbol=['abcd'];ps=[0.4 0.2 0.1 0.3];inseq=('dacab');codeword=suanshubianma(symbol,ps,inseq)outseq=suanshujiema(symbol,ps,codeword,length(inseq)) %算术编码函数suanshubianmafunction acode=suanshubianma(symbol,ps,inseq)high_range=[];for k=1:length(ps)high_range=[high_range sum(ps(1:k))];endlow_range=[0 high_range(1:length(ps-1))];sbidx=zeros(size(inseq));for i=1:length(inseq)sbidx(i)=find(symbol==inseq(i));endlow=0;high=1;for i=1:length(inseq)range=high-low;high=low+range*high_range(sbidx(i));low=low+range*low_range(sbidx(i));endacode=low;%算术解码函数suanshujiemafunctionsymbos=suanshujiema(symbol,ps,codeword,symlen) format long ehigh_range=[];for k=1:length(ps)high_range=[high_range sum(ps(1:k))];endlow_range=[0 high_range(1:length(ps)-1)];psmin=min(ps);symbos=[];for i=1:symlenidx=max(find(low_range<=codeword));codeword=codeword-low_range(idx);if abs(codeword-ps(idx))<0.01*psminidx=idx+1;codeword=0;endsymbos=[symbos symbol(idx)];codeword=codeword/ps(idx);if abs(codeword)<0.01*psmini=symlen+1;endend例3-6clear;I1=imread('cameraman.tif');I=im2bw(I1,0.4);[zipped,info]=xingchengbianma(I); %调用xingchengbianma 进行编码unzipped=xingchengjiema(zipped,info); %调用xingchengjiema进行解码subplot(131);imshow(I1); %显示原始图像xlabel('原始灰度图像');subplot(132);imshow(I);xlabel('二值图像'); %显示二值图像subplot(133);imshow(unzipped); %显示解码图像xlabel('解码图像');unzipped=uint8(unzipped);%计算均方根误差得erms=0,表示行程编码是无失真编码erms=jfwucha(I(:),unzipped(:))%显示压缩比cr=info.ratiowhos I1 I unzipped zipped%行程编码函数xingchengbianmafunction [zipped,info]=xingchengbianma(vector)[m,n]=size(vector);vector=vector(:)';vector=uint8(vector(:));L=length(vector);c=vector(1);e(1,1)=c;e(1,2)=0;t1=1;for j=1:Lif(vector(j)==c)e(t1,2)=double(e(t1,2))+1;elsec=vector(j);t1=t1+1;e(t1,1)=c;e(t1,2)=1;endendzipped=e;info.rows=m;info.cols=n;[m,n]=size(e);info.ratio=m*n/(info.rows*info.cols);%行程解码函数xingchengjiemafunction unzipped=xingchengjiema(zip,info)zip=uint8(zip);[m,n]=size(zip);unzipped=[];for i=1:msection=repmat(zip(i,1),1,double(zip(i,2)));unzipped=[unzipped section];endunzipped=reshape(unzipped,info.rows,info.cols); unzipped=double(unzipped);%计算均方根误差函数jfwuchafunction erms=jfwucha(f1,f2)e=double(f1)-double(f2);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n));if erms~=0emax=max(abs(e(:)));[h,x]=hist(e(:));if length(h)>=1figure(2);bar(x,h,'r');e=mat2gray(e,[-emax,emax]);figure(3);imshow(e);endend例3-7%读入Lena图像,用LPCencode进行线性预测编码,用LPCdecode解码I=imread('lena.bmp');x=double(I);y=LPCencode(x);xx=LPCdecode(y);%显示线性误差图,如图3-12(a)所示figure(1);subplot(121);imshow(I);subplot(122);imshow(mat2gray(y));%计算均方根误差,因为是无损编码,那么erms应该为0e=double(x)-double(xx);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n))%显示原图直方图figure(2);subplot(121);[h,f]=hist(x(:));bar(f,h,'k');%显示预测误差的直方图subplot(122);[h,f]=hist(y(:));bar(f,h,'k')%LPCencode函数用一维无损预测编码压缩图像x,a为预测系数,如果a为默认,则默认%a=1,就是前值预测function y=LPCencode(x,a)error(nargchk(1,2,nargin))if nargin<2a=1;endx=double(x);[m,n]=size(x);p=zeros(m,n); %存入预测值xs=x;zc=zeros(m,1);for i=1:length(a)xs=[zc xs(:,1:end-1)];p=p+a(i)*xs;endy=x-round(p);%LPCdecode函数是解码函数,与编码程序用的同一个预测器function x=LPCdecode(y,a)error(nargchk(1,2,nargin));if nargin<2a=1;enda=a(end:-1:1);[m,n]=size(y);order=length(a);a=repmat(a,m,1);x=zeros(m,n+order);for i=1:nii=i+order;x(:,ii)=y(:,i)+round(sum(a(:,order:-1:1).*x(:,(ii-1):-1:(ii-order)),2));endx=x(:,order+1:end);例3-8%设置压缩比crcr=0.5; %cr=0.5为2:1压缩;cr=0.125为8:1压缩I=imread('lena.bmp'); %图像的大小为512×512I1=double(I)/255; %图像为256级灰度图像,对图像进行归一化操作figure(1);imshow(I1); %显示原始图像%对图像进行FFTfftcoe=blkproc(I1,[8 8],'fft2(x)'); %将图像分割为8×8的子图像进行FFT coevar=im2col(fftcoe,[8 8],'distinct'); %将变换系数矩阵重新排列coe=coevar;[y,ind]=sort(coevar);[m,n]=size(coevar); %根据压缩比确定要变0的系数个数snum=64-64*cr;%舍去不重要的系数for i=1:ncoe(ind(1:snum),i)=0; %将最小的snum个变换系数清0endb2=col2im(coe,[8 8],[512 512],'distinct'); %重新排列系数矩阵%对子图像块进行FFT逆变换获得各个子图像的复原图像,并显示压缩图像I2=blkproc(b2,[8 8],'ifft2(x)'); %对截取后的变换系数进行FFT逆变换figure(2);imshow(I2);%计算均方根误差ermse=double(I1)-double(I2);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n))例3-9%设置压缩比crcr=0.5; %cr=0.5为2:1压缩;cr=0.125为8:1压缩I=imread('lena.bmp'); %图像的大小为512×512I1=double(I)/255; %图像为256级灰度图像,对图像进行归一化操作figure(1);imshow(I1); %显示原始图像%对图像进行DCTt=dctmtx(8);dctcoe=blkproc(I1,[8 8],'P1*x*P2',t,t');coevar=im2col(dctcoe,[8 8],'distinct');coe=coevar;[y,ind]=sort(coevar);[m,n]=size(coevar); %根据压缩比确定要变0的系数个数%舍去不重要的系数snum=64-64*cr;for i=1:ncoe(ind(1:snum),i)=0; %将最小的snum个变换系数清0 endb2=col2im(coe,[8 8],[512 512],'distinct'); %重新排列系数矩阵%对截取后的变换系数进行DCT逆变换I2=blkproc(b2,[8 8],'P1*x*P2',t',t); %对截取后的变换系数进行DCT逆变换figure(2);%计算均方根误差ermse=double(I1)-double(I2);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n))例3-10%设置压缩比crcr=0.5; %cr=0.5为2:1压缩;cr=0.125为8:1压缩I=imread('lena.bmp'); %图像的大小为512×512I1=double(I)/255; %图像为256级灰度图像,对图像进行归一化操作figure(1);imshow(I1); %显示原始图像%对图像进行哈达玛变换t=hadamard(8);htcoe=blkproc(I1,[8 8],'P1*x*P2',t,t);coevar=im2col(htcoe,[8 8],'distinct');coe=coevar;[y,ind]=sort(coevar);[m,n]=size(coevar); %根据压缩比确定要变0的系数个数%舍去不重要的系数snum=64-64*cr;for i=1:ncoe(ind(1:snum),i)=0; %将最小的snum个变换系数清0endb2=col2im(coe,[8 8],[512 512],'distinct'); %重新排列系数矩阵%对截取后的变换系数进行哈达玛逆变换I2=blkproc(b2,[8 8],'P1*x*P2',t,t); %对截取后的变换系数进行哈达玛逆变换I2=I2./(8*8);figure(2);%计算均方根误差ermse=double(I1)-double(I2);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n))3.5.4节代码%jpegencode函数用来压缩图像,是一种近似的JPEG方法function y=jpegencode(x,quality)%x为输入图像%quality决定了截去的系数和压缩比error(nargchk(1,2,nargin)); %检查输入参数if nargin<=2quality=1; %默认时quality=1endx=double(x)-128; %像素层次移动-128[xm,xn]=size(x);t=dctmtx(8); %得到8*8 DCT矩阵%将图像分割成8*8子图像,进行DCT,然后进行量化y=blkproc(x,[8 8],'P1*x*P2',t,t');m=[16 11 10 16 24 40 51 6112 12 14 19 26 58 60 5514 13 16 24 40 57 69 5614 17 22 29 51 87 80 6218 22 67 56 68 109 103 7724 35 55 64 81 104 113 9249 64 78 87 103 121 120 9272 92 95 98 112 100 103 99]*quality;%用m量化步长短对变换矩阵进行量化,即根据式(3-37)量化yy=blkproc(y,[8 8],'round(x./P1)',m); %将图像块排列成向量y=im2col(yy,[8 8],'distinct'); %得到列数,也就是子图像个数xb=size(y,2); %变换系数排列次序order=[1 9 2 3 10 17 25 18 11 4 5 12 19 26 33...41 34 27 20 13 6 7 14 21 28 35 42 49 57 50...43 36 29 22 15 8 16 23 30 37 44 51 58 59 52...45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 62 63 56 64]; %用Z形扫描方式对变换系数重新排列y=y(order,:);eob=max(x(:))+1; %创建一个块结束符号num=numel(y)+size(y,2);r=zeros(num,1);count=0;% 将非零元素重新排列放到r中,-26-3 eob -25 1 eobfor j=1:xbi=max(find(y(:,j))); %每次对一列(即一块)进行操作if isempty(i)i=0;endp=count+1;q=p+i;r(p:q)=[y(1:i,j);eob]; %截去0并加上结束符号count=count+i+1;endr((count+1):end)=[]; %删除r的没有用的部分r=r+128;%保存编码信息y.size=uint16([xm,xn]);y.numblocks=uint16(xb);y.quality=uint16(quality*100);%对r进行Huffman编码[y.huffman/doc/449266364.html,]=huffencode(uint8( r));%jpegdecode函数,jpegencode的解码程序function x=jpegdecode(y)error(nargchk(1,1,nargin)); %检查输入参数m=[16 11 10 16 24 40 51 6112 12 14 19 26 58 60 5514 13 16 24 40 57 69 5614 17 22 29 51 87 80 6218 22 67 56 68 109 103 7724 35 55 64 81 104 113 9249 64 78 87 103 121 120 9272 92 95 98 112 100 103 99];order=[1 9 2 3 10 17 25 18 11 4 5 12 19 26 33...41 34 27 20 13 6 7 14 21 28 35 42 49 57 50...43 36 29 22 15 8 16 23 30 37 44 51 58 59 52...45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 62 63 56 64]; rev=order; %计算逆运算for k=1:length(order)rev(k)=find(order==k);end%ff=max(rev(:))+1;m=double(y.quality)/100*m;xb=double(y.numblocks); %得到图像的块数sz=double(y.size);xn=sz(1); %得到行数xm=sz(2); %得到列数x=huffdecode(y.huffman,/doc/449266 364.html,); %Huffman解码x=double(x)-128;eob=max(x(:)); %得到块结束符z=zeros(64,xb);k=1;for i=1:xbfor j=1:64if x(k)==eobk=k+1;break;elsez(j,i)=x(k);k=k+1;endendendz=z(rev,:); %恢复次序x=col2im(z,[8 8],[xm xn],'distinct'); %重新排列成图像块x=blkproc(x,[8 8],'x.*P1',m); %逆量化t=dctmtx(8);x=blkproc(x,[8 8],'P1*x*P2',t',t); %DCT逆变换x=uint8(x+128); %进行位移例3-11clear all;x=imread('F:\教材各章图稿\第2章图\第2章图\lena.bmp'); %读入原始图像subplot(121); %显示原始图像imshow(x);y=jpegencode(x,5); %进行近似的JPEG编码X=jpegecode(y); %进行解码subplot(122);imshow(X); %显示压缩图像%计算均方根误差e=double(x)-double(X);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n))%计算压缩比cr=imageratio(x,y)例4-1I=imread('fenj.jpg'); %读入清晰图像subplot(121);imshow(I); %显示原始图像len=30; %设置运动位移为30个像素theta=45; %设置运动角度为45度psf=fspecial('motion',len,theta); %建立二维仿真线性运动滤波器psf I1=imfilter(I,psf,'circular','conv'); %用psf产生退化图像subplot(122);imshow(I1); %显示运动后的图像例4-2[I1,map]=imread('fenj-mf.jpg'); %读入运动模糊图像figure(1);imshow(I1);len=30;theta=45;initpsf=fspecial('motion',len,theta); %建立复原点扩散函数[J,P]=deconvblind(I1,initpsf,30); %去卷积figure(2);imshow(J); %显示结果图像如图4-7c(所示)figure(3);imshow(P,[],'notruesize'); %显示复原点扩散函数如图4-7(b)所示例4-3I=imread('meihua.jpg'); %读入图像subplot(221);imshow(I);title('原始图像');H=fspecial('motion',30,45); %运动模糊PSFMotionBlur=imfilter(I,H); %卷积subplot(222);imshow(MotionBlur);title('运动模糊图像');H=fspecial('disk',10); %圆盘状模糊PSFbulrred=imfilter(I,H);subplot(223);imshow(bulrred);title('圆盘状模糊图像');H=fspecial('unsharp'); %钝化模糊PSFSharpened=imfilter(I,H);subplot(224);imshow(Sharpened);title('钝化模糊图像');例5-1A=imread('cat.jpg');figure;subplot(121);imshow(A);A=double(A);A_move=zeros(size(A));H=size(A);A_x=50;A_y=50;I_movesult(A_x+1:H(1),A_y+1:H(2),1:H(3))=I(1:H(1)-A_x,1:H(2)-A_y,1:H(3));subplot(122);imshow(uint8(A_move));例5-2I=imread('hua1.jpg');I1=imcrop(I,[80 60 50 50]);figure;subplot(121);imshow(I);subplot(122);imshow(I1);例5-3I=imread('fengj.jpg')n=50;m=50;figure;imshow(I);for i=1:50n=n-1;m=m+1;I1=imcrop(I,[n,n,m,m]);figure;imshow(I1);end例5-5I=imread('fish.jpg'); %I为原始图像figure;subplot(131);imshow(I); %显示原始图像I=double(I);I_en=imresize(I,4,'nearest'); %最近邻法标志函数nearest扩大4倍subplot(132);imshow(uint8(I_en)); %显示扩大4倍后的图像I_re=imresize(I,0.5,'nearest'); %缩小两倍subplot(133);imshow(uint8(I_re));%显示缩小2倍后的图像例5-6clear all;I=imread('che.jpg'); %本书用的图片都在当前目录下,故不用写路径subplot(121);imshow(I);I1=imrotate(I,30,'crop');subplot(122);imshow(I1);例5-7I=imread('che.jpg');for i=1:25I1=imrotate(I,15*i,'crop');imshow(I1);end例5-8I=imread('mao.jpg');figure;subplot(121);imshow(I);I=double(I);h=size(I);I1=zeros(h(1)+round(h(2)*tan(pi/6)),h(2),h(3));for m=1:h(1)for n=1:h(2)I1(m+round(n*tan(pi/6)),n,1:h(3))=I(m,n,1:h(3));endendI2=uint8(I1);subplot(122);imshow(I2);例5-9I=imread('ta.jpg');figure;subplot(221);imshow(I);I=double(I);h=size(I);I_fliplr(1:h(1),1:h(2),1:h(3))=I(1:h(1),h(2):-1:1,1:h(3)); %水平镜像变换I1=uint8(I_fliplr);subplot(222);imshow(I1);I_flipud(1:h(1),1:h(2),1:h(3))=I(h(1):-1:1,1:h(2),1:h(3)); %垂直镜像变换I2=uint8(I_flipud);subplot(223);imshow(I2);I_fliplr_flipud(1:h(1),1:h(2),1:h(3))=I(h(1):-1:1,h(2):-1:1,1:h(3)); %对角镜像变换I3=uint8(I_fliplr_flipud);subplot(224);imshow(I3);例5-10。
VB数字图像处理代码
Dim r, g, b, c As Long
For i = 0 To Picture1.ScaleWidth - 1
Hale Waihona Puke For j = 0 To Picture1.ScaleHeight - 1
c = Picture1.Point(i, j)
For j = 0 To Picture1.ScaleWidth - 1
c = Picture1.Point(j, i)
r = (c And &HFF) '将16进制的图像信息转换成10进制数
'g = (c And 65280) \ 256&
Next j
Next i
For i = 0 To Picture1.ScaleHeight - 1
For j = 0 To Picture1.ScaleWidth - 1
c = RGB1(i * Picture1.ScaleWidth + j)
Picture2.PSet (j, i), RGB(c, c, c)
Else: Picture2.PSet (j, i), RGB(255, 255, 255)
End If
Next j
Next i
ElseIf a = 4 Then
Picture2.Cls
For i = 0 To Picture1.ScaleHeight - 1
Exit For
End If
Next k
Next j
Next i
ElseIf a = 32 Then
Picture2.Cls
数字图像处理~图像编码
Eb = -log2(0.3) = 1.737
Ec = -log2(0.2) = 2.322
总信息量也即表达整个字符串需要的位数为:
E = Ea * 5 + Eb * 3 + Ec * 2 = 14.855 位
举例说明:
如果用二进制等长编码,需要多少位?
数据压缩技术的理论基础是信息论。
2.信息量和信息熵
A
B
数据压缩的基本途径
数据压缩的理论极限
信息论中信源编码理论解决的主要问题:
信息量等于数据量与冗余量之差
I = D - du
数据是用来记录和传送信息的,或者说数据
是信息的载体。
数据所携带的信息。
信息量与数据量的关系:
du—冗余量
I— 信息量
D— 数据量
叁
实时传输:在10M带宽网上实时传输的话,需要压缩到原来数据量的?
肆
存储: 1张CD可存640M,如果不进行压缩,1张CD则仅可以存放?秒的数据
伍
可见,单纯依靠增加存储器容量和改善信道带宽无法满足需求,必须进行压缩
1 图像编码概述
数字化后的图像信息数据量非常大,图像压缩利用图像数据存在冗余信息,去掉这些冗余信息后可以有效压缩图像。
01.
02.
03.
04.
问题:
把某地区天气预报的内容看作一个信源,它有6种可能的天气:晴天(概率为0.30)、阴天(概率为0.20)、多云(概率为0.15)、雨天(概率为0.13)、大雾(概率为0.12)和下雪(概率为0.10),如何用霍夫曼编码对其进行编码?平均码长分别是多少?
哈夫曼编码
30
10
数字图像处理 实验七 预测编码
实验七预测编码一,实验目的:1,掌握预测编码的基本原理与方法2,了解图像预测编码后像素值得分布特征二,实验条件:1,基于MATLAB计算机软件2,典型的灰度、彩色图像文件三,实验原理1,去除数据冗余度可以有效地压缩数据2,图像编码压缩的主要技术指标:压缩比,客观评价SNK,主观评价四,实验内容:1,以一阶预测为例,,编程实现给定图像的预测编码值;2,绘测相应预测编码值的直方图五,实验步骤1,以一阶预测为例,,编程实现给定图像的预测编码值;代码如下所示:I=imread('a.jpg');J=rgb2gray(I);[m,n]=size(J);m=int32(m);n=int32(n);J=double(J);A=zeros(1,m*n);B=zeros(1,m*n);k=1;for i=1:mfor j=1:nA(k)=J(i,j); %把图像所有行放入一维矩阵A中k=k+1;endendB(1)=A(1);for i=2:m*nB(i)=A(i)-A(i-1); %计算出预测值,存入矩阵BendH=zeros(1,256*2-1);for i=1:m*nH(B(i)+255)=H(B(i)+255)+1;endX=[-255:255];plot(X,H);2,绘测相应预测编码值的直方图代码如下所示:H=zeros(1,256*2-1);for i=1:m*nH(B(i)+255)=H(B(i)+255)+1;endX=[-255:255];plot(X,H);-300-200-10001002003000100020003000400050006000700080009000图一 直方图六,分析与讨论:1,分析直方图的形态,解释预测编码后大部分像素值的分布范围,并说明预测编码能够压缩的原因(1)预测编码后大部分像素值的分布范围是-50-50。
(2)预测编码是根据离散信号之间存在着一定关联性的特点,利用前面一个或多个信号预测下一个信号进行,然后对实际值和预测值的差(预测误差)进行编码。
数字图像处理 实验代码
subplot(2,2,3),imshow(J);
title('线性变换图像[0.1 0.5]');
axis([50,250,50,200]);
grid on; %显示网格线
axis on; %显示坐标系
K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1]
%g(mx+1:m,my+1:n,1:x)=f(1:m-mx,1:n-my ,1:x); g(1:m-mx,1:n-my ,1:x)=f(mx+1:m,my+1:n,1:x); figure; imshow(uint8(g));
end
3. f=imread('hehua1.bmp'); [m,n]=size(f); for i=50:10:200 m=i; n=i; f2=imcrop(f,[n,n,m,m]); figure; imshow(uint8(f2)); end
(4) 图像旋转imrotate函数,语法格式为: B = imrotate(A,angle,’crop’),参数crop用于指定裁剪旋转后超出图像的部分。
三、实验内容 (1) 将图像hehua.bmp裁剪成200X200大小 (2) 制作动画,将一幅图像逐渐向左上角平移移出图像区域,空白的地方用白色 填充 (3) 利用剪切图像函数制作动画 (4) 将图像分别放大1.5倍和缩小0.8倍,插值方法使用双线性插值法,分别显 示图像。 (5) 将图像水平镜像,再顺时针旋转45度,显示旋转后的图像。 (6) 将图像分别进行水平方向30度错切,垂直方向45度错切,分别显示结果 四、 实验环境 Windows下matlab编程环境
(完整版)数字图像处理代码大全
1.图像反转MATLAB程序实现如下:I=imread('xian.bmp');J=double(I);J=-J+(256-1); %图像反转线性变换H=uint8(J);subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(H);2.灰度线性变换MATLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1]subplot(2,2,3),imshow(J);title('线性变换图像[0.1 0.5]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1]subplot(2,2,4),imshow(K);title('线性变换图像[0.3 0.7]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系3.非线性变换MATLAB程序实现如下:I=imread('xian.bmp');I1=rgb2gray(I);subplot(1,2,1),imshow(I1);title('灰度图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系J=double(I1);J=40*(log(J+1));H=uint8(J);subplot(1,2,2),imshow(H);title('对数变换图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系4.直方图均衡化MATLAB程序实现如下:I=imread('xian.bmp');I=rgb2gray(I);figure;subplot(2,2,1);imshow(I);subplot(2,2,2);imhist(I);I1=histeq(I);figure;subplot(2,2,1);imshow(I1);subplot(2,2,2);imhist(I1);5.线性平滑滤波器用MATLAB实现领域平均法抑制噪声程序:I=imread('xian.bmp');subplot(231)imshow(I)title('原始图像')I=rgb2gray(I);I1=imnoise(I,'salt & pepper',0.02);subplot(232)imshow(I1)title('添加椒盐噪声的图像')k1=filter2(fspecial('average',3),I1)/255; %进行3*3模板平滑滤波k2=filter2(fspecial('average',5),I1)/255; %进行5*5模板平滑滤波k3=filter2(fspecial('average',7),I1)/255; %进行7*7模板平滑滤波k4=filter2(fspecial('average',9),I1)/255; %进行9*9模板平滑滤波subplot(233),imshow(k1);title('3*3模板平滑滤波');subplot(234),imshow(k2);title('5*5模板平滑滤波');subplot(235),imshow(k3);title('7*7模板平滑滤波');subplot(236),imshow(k4);title('9*9模板平滑滤波'); 6.中值滤波器用MATLAB实现中值滤波程序如下:I=imread('xian.bmp');I=rgb2gray(I);J=imnoise(I,'salt&pepper',0.02);subplot(231),imshow(I);title('原图像');subplot(232),imshow(J);title('添加椒盐噪声图像');k1=medfilt2(J); %进行3*3模板中值滤波k2=medfilt2(J,[5,5]); %进行5*5模板中值滤波k3=medfilt2(J,[7,7]); %进行7*7模板中值滤波k4=medfilt2(J,[9,9]); %进行9*9模板中值滤波subplot(233),imshow(k1);title('3*3模板中值滤波'); subplot(234),imshow(k2);title('5*5模板中值滤波'); subplot(235),imshow(k3);title('7*7模板中值滤波'); subplot(236),imshow(k4);title('9*9模板中值滤波'); 7.用Sobel算子和拉普拉斯对图像锐化:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,2,2),imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系H=fspecial('sobel'); %选择sobel算子J=filter2(H,I1); %卷积运算subplot(2,2,3),imshow(J);title('sobel算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系h=[0 1 0,1 -4 1,0 1 0]; %拉普拉斯算子J1=conv2(I1,h,'same'); %卷积运算subplot(2,2,4),imshow(J1);title('拉普拉斯算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系8.梯度算子检测边缘用MATLAB实现如下:I=imread('xian.bmp');subplot(2,3,1);imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,3,2);imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=edge(I1,'roberts');figure;subplot(2,3,3);imshow(I2);title('roberts算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=edge(I1,'sobel');subplot(2,3,4);imshow(I3);title('sobel算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I4=edge(I1,'Prewitt');subplot(2,3,5);imshow(I4);title('Prewitt算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系9.LOG算子检测边缘用MATLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1);imshow(I);title('原始图像');I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'log');subplot(2,2,3);imshow(I2);title('log算子分割结果'); 10.Canny算子检测边缘用MATLAB程序实现如下:I=imread('xian.bmp'); subplot(2,2,1);imshow(I);title('原始图像')I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'canny'); subplot(2,2,3);imshow(I2);title('canny算子分割结果');11.边界跟踪(bwtraceboundary函数)clcclear allI=imread('xian.bmp');figureimshow(I);title('原始图像');I1=rgb2gray(I); %将彩色图像转化灰度图像threshold=graythresh(I1); %计算将灰度图像转化为二值图像所需的门限BW=im2bw(I1, threshold); %将灰度图像转化为二值图像figureimshow(BW);title('二值图像');dim=size(BW);col=round(dim(2)/2)-90; %计算起始点列坐标row=find(BW(:,col),1); %计算起始点行坐标connectivity=8;num_points=180;contour=bwtraceboundary(BW,[row,col],'N',connectivity,num_p oints);%提取边界figureimshow(I1);hold on;plot(contour(:,2),contour(:,1), 'g','LineWidth' ,2); title('边界跟踪图像');12.Hough变换I= imread('xian.bmp');rotI=rgb2gray(I);subplot(2,2,1);imshow(rotI);title('灰度图像');axis([50,250,50,200]);grid on;axis on;BW=edge(rotI,'prewitt');subplot(2,2,2);imshow(BW);title('prewitt算子边缘检测后图像');axis([50,250,50,200]);grid on;axis on;[H,T,R]=hough(BW);subplot(2,2,3);imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit'); title('霍夫变换图');xlabel('\theta'),ylabel('\rho');axis on , axis normal, hold on;P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));x=T(P(:,2));y=R(P(:,1));plot(x,y,'s','color','white');lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7); subplot(2,2,4);,imshow(rotI);title('霍夫变换图像检测');axis([50,250,50,200]);grid on;axis on;hold on;max_len=0;for k=1:length(lines)xy=[lines(k).point1;lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');len=norm(lines(k).point1-lines(k).point2);if(len>max_len)max_len=len;xy_long=xy;endendplot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan'); 13.直方图阈值法用MATLAB实现直方图阈值法:I=imread('xian.bmp');I1=rgb2gray(I);figure;subplot(2,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系[m,n]=size(I1); %测量图像尺寸参数GP=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255GP(k+1)=length(find(I1==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置endsubplot(2,2,2),bar(0:255,GP,'g') %绘制直方图title('灰度直方图')xlabel('灰度值')ylabel('出现概率')I2=im2bw(I,150/255);subplot(2,2,3),imshow(I2);title('阈值150的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=im2bw(I,200/255); %subplot(2,2,4),imshow(I3);title('阈值200的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系14. 自动阈值法:Otsu法用MATLAB实现Otsu算法:clcclear allI=imread('xian.bmp');subplot(1,2,1),imshow(I);title('原始图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系level=graythresh(I); %确定灰度阈值BW=im2bw(I,level);subplot(1,2,2),imshow(BW);title('Otsu法阈值分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系15.膨胀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imdilate(I1,se); %用生成的结构元素对图像进行膨胀subplot(1,2,2);imshow(I2);title('膨胀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系16.腐蚀操作MATLAB实现腐蚀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imerode(I1,se); %用生成的结构元素对图像进行腐蚀subplot(1,2,2);imshow(I2);title('腐蚀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系17.开启和闭合操作用MATLAB实现开启和闭合操作I=imread('xian.bmp'); %载入图像subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1); %采用半径为1的圆作为结构元素I3=imclose(I1,se); %闭合操作subplot(2,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(2,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系18.开启和闭合组合操作I=imread('xian.bmp'); %载入图像subplot(3,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(3,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I3=imclose(I1,se); %闭合操作subplot(3,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(3,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I4=imopen(I1,se);I5=imclose(I4,se);subplot(3,2,5),imshow(I5); %开—闭运算图像title('开—闭运算图像');axis([50,250,50,200]);axis on; %显示坐标系I6=imclose(I1,se);I7=imopen(I6,se);subplot(3,2,6),imshow(I7); %闭—开运算图像title('闭—开运算图像');axis([50,250,50,200]);axis on; %显示坐标系19.形态学边界提取利用MATLAB实现如下:I=imread('xian.bmp'); %载入图像subplot(1,3,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(1,3,2),imshow(I1);title('二值化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=bwperim(I1); %获取区域的周长subplot(1,3,3),imshow(I2);title('边界周长的二值图像');axis([50,250,50,200]);grid on;axis on;20.形态学骨架提取利用MATLAB实现如下:I=imread('xian.bmp'); subplot(2,2,1),imshow(I); title('原始图像');axis([50,250,50,200]); axis on;I1=im2bw(I);subplot(2,2,2),imshow(I1); title('二值图像');axis([50,250,50,200]); axis on;I2=bwmorph(I1,'skel',1); subplot(2,2,3),imshow(I2); title('1次骨架提取');axis([50,250,50,200]); axis on;I3=bwmorph(I1,'skel',2); subplot(2,2,4),imshow(I3); title('2次骨架提取');axis([50,250,50,200]); axis on;21.直接提取四个顶点坐标I = imread('xian.bmp');I = I(:,:,1);BW=im2bw(I);figureimshow(~BW)[x,y]=getpts。
中科大数字图像处理作业1
数字图像处理(中国科学技术大学)HOMEWORK#1编号:59SA16173027李南云[在此处键入文档的摘要。
摘要通常是对文档内容的简短总结。
在此处键入文档的摘要。
摘要通常是对文档内容的简短总结。
]SA16173027 李南云P1:a: The size of lena.tiff is 512x512 ;The size of mandril.tiff is 256x256.b: The values of pixels lena(29, 86) is 105;The values of pixels mandril(198, 201) is 158. c:d:P1代码如下:clear all;f = imread('C:\Users\Administrator\Desktop\images\lena.tiff'); figure(1);imshow(f);i = imread('C:\Users\Administrator\Desktop\images\mandril.tiff'); figure(2);imshow(i);s1 = size(f);s2 = size(i);v1 = f(30,87);v2 = i(199,202);p1 = f(103,:);p2 = i(:,69);figure(3);subplot(211);plot(p1);figure(3);subplot(212);plot(p2);n = 128;for j=1:nb(x,j)=i(x,j);f(x,j)=b(x,j);endendfigure(4);imshow(f);P2代码如下:clear all;a = imread('C:\Users\Administrator\Desktop\images\campusdrive.tif'); figure(1);subplot(231);imshow(a);a1 = double(a);b = floor(a1/8);b = b*8;b = uint8(b);subplot(232);imshow(b);c = floor(a1/16);c = c*16;c = uint8(c);subplot(233);imshow(c);d = floor(a1/32);d = d*32;d = uint8(d);subplot(234);e = floor(a1/64);e = e*64;e = uint8(e);subplot(235);imshow(e);f = floor(a1/168);f = f*168;f = uint8(f);subplot(236);imshow(f);4bit时已经出现伪轮廓,5bit基本可以保存图像质量。
数字图像处理matlab代码
一、编写程序完成不同滤波器的图像频域降噪和边缘增强的算法并进行比较,得出结论。
1、不同滤波器的频域降噪1.1 理想低通滤波器(ILPF)和二阶巴特沃斯低通滤波器(BLPF)clc;clear all;close all;I1=imread('me.jpg');I1=rgb2gray(I1);subplot(2,2,1),imshow(I1),title('原始图像');I2=imnoise(I1,'salt & pepper');subplot(2,2,2),imshow(I2),title('噪声图像');F=double(I2);g = fft2(F);g = fftshift(g);[M, N]=size(g);result1=zeros(M,N);result2=zeros(M,N);nn = 2;d0 =50;m = fix(M/2);n = fix(N/2);for i = 1:Mfor j = 2:Nd = sqrt((i-m)^2+(j-n)^2);h = 1/(1+0.414*(d/d0)^(2*nn));result1(i,j) = h*g(i,j);if(g(i,j)< 50)result2(i,j) = 0;elseresult2(i,j) =g(i,j);endendendresult1 = ifftshift(result1);result2 = ifftshift(result2);J2 = ifft2(result1);J3 = uint8(real(J2));subplot(2, 2, 3),imshow(J3,[]),title('巴特沃斯低通滤波结果'); J4 = ifft2(result2);J5 = uint8(real(J4));subplot(2, 2, 4),imshow(J5,[]),title('理想低通滤波结果');实验结果:原始图像噪声图像巴特沃斯低通滤波结果理想低通滤波结果1.2 指数型低通滤波器(ELPF)clc;clear all;close all;I1=imread('me.jpg');I1=rgb2gray(I1);I2=im2double(I1);I3=imnoise(I2,'gaussian',0.01);I4=imnoise(I3,'salt & pepper',0.01);subplot(1,3,1),imshow(I2), title('原始图像'); %显示原始图像subplot(1,3,2),imshow(I4),title('加入混合躁声后图像 ');s=fftshift(fft2(I4));%将灰度图像的二维不连续Fourier 变换的零频率成分移到频谱的中心[M,N]=size(s); %分别返回s的行数到M中,列数到N中n1=floor(M/2); %对M/2进行取整n2=floor(N/2); %对N/2进行取整d0=40;for i=1:Mfor j=1:Nd=sqrt((i-n1)^2+(j-n2)^2); %点(i,j)到傅立叶变换中心的距离 h=exp(log(1/sqrt(2))*(d/d0)^2);s(i,j)=h*s(i,j); %ILPF滤波后的频域表示endends=ifftshift(s); %对s进行反FFT移动s=im2uint8(real(ifft2(s)));subplot(1,3,3),imshow(s),title('ELPF滤波后的图像(d=40)');运行结果:1.3 梯形低通滤波器(TLPF)clc;clear all;close all;I1=imread('me.jpg');I1=rgb2gray(I1); %读取图像I2=im2double(I1);I3=imnoise(I2,'gaussian',0.01);I4=imnoise(I3,'salt & pepper',0.01);subplot(1,3,1),imshow(I2),title('原始图像'); %显示原始图像subplot(1,3,2),imshow(I4),title('加噪后的图像');s=fftshift(fft2(I4));%将灰度图像的二维不连续Fourier 变换的零频率成分移到频谱的中心[M,N]=size(s); %分别返回s的行数到M中,列数到N中n1=floor(M/2); %对M/2进行取整n2=floor(N/2); %对N/2进行取整d0=10;d1=160;for i=1:Mfor j=1:Nd=sqrt((i-n1)^2+(j-n2)^2); %点(i,j)到傅立叶变换中心的距离 if (d<=d0)h=1;else if (d0<=d1)h=(d-d1)/(d0-d1);else h=0;endends(i,j)=h*s(i,j); %ILPF滤波后的频域表示endends=ifftshift(s); %对s进行反FFT移动s=im2uint8(real(ifft2(s))); %对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数subplot(1,3,3),imshow(s),title('TLPF滤波后的图像');运行结果:1.4 高斯低通滤波器(GLPF)clear all;clc;close all;I1=imread('me.jpg');I1=rgb2gray(I1);I2=im2double(I1);I3=imnoise(I2,'gaussian',0.01);I4=imnoise(I3,'salt & pepper',0.01);subplot(1,3,1),imshow(I2),title('原始图像');subplot(1,3,2),imshow(I4),title('加噪后的图像');s=fftshift(fft2(I4));%将灰度图像的二维不连续Fourier 变换的零频率成分移到频谱的中心[M,N]=size(s); %分别返回s的行数到M中,列数到N中n1=floor(M/2); %对M/2进行取整n2=floor(N/2); %对N/2进行取整d0=40;for i=1:Mfor j=1:Nd=sqrt((i-n1)^2+(j-n2)^2); %点(i,j)到傅立叶变换中心的距离 h=1*exp(-1/2*(d^2/d0^2)); %GLPF滤波函数s(i,j)=h*s(i,j); %ILPF滤波后的频域表示endends=ifftshift(s); %对s进行反FFT移动s=im2uint8(real(ifft2(s))); %对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数subplot(1,3,3),imshow(s),title('GLPF滤波后的图像(d=40)');运行结果:1.5 维纳滤波器clc;clear all;close all;I=imread('me.jpg'); %读取图像I=rgb2gray(I);I1=im2double(I);I2=imnoise(I1,'gaussian',0.01);I3=imnoise(I2,'salt & pepper',0.01);I4=wiener2(I3);subplot(1,3,1),imshow(I1),title('原始图像'); %显示原始图像subplot(1,3,2),imshow(I3),title('加入混合躁声后图像');I4=wiener2(I3);subplot(1,3,3),imshow(I4),title('wiener滤波后的图像');运行结果:结论:理想低通滤波器,虽然有陡峭的截止频率,却不能产生良好的效果,图像由于高频分量的滤除而变得模糊,同时还产生振铃效应。
数字图像处理第6章_图像编码与压缩技术.
霍夫曼编码
例 假设一个文件中出现了8种符号S0、S1、S2、S3、S4、S5、S6、 S7,那么每种符号编码至少需要3bit S0=000, S1=001, S2=010, S3=011, S4=100, S5=101, S6=110, S7=111 那么,符号序列S0 S1 S7 S0 S1 S6 S2 S2 S3 S4 S5 S0 S0 S1编码后 000 001 111 000 001 110 010 010 011 100 101 000 000 001 (共42bit) 和等长编码不同的一种方法是可变长编码。在这种编码方法中, 表示符号的码字的长度不是固定不变的,而是随着符号出现的概率 而变化,对于那些出现概率大的信息符号编以较短的字长的码,而 对于那些出现概率小的信息符号编以较长的字长的码。
6.3.3 霍夫曼编码
霍夫曼(Huffman)编码是根据可变长最佳编码定理,应用霍夫曼算
1.
对于每个符号,例如经过量化后的图像数据,如果对它们每 个值都是以相同长度的二进制码表示的,则称为等长编码或均匀 编码。采用等长编码的优点是编码过程和解码过程简单,但由于 这种编码方法没有考虑各个符号出现的概率,实际上就是将它们 当作等概率事件处理的,因而它的编码效率比较低。例6.3给出了 一个等长编码的例子。
6.1.1 图像的信息冗余
图像数据的压缩是基于图像存在冗余这种特性。压缩就是去掉 信息中的冗余,即保留不确定的信息,去掉确定的信息(可推知 的);也就是用一种更接近信息本身的描述代替原有冗余的描述。 8 (1) 空间冗余。在同一幅图像中,规则物体或规则背景的物理表 面特性具有的相关性,这种相关性会使它们的图像结构趋于有序和 平滑,表现出空间数据的冗余。邻近像素灰度分布的相关性很强。 (2) 频间冗余。多谱段图像中各谱段图像对应像素之间灰度相关 (3) 时间冗余。对于动画或电视图像所形成的图像序列(帧序 列),相邻两帧图像之间有较大的相关性,其中有很多局部甚至完
matlab数字图像处理源代码
数字图像去噪典型算法及matlab实现希望得到大家的指点和帮助图像去噪是数字图像处理中的重要环节和步骤。
去噪效果的好坏直接影响到后续的图像处理工作如图像分割、边缘检测等。
图像信号在产生、传输过程中都可能会受到噪声的污染,一般数字图像系统中的常见噪声主要有:高斯噪声(主要由阻性元器件内部产生)、椒盐噪声(主要是图像切割引起的黑图像上的白点噪声或光电转换过程中产生的泊松噪声)等;目前比较经典的图像去噪算法主要有以下三种:均值滤波算法:也称线性滤波,主要思想为邻域平均法,即用几个像素灰度的平均值来代替每个像素的灰度。
有效抑制加性噪声,但容易引起图像模糊,可以对其进行改进,主要避开对景物边缘的平滑处理。
中值滤波:基于排序统计理论的一种能有效抑制噪声的非线性平滑滤波信号处理技术。
中值滤波的特点即是首先确定一个以某个像素为中心点的邻域,一般为方形邻域,也可以为圆形、十字形等等,然后将邻域中各像素的灰度值排序,取其中间值作为中心像素灰度的新值,这里领域被称为窗口,当窗口移动时,利用中值滤波可以对图像进行平滑处理。
其算法简单,时间复杂度低,但其对点、线和尖顶多的图像不宜采用中值滤波。
很容易自适应化。
Wiener维纳滤波:使原始图像和其恢复图像之间的均方误差最小的复原方法,是一种自适应滤波器,根据局部方差来调整滤波器效果。
对于去除高斯噪声效果明显。
实验一:均值滤波对高斯噪声的效果I=imread('C:\Documents and Settings\Administrator\桌面\1.gif');%读取图像J=imnoise(I,'gaussian',0,0.005);%加入均值为0,方差为0.005的高斯噪声subplot(2,3,1);imshow(I);title('原始图像');subplot(2,3,2); imshow(J);title('加入高斯噪声之后的图像');%采用MATLAB中的函数filter2对受噪声干扰的图像进行均值滤波K1=filter2(fspecial('average',3),J)/255; %模板尺寸为3K2=filter2(fspecial('average',5),J)/255;% 模板尺寸为5K3=filter2(fspecial('average',7),J)/255; %模板尺寸为7K4= filter2(fspecial('average',9),J)/255; %模板尺寸为9subplot(2,3,3);imshow(K1);title('改进后的图像1');subplot(2,3,4); imshow(K2);title('改进后的图像2');subplot(2,3,5);imshow(K3);title('改进后的图像3');subplot(2,3,6);imshow(K4);title('改进后的图像4');PS:filter2用法:filter2用法fspecial函数用于创建预定义的滤波算子,其语法格式为:h = fspecial(type)h = fspecial(type,parameters)参数type制定算子类型,parameters指定相应的参数,具体格式为:type='average',为均值滤波,参数为n,代表模版尺寸,用向量表示,默认值为[3,3]。
数字图像处理第二版MatLab代码大全
4.3
空域滤波增强
Matlab 实现的邻域平均法抑制噪声的程序: I=imread('eight.tif'); J=imnoise(I,'salt & pepper', 0.02); subplot(231),imshow(I);title('原图像'); subplot(232),imshow(J);title('添加椒盐噪声图像') k1=filter2(fspecial('average',3),J); %进行 3×3 模板平滑滤波 k2=filter2(fspecial('average',5),J); %进行 5×5 模板平滑滤波 k3=filter2(fspecial('average',7),J); %进行 7×7 模板平滑滤波 k4=filter2(fspecial('average',9),J); %进行 9×9 模板平滑滤波 subplot(233),imshow(uint8(k1));title('3×3 模板平滑滤波'); subplot(234),imshow(uint8(k2));title('5×5 模板平滑滤波'); subplot(235),imshow(uint8(k3));title('7×7 模板平滑滤波'); subplot(236),imshow(uint8(k4));title('9×9 模板平滑滤波') 例 4.10:使用中值滤波降低图像噪声
9
xlabel(‘\theta (degrees)’); ylabel(‘X\prime’); set(gca,’Xtick’,0:20:180); colormap(hot); colorbar;
数字图像处理-图像变换编码
式中:
u = − N ,− N + 1,..., N − 1
1 当 u = 0, Fs (0) = N
∑ f ( x)
x =0
N −1
1 当 u = − N , ( x) cos(− xπ − 2 ) = 0
x =0
N −1
π
u = ±1,±2,...,± ( N − 1), Fs (u ) = Fs ( −u )
T e1 T e2 A= ⋅ ⋅ ⋅ eT 2 N
CX矩阵与其特征值λi和特征向量ei应符合关系:
C X ei = λi ei
i = 1,2,..., N
2
λ1 λ2 CY = ⋅⋅⋅ ⋅⋅⋅ λN 2
式中:m X
= E{X }
M −1 −1 i =0
M个向量的平均值向量由下式定义:
1 mX ≈ M
M −1
∑ Xi
M −1
X向量的协方差矩阵:
1 CX = M
1 T T ∑( Xi − mX )(Xi − mX ) = M [ ∑Xi Xi ] − mX mX i=0 i=0
T
令λi和ei是协方差矩阵CX的特征值和对应的特征向量:
一维离散偶余弦逆变换公式:
f ( x) =
1 2 N −1 2x +1 C (0) + ∑ C (u ) cos( 2 N uπ ) N N n =1
2、离散K-L变换表达式 K
Y = A( X − m X )
X - m x 是中心化图像向量
可得到K-L变换结果向量Y的协方差矩阵为:
CY = E{(Y − mY )(Y − mY ) }
数字图像处理实验指导书(带源程序)
实验一Matlab图像处理工具箱的初步练习一. 实验目的1. 掌握有关数字图像处理的基本概念;2. 熟悉Matlab图像处理工具箱;3. 熟悉使用Matlab进行数字图像的读出和显示;4. 熟悉运用Matlab指令进行图像旋转和缩放变换。
二. 练习1. 文件的读入与显示(1) 运行Matlab。
(2) MATLAB窗口构成:在缺省的情况下,由三个窗口组成。
命令窗口(command window)、命令历史(command history)、工作空间(workspace)。
注意:缺省窗口的设置步骤为:MATLAB菜单/view选项/Desktop layout/default。
(3) 调入一个文件:i=imread('pout.tif');%注意:前面的“%”是用于注释的,不会被执行,只是说明这个语句的作用。
此时的i出现在什么窗口?是什么类型的变量?大小是多少?(4) 显示这幅图:imshow(i);(5) 将变量i转置成j,即j=i';显示j即imshow(j);%在胸前左侧花纹怎么会跑到右边的呢?举一个例子加以验证:设a=[1 2 3 4 5;6 7 8 9 10;11 12 13 14 15];b=a’;此时的b与a有什么区别?(6) 写入到一个新的图像文件'abc.tif'中,即imwrite(j,'abc.tif')。
(7) 清除变量命令:clear执行这个命令后,workspace窗口中的变量有没有?怎么验证?(8) 清除用户开设的窗口命令:close all(9) 调入图像文件'abc.tif'并显示。
问题:(1) 操作符“’”是图像的转置的意思,转置两次后,是否回到原图像?(2) 命令后的符号“;”所起的作用是什么?(3) 命令是否可以大写母?2. 灰度图像分别选择不同的灰度级(如2、4、16、64、128个)来显示同一幅图像(如testpat1.tif)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例1-1m=uint8(zeros(128,128,1,27));for i=1:27[m(:,:,:,i),map]=imread('mri.tif',i);endmontage(m,map)例2-1a=imread('cameraman.tif'); %读入cameraman图像figure(1);imshow(a);b1=a+50; %b1=a+45图像灰度值增加45figure(2);imshow(b1);b2=1.2*a; %b=1.2*a图像对比度增大figure(3);imshow(b2)b3=0.65*a; %b=0.65*a图像对比度减少figure(4);imshow(b3);b4=-double(a)+255; %b4=-1*a+255,图像求补,注意把a的类型转换为double figure(5);imshow(uint8(b4)); %再把double类型转换为unit8例2-2%读入lena图像a=imread('cameraman.tif'); %读取原始图像figure(1);imshow(a); %显示原始图像xlabel ('(a)原始图像');%显示函数⎰)(x的曲线图x=1:255;y=x+x.*(255-x)/255;figure(2);plot(x,y); %绘制⎰)(x的曲线图xlabel ('(b)函数⎰)(x的曲线图');b1=double(a)+0.006*double(a) .*(255-double(a));figure(3);imshow(uint8(b1)); %显示非线性处理图像xlabel('(c)非线性处理效果');例2-3clear;%%读入图像a=imread('cameraman.tif');imhist(a);title('原始cameraman图像的直方图');%%b=f(a)b1=1.25*double(a)+45;figure(2); imhist(uint8(b1));title ('变换后的直方图');例2-4clear;histgram=zeros(1,256); %生成直方图数组cdf=zeros(1,256);[cm,map]=imread('cameraman.tif);[a,b]=size(cm);for i=1:afor j=1:bk=cm(i,j);histgram(k)=histgram(k)+1;endend %得到直方图cdf(1)=histgram(1);for i=2:256cdf(i)=cdf(i-1)+histgram(i);endfor i=1:a %点运算for i=1:bk=cm(i,j);cm_equ(i,j)=cdf(k)*256/(a*b);endendimshow(uint8(cm_equ));figure(2);imhist(uint8(cm_equ));例2-5I=imread('tire.tif');J=histeq(I);H=adapthisteq(I);figure(1),imshow(I);xlabel('原始图像');figure(2),imshow(J);xlabel('histeq均衡化');figure(3),imshow(H);xlabel('adapthisteq均衡化');例2-6a=imread('hill.jpg');s=size(a);b=double(a);c(:,:,1)=b(:,:,1)+b(:,:,2);c(:,:,2)=b(:,:,2);c(:,:,3)=b(:,:,3)-b(:,:,2);for i=1:s(1)for j=1:s(2)for k=1:s(3)if c(i,j,k)<0c(i,j,k)=0;endif c(i,j,k)>255c(i,j,k)=255;endendendendc=uint8(c);subplot(121);imshow(a);xlabel('原始图像');subplot(122);imshow(c);xlabel('新图像');例2-7a=imread('eight.tif');a1=imnoise(a,'gaussian',0,0.006); %对原始图像加高斯噪声,共得到4幅图像a2=imnoise(a,'gaussian',0,0.006);a3=imnoise(a,'gaussian',0,0.006);a4=imnoise(a,'gaussian',0,0.006);k=imlincomb(0.25,a1,0.25,a2,0.25,a3,0.25,a4); %线性组合subplot(131);imshow(a);subplot(132);imshow(a1);subplot(133);imshow(k,[]);例2-8clear;a=imread('rice.png'); %读取图像figure(1);imshow(a); %显示原始图像background=imopen(a,strel('disk',15)); %在a上进行形态学运算;ap=imsubtract(a,background); %减法运算函数figure(2);imshow(background); %图像输出背景figure(3);imshow(ap,[]); %减法运算结果例2-9a=imread('hill.jpg');b=imread('bom.jpg');s=size(a);m=s(1);n=s(2);b1=imresize(b,[m n]); %MATLAB实现乘法运算函数a=double(a);c=double(b1);d=a.*c/128;d=uint8(d);subplot(131);imshow(a);subplot(132);imshow(b);subplot(133);imshow(d);例2-10a=imread('lena.bmp');background=imopen(a,strel('disk',15));a1=imdivide(a,background);subplot(131);imshow(a); %原始图像subplot(132);imshow(background); %Background结果subplot(133);imshow(a1,[]); %除法运算结果例3-2clear;load woman; %读入图像数据data=uint8(X);[zipped,info]=huffencode(data); %调用Huffman编码程序进行压缩unzipped=huffdecode(zipped,info); %调用Huffman解码程序进行解码%显示原始图像和经编码后的图像,显示压缩比,并计算均方根误差得erms=0,%表示是Huffman无失真编码subplot(121);imshow(data);subplot(122);imshow(unzipped);erms=compare(data(:),unzipped(:))cr=info.ratiowhos data unzipped zipped%Huffencode函数对输入矩阵vector进行Huffman编码,返回编码后的向量(压缩数据)及相关信息function [zippend,info]=huffencode(vector)%输入和输出都是uint8格式%info返回解码需要的结构信息%info.pad是添加的比特数%info.huffcodes是Huffman码字%info.rows是原始图像行数%info.cols是原始图像列数%info.length是最大码长if~isa(vector,'uint8')eror('input argument must be a uint8 vector');end[m,n]=size(vector);vector=vector(:)';f=frequency(vector); %计算各符号出现的概率symbols=find(f~=0);f=f(symbols);[f,sortindex]=sort(f); %将符号按照出现的概率大小排列symbols=symbols(sortindex);len=length(symbols);symbols_index=num2cell(1:len);codeword_tmp=cell(len,1);while length(f)>1 %生成Huffman树,得到码字编码表index1=symbols_index{1};index2=symbols_index{2};codeword_tmp(index1)=addnode(codeword_tmp(index1),uint8(0));codeword_tmp(index2)=addnode(codeword_tmp(index2),uint8(1));f=[sum(f(1:2)) f(3:end)];symbols_index=[{[index1,index2]} symbols_index(3:end)];[f,sortindex]=sort(f);symbols_index=symbols_index(sortindex);endcodeword=cell(256,1);codeword(symbols)=codeword_tmp;len=0;for index=1:length(vector) %得到整个图像所有比特数len=len+length(codeword{double(vector(index))+1});endstring=repmat(uint(0),1,len);pointer=1;for index=1:length(vector) %对输入图像进行编码code=codeword{double(vector(index))+1};len=length(code);string(pointer+(0:len-1))=code;pointer=pointer+len;endlen=length(string);pad=8-mod(len,8); %非8整数倍时,最后补pad个0if pad>0string=[string uint8(zeros(1,pad))];endcodeword=codeword(symbols);codlen=zeros(size(codeword));weights=2.^(0:23);maxcodelen=0;for index=1:length(codeword)len=length(codeword{index});if len>maxcodelenmaxcodelen=len;endif len>0code=sum(weights(codeword{index}==1));code=bitset(code,len+1);codeword{index}=code;codelen(index)=len;endendcodeword=[codeword{:}];%计算压缩后的向量cols=length(string)/8;string=reshape(string,8,cols);weights=2.^(0:7);zipped=uint8(weights*double(string));%码表存储到一个稀疏矩阵huffcodes=sparse(1,1);for index=1:nnz(codeword)huffcodes(codeword(index),1)=symbols(index);end%填写解码时所需的结构信息info.pad=pad;info.huffcodes=huffcodes;info.ratio=cols./length(vector);info.length=length(vector);info.maxcodelen=maxcodelen;info.rows=m;info.cols=n;%huffdecode函数对输入矩阵vector进行Huffman编码,返回解压后的图像数据function vector=huffdecode(zipped,info,image)if ~isa(zipped,'uint8')error('input argument must be a uint8 vector');end%产生0,1序列,每位占一个字节len=length(zipped);string=repmat(uint8(0),1,len.*8);bitindex=1:8;for index=1:lenstring(bitindex+8.*(index-1))=uint8(bitget(zipped(index),bitindex)); endstring=logical(string(:)');len=length(string);%开始解码weights=2.^(0:51);vector=repmat(uint8(0),1,info.length);vectorindex=1;codeindex=1;code=0;for index=1:lencode=bitset(code,codeindex,string(index));codeindex=codeindex+1;byte=decode(bitset(code,codeindex),info);if byte>0vector(vectorindex)=byte-1;codeindex=1;code=0;vectorindex=vectorindex+1;endendvector=reshape(vector,info.rows,info.cols);%函数addnode添加节点function codeword_new=addnode(codeword_old,item)codeword_new=cell(size(codeword_old));for index=1:length(codeword_old)codeword_new{index}=[item codeword_old{index}];end%函数frequency计算各符号出现的概率function f=frequency(vector)if ~isa(vector,'uint8')error('input a argument must be a uint8 vector');endf=repmat(0,1,256);len=length(vector);for index=0:255f(index+1)=sum(vector==uint8(index));endf=f./len;%函数decode返回码字对应的符号function byte=decode(code,info)byte=info.huffcodes(code);例3-5clear all;format long e;symbol=['abcd'];ps=[0.4 0.2 0.1 0.3];inseq=('dacab');codeword=suanshubianma(symbol,ps,inseq)outseq=suanshujiema(symbol,ps,codeword,length(inseq))%算术编码函数suanshubianmafunction acode=suanshubianma(symbol,ps,inseq)high_range=[];for k=1:length(ps)high_range=[high_range sum(ps(1:k))];endlow_range=[0 high_range(1:length(ps-1))];sbidx=zeros(size(inseq));for i=1:length(inseq)sbidx(i)=find(symbol==inseq(i));endlow=0;high=1;for i=1:length(inseq)range=high-low;high=low+range*high_range(sbidx(i));low=low+range*low_range(sbidx(i));endacode=low;%算术解码函数suanshujiemafunction symbos=suanshujiema(symbol,ps,codeword,symlen) format long ehigh_range=[];for k=1:length(ps)high_range=[high_range sum(ps(1:k))];endlow_range=[0 high_range(1:length(ps)-1)];psmin=min(ps);symbos=[];for i=1:symlenidx=max(find(low_range<=codeword));codeword=codeword-low_range(idx);if abs(codeword-ps(idx))<0.01*psminidx=idx+1;codeword=0;endsymbos=[symbos symbol(idx)];codeword=codeword/ps(idx);if abs(codeword)<0.01*psmini=symlen+1;endend例3-6clear;I1=imread('cameraman.tif');I=im2bw(I1,0.4);[zipped,info]=xingchengbianma(I); %调用xingchengbianma进行编码unzipped=xingchengjiema(zipped,info); %调用xingchengjiema进行解码subplot(131);imshow(I1); %显示原始图像xlabel('原始灰度图像');subplot(132);imshow(I);xlabel('二值图像'); %显示二值图像subplot(133);imshow(unzipped); %显示解码图像xlabel('解码图像');unzipped=uint8(unzipped);%计算均方根误差得erms=0,表示行程编码是无失真编码erms=jfwucha(I(:),unzipped(:))%显示压缩比cr=info.ratiowhos I1 I unzipped zipped%行程编码函数xingchengbianmafunction [zipped,info]=xingchengbianma(vector)[m,n]=size(vector);vector=vector(:)';vector=uint8(vector(:));L=length(vector);c=vector(1);e(1,1)=c;e(1,2)=0;t1=1;for j=1:Lif(vector(j)==c)e(t1,2)=double(e(t1,2))+1;elsec=vector(j);t1=t1+1;e(t1,1)=c;e(t1,2)=1;endendzipped=e;info.rows=m;info.cols=n;[m,n]=size(e);info.ratio=m*n/(info.rows*info.cols);%行程解码函数xingchengjiemafunction unzipped=xingchengjiema(zip,info)zip=uint8(zip);[m,n]=size(zip);unzipped=[];for i=1:msection=repmat(zip(i,1),1,double(zip(i,2)));unzipped=[unzipped section];endunzipped=reshape(unzipped,info.rows,info.cols); unzipped=double(unzipped);%计算均方根误差函数jfwuchafunction erms=jfwucha(f1,f2)e=double(f1)-double(f2);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n));if erms~=0emax=max(abs(e(:)));[h,x]=hist(e(:));if length(h)>=1figure(2);bar(x,h,'r');e=mat2gray(e,[-emax,emax]);figure(3);imshow(e);endend例3-7%读入Lena图像,用LPCencode进行线性预测编码,用LPCdecode解码I=imread('lena.bmp');x=double(I);y=LPCencode(x);xx=LPCdecode(y);%显示线性误差图,如图3-12(a)所示figure(1);subplot(121);imshow(I);subplot(122);imshow(mat2gray(y));%计算均方根误差,因为是无损编码,那么erms应该为0e=double(x)-double(xx);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n))%显示原图直方图figure(2);subplot(121);[h,f]=hist(x(:));bar(f,h,'k');%显示预测误差的直方图subplot(122);[h,f]=hist(y(:));bar(f,h,'k')%LPCencode函数用一维无损预测编码压缩图像x,a为预测系数,如果a为默认,则默认%a=1,就是前值预测function y=LPCencode(x,a)error(nargchk(1,2,nargin))if nargin<2a=1;endx=double(x);[m,n]=size(x);p=zeros(m,n); %存入预测值xs=x;zc=zeros(m,1);for i=1:length(a)xs=[zc xs(:,1:end-1)];p=p+a(i)*xs;endy=x-round(p);%LPCdecode函数是解码函数,与编码程序用的同一个预测器function x=LPCdecode(y,a)error(nargchk(1,2,nargin));if nargin<2a=1;enda=a(end:-1:1);[m,n]=size(y);order=length(a);a=repmat(a,m,1);x=zeros(m,n+order);for i=1:nii=i+order;x(:,ii)=y(:,i)+round(sum(a(:,order:-1:1).*x(:,(ii-1):-1:(ii-order)),2));endx=x(:,order+1:end);例3-8%设置压缩比crcr=0.5; %cr=0.5为2:1压缩;cr=0.125为8:1压缩I=imread('lena.bmp'); %图像的大小为512×512I1=double(I)/255; %图像为256级灰度图像,对图像进行归一化操作figure(1);imshow(I1); %显示原始图像%对图像进行FFTfftcoe=blkproc(I1,[8 8],'fft2(x)'); %将图像分割为8×8的子图像进行FFT coevar=im2col(fftcoe,[8 8],'distinct'); %将变换系数矩阵重新排列coe=coevar;[y,ind]=sort(coevar);[m,n]=size(coevar); %根据压缩比确定要变0的系数个数snum=64-64*cr;%舍去不重要的系数for i=1:ncoe(ind(1:snum),i)=0; %将最小的snum个变换系数清0endb2=col2im(coe,[8 8],[512 512],'distinct'); %重新排列系数矩阵%对子图像块进行FFT逆变换获得各个子图像的复原图像,并显示压缩图像I2=blkproc(b2,[8 8],'ifft2(x)'); %对截取后的变换系数进行FFT逆变换figure(2);imshow(I2);%计算均方根误差ermse=double(I1)-double(I2);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n))例3-9%设置压缩比crcr=0.5; %cr=0.5为2:1压缩;cr=0.125为8:1压缩I=imread('lena.bmp'); %图像的大小为512×512I1=double(I)/255; %图像为256级灰度图像,对图像进行归一化操作figure(1);imshow(I1); %显示原始图像%对图像进行DCTt=dctmtx(8);dctcoe=blkproc(I1,[8 8],'P1*x*P2',t,t');coevar=im2col(dctcoe,[8 8],'distinct');coe=coevar;[y,ind]=sort(coevar);[m,n]=size(coevar); %根据压缩比确定要变0的系数个数%舍去不重要的系数snum=64-64*cr;for i=1:ncoe(ind(1:snum),i)=0; %将最小的snum个变换系数清0 endb2=col2im(coe,[8 8],[512 512],'distinct'); %重新排列系数矩阵%对截取后的变换系数进行DCT逆变换I2=blkproc(b2,[8 8],'P1*x*P2',t',t); %对截取后的变换系数进行DCT逆变换figure(2);imshow(I2);%计算均方根误差ermse=double(I1)-double(I2);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n))例3-10%设置压缩比crcr=0.5; %cr=0.5为2:1压缩;cr=0.125为8:1压缩I=imread('lena.bmp'); %图像的大小为512×512I1=double(I)/255; %图像为256级灰度图像,对图像进行归一化操作figure(1);imshow(I1); %显示原始图像%对图像进行哈达玛变换t=hadamard(8);htcoe=blkproc(I1,[8 8],'P1*x*P2',t,t);coevar=im2col(htcoe,[8 8],'distinct');coe=coevar;[y,ind]=sort(coevar);[m,n]=size(coevar); %根据压缩比确定要变0的系数个数%舍去不重要的系数snum=64-64*cr;for i=1:ncoe(ind(1:snum),i)=0; %将最小的snum个变换系数清0endb2=col2im(coe,[8 8],[512 512],'distinct'); %重新排列系数矩阵%对截取后的变换系数进行哈达玛逆变换I2=blkproc(b2,[8 8],'P1*x*P2',t,t); %对截取后的变换系数进行哈达玛逆变换I2=I2./(8*8);figure(2);imshow(I2);%计算均方根误差ermse=double(I1)-double(I2);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n))3.5.4节代码%jpegencode函数用来压缩图像,是一种近似的JPEG方法function y=jpegencode(x,quality)%x为输入图像%quality决定了截去的系数和压缩比error(nargchk(1,2,nargin)); %检查输入参数if nargin<=2quality=1; %默认时quality=1endx=double(x)-128; %像素层次移动-128[xm,xn]=size(x);t=dctmtx(8); %得到8*8 DCT矩阵%将图像分割成8*8子图像,进行DCT,然后进行量化y=blkproc(x,[8 8],'P1*x*P2',t,t');m=[16 11 10 16 24 40 51 6112 12 14 19 26 58 60 5514 13 16 24 40 57 69 5614 17 22 29 51 87 80 6218 22 67 56 68 109 103 7724 35 55 64 81 104 113 9249 64 78 87 103 121 120 9272 92 95 98 112 100 103 99]*quality;%用m量化步长短对变换矩阵进行量化,即根据式(3-37)量化yy=blkproc(y,[8 8],'round(x./P1)',m); %将图像块排列成向量y=im2col(yy,[8 8],'distinct'); %得到列数,也就是子图像个数xb=size(y,2); %变换系数排列次序order=[1 9 2 3 10 17 25 18 11 4 5 12 19 26 33...41 34 27 20 13 6 7 14 21 28 35 42 49 57 50...43 36 29 22 15 8 16 23 30 37 44 51 58 59 52...45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 62 63 56 64];%用Z形扫描方式对变换系数重新排列y=y(order,:);eob=max(x(:))+1; %创建一个块结束符号num=numel(y)+size(y,2);r=zeros(num,1);count=0;% 将非零元素重新排列放到r中,-26-3 eob -25 1 eobfor j=1:xbi=max(find(y(:,j))); %每次对一列(即一块)进行操作if isempty(i)i=0;endp=count+1;q=p+i;r(p:q)=[y(1:i,j);eob]; %截去0并加上结束符号count=count+i+1;endr((count+1):end)=[]; %删除r的没有用的部分r=r+128;%保存编码信息y.size=uint16([xm,xn]);y.numblocks=uint16(xb);y.quality=uint16(quality*100);%对r进行Huffman编码[y.huffman ]=huffencode(uint8(r));%jpegdecode函数,jpegencode的解码程序function x=jpegdecode(y)error(nargchk(1,1,nargin)); %检查输入参数m=[16 11 10 16 24 40 51 6112 12 14 19 26 58 60 5514 13 16 24 40 57 69 5614 17 22 29 51 87 80 6218 22 67 56 68 109 103 7724 35 55 64 81 104 113 9249 64 78 87 103 121 120 9272 92 95 98 112 100 103 99];order=[1 9 2 3 10 17 25 18 11 4 5 12 19 26 33...41 34 27 20 13 6 7 14 21 28 35 42 49 57 50...43 36 29 22 15 8 16 23 30 37 44 51 58 59 52...45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 62 63 56 64]; rev=order; %计算逆运算for k=1:length(order)rev(k)=find(order==k);end%ff=max(rev(:))+1;m=double(y.quality)/100*m;xb=double(y.numblocks); %得到图像的块数sz=double(y.size);xn=sz(1); %得到行数xm=sz(2); %得到列数x=huffdecode(y.huffman,); %Huffman解码x=double(x)-128;eob=max(x(:)); %得到块结束符z=zeros(64,xb);k=1;for i=1:xbfor j=1:64if x(k)==eobk=k+1;break;elsez(j,i)=x(k);k=k+1;endendendz=z(rev,:); %恢复次序x=col2im(z,[8 8],[xm xn],'distinct'); %重新排列成图像块x=blkproc(x,[8 8],'x.*P1',m); %逆量化t=dctmtx(8);x=blkproc(x,[8 8],'P1*x*P2',t',t); %DCT逆变换x=uint8(x+128); %进行位移例3-11clear all;x=imread('F:\教材各章图稿\第2章图\第2章图\lena.bmp'); %读入原始图像subplot(121); %显示原始图像imshow(x);y=jpegencode(x,5); %进行近似的JPEG编码X=jpegecode(y); %进行解码subplot(122);imshow(X); %显示压缩图像%计算均方根误差e=double(x)-double(X);[m,n]=size(e);erms=sqrt(sum(e(:).^2)/(m*n))%计算压缩比cr=imageratio(x,y)例4-1I=imread('fenj.jpg'); %读入清晰图像subplot(121);imshow(I); %显示原始图像len=30; %设置运动位移为30个像素theta=45; %设置运动角度为45度psf=fspecial('motion',len,theta); %建立二维仿真线性运动滤波器psf I1=imfilter(I,psf,'circular','conv'); %用psf产生退化图像subplot(122);imshow(I1); %显示运动后的图像例4-2[I1,map]=imread('fenj-mf.jpg'); %读入运动模糊图像figure(1);imshow(I1);len=30;theta=45;initpsf=fspecial('motion',len,theta); %建立复原点扩散函数[J,P]=deconvblind(I1,initpsf,30); %去卷积figure(2);imshow(J); %显示结果图像如图4-7c(所示)figure(3);imshow(P,[],'notruesize'); %显示复原点扩散函数如图4-7(b)所示例4-3I=imread('meihua.jpg'); %读入图像subplot(221);imshow(I);title('原始图像');H=fspecial('motion',30,45); %运动模糊PSFMotionBlur=imfilter(I,H); %卷积subplot(222);imshow(MotionBlur);title('运动模糊图像');H=fspecial('disk',10); %圆盘状模糊PSFbulrred=imfilter(I,H);subplot(223);imshow(bulrred);title('圆盘状模糊图像');H=fspecial('unsharp'); %钝化模糊PSFSharpened=imfilter(I,H);subplot(224);imshow(Sharpened);title('钝化模糊图像');例5-1A=imread('cat.jpg');figure;subplot(121);imshow(A);A=double(A);A_move=zeros(size(A));H=size(A);A_x=50;A_y=50;I_movesult(A_x+1:H(1),A_y+1:H(2),1:H(3))=I(1:H(1)-A_x,1:H(2)-A_y,1:H(3));subplot(122);imshow(uint8(A_move));例5-2I=imread('hua1.jpg');I1=imcrop(I,[80 60 50 50]);figure;subplot(121);imshow(I);subplot(122);imshow(I1);例5-3I=imread('fengj.jpg')n=50;m=50;figure;imshow(I);for i=1:50n=n-1;m=m+1;I1=imcrop(I,[n,n,m,m]);figure;imshow(I1);end例5-5I=imread('fish.jpg'); %I为原始图像figure;subplot(131);imshow(I); %显示原始图像I=double(I);I_en=imresize(I,4,'nearest'); %最近邻法标志函数nearest扩大4倍subplot(132);imshow(uint8(I_en)); %显示扩大4倍后的图像I_re=imresize(I,0.5,'nearest'); %缩小两倍subplot(133);imshow(uint8(I_re));%显示缩小2倍后的图像例5-6clear all;I=imread('che.jpg'); %本书用的图片都在当前目录下,故不用写路径subplot(121);imshow(I);I1=imrotate(I,30,'crop');subplot(122);imshow(I1);例5-7I=imread('che.jpg');for i=1:25I1=imrotate(I,15*i,'crop');imshow(I1);end例5-8I=imread('mao.jpg');figure;subplot(121);imshow(I);I=double(I);h=size(I);I1=zeros(h(1)+round(h(2)*tan(pi/6)),h(2),h(3));for m=1:h(1)for n=1:h(2)I1(m+round(n*tan(pi/6)),n,1:h(3))=I(m,n,1:h(3));endendI2=uint8(I1);subplot(122);imshow(I2);例5-9I=imread('ta.jpg');figure;subplot(221);imshow(I);I=double(I);h=size(I);I_fliplr(1:h(1),1:h(2),1:h(3))=I(1:h(1),h(2):-1:1,1:h(3)); %水平镜像变换I1=uint8(I_fliplr);subplot(222);imshow(I1);I_flipud(1:h(1),1:h(2),1:h(3))=I(h(1):-1:1,1:h(2),1:h(3)); %垂直镜像变换I2=uint8(I_flipud);subplot(223);imshow(I2);I_fliplr_flipud(1:h(1),1:h(2),1:h(3))=I(h(1):-1:1,h(2):-1:1,1:h(3)); %对角镜像变换I3=uint8(I_fliplr_flipud);subplot(224);imshow(I3);例5-10I=imread('moon.jpg'); %读取原始图像figure;subplot(121);imshow(I);I=double(I);I1=zeros(size(I))+255;h=size(I1);I1(50+1:h(1),50+1:h(2),1:h(3))=I(1:h(1)-50,1:h(2)-50,1:h(3)); %平移变换I2(1:h(1),1:h(2),1:h(3))=I1(h(1):-1:1,1:h(2),1:h(3)); %镜像变换I3=imrotate(I2,45,'nearest'); %旋转变换I4=imresize(I3,3,'nearest'); %扩大3倍I4=uint8(I4);subplot(122);imshow(I4);例5-11T=maketform('affine',[0.5 0 0;0.5 1 0;0 0 1]);I=imread('cameraman.tif');I1=imtransform(I,T);figure;subplot(121);imshow(I);subplot(122);imshow(I1);例5-12I=imread('yazi.jpg'); %读取原始图像I1=imresize(I,[60 60]);figure;subplot(121);imshow(I);T=maketform('projective',[1 1;31 1;31 31;1 31],[5 5;40 5;35 30;-10 30]);T1=makeresampler('cubic','circular');T2=imtransform(I1,T,T1,'size',[150 200],'XYScale',1);subplot(122);imshow(T2);例5-13I=imread('xibao.bmp'); %读取原始图像I1=double(I);I2=floor((I1(:,:,1)+I1(:,:,2)+I1(:,:,3))/3);A=[-1 -1 -1;-1 8 -1;-1 -1 -1];for i=2:15for j=2:15L=I2(i-1:i+1,j-1:j+1).*A;I3(i,j)=sum(sum(L));endendI3imshow(I3);例5-14I=imread('bao.bmp');I1=rgb2gray(I);figure;subplot(121);imshow(I1);fun=inline('median(x(:))');B=nlfilter(I1,[3 3],fun);subplot(122);imshow(B);例5-15I=imread(bao.bmp');I1=rgb2gray(I);figure;subplot(121);imshow(I1);fun=inline('mean(mean(x))');B=nlfilter(I1,[3 3],fun);subplot(122);image(B);axis off;例5-16I=imread('boy1.gif');figure;subplot(121);imshow(I);B=uint8(colfilt(I,[3 3],'sliding','mean'));subplot(122);imshow(B);例5-17I=imread('xibao.bmp');I1=rgb2gray(I);I2=double(I1);fun=inline('ones(16,1)*mean(x)');B=floor(colfilt(I2,[4 4],'distinct',fun))例5-18I=imread(xibao.bmp');I1=rgb2gray(I);fun=@dct2;I2=blkproc(I1,[8 8],fun);imagesc(I2);例5-19I=imread('fengja.jpg');subplot(121);imshow(I);C1=[10 40 90];C2=[30 98 54];I2=roipoly(I,C1,C2);subplot(122);imshow(I2);例5-20[I1,m]=imread('fengja.jpg');I2=rgb2gray(I1);I3=double(I2);figure;subplot(121);imshow(I3,m);C1=[10 40 90];C2=[30 98 54];BW=roipoly(I3,C1,C2);B=double(BW)*256;AB=(I3+B);subplot(122);imshow(AB,m);例5-21[I1,m]=imread('fengja.jpg');I2=rgb2gray(I1);I3=double(I2);figure;subplot(121);imshow(I3,m);C1=10:pi:180;C2=floor(20*cos(C1));BW=roipoly(I3,C1,C2);B=double(BW)*256;AB=(I3+B);subplot(122);imshow(AB,m);例6-2X=ones(100,100); %设定原始图像,大小为100×100 X(65:85,73:78)=0; %设定图像中间的黑带figure(1);imshow(X,'notruesize');F=fft2(X); %二维快速Fourier变换F1=abs(F);%结果输出figure(2);imshow(F1);colormap(jet);%阵元平移I1=[1,-1;-1,1];I2=repmat(I1,50,50);Y=X.*12;F2=abs(fft2(Y));figure(3);imshow(F2);colormap(jet);colorbar;例6-4figure(1);load imdemos saturn2; %将入MATLAB图像saturn2subplot(121);imshow(saturn2); %显示原始图像S=fftshift(fft2(saturn2)); %计算傅里叶变换并移位subplot(122);imshow(log(abs(S)),[]); %显示傅里叶变换谱例6-5I=imread('cat.jpg'); %读入真彩色figure(1);subplot(131);imshow(I);B=rgb2gray(I); %将真彩色转换为灰度图像subplot(132);imshow(B);C=fftshift(fft2(B)); %计算傅里叶变换并移位subplot(133);imshow(log(abs(C)),[]); %显示傅里叶变换谱例6-6RGB=imread('gantrycrane.png');I=rgb2gray(RGB); %转化成强度图像BW=edge(I,'canny'); %提取边界[H,T,R]=hough(BW,'RhoResolution',0.5,'ThetaResolution',0.5);%显示原始图像subplot(221);imshow(RGB);title('gantrycrane.png');%显示Hough矩阵subplot(212);imshow(imadjust(mat2gray(H)),'XData',T,'YData',R,'InitialMagnification','fit');title('Hough transform of gantrycrane.png');xlabel('\theta');ylabel('\rho');axis on;axis normal;hold on;colormap(hot);P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);figure;imshow(BW);hold on;max_len=0;for k=1:length(lines)xy=[lines(k).point1;lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');%显示线段的开头和结尾plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');%检测最长线段的终点len=norm(lines(k).point1-lines(k).point2);if(len>max_len)max_len=len;xy_long=xy;endend%保存图像imwrite(I,'cha_1.bmp','bmp');imwrite(BW,'cha_2.bmp','bmp');H=H/(max(max(H)));imwrite(H,'cha_3.bmp','bmp');例6-8RGB=imread('gantrycrane.png');I=rgb2gray(RGB); %转化成强度图像BW=edge(I,'canny'); %提取边界figure(1);imshow(I);figure(2);imshow(BW);%计算theta_step=1;theta=0:theta_step:360;[R,xp]=radon(BW,theta);figure(3);imagesc(theta,xp,R);colormap(hot);xlabel('\theta(degrees)');ylabel('X\prime');title('R_{\theta}(X\prime)');colorbar;max_R=max(max(R)); %捕捉强累积点threshold=0.75;[II,JJ]=find(R>=(max_R*threshold));[line_n,d]=size(II);figure(4);imshow(BW);for k=1:line_nj=JJ(k);i=II(k);R_i=(j-1)*theta_step;xp_i=xp(i);[n,m]=size(BW); %计算直线在原始图像中的位置x_origin=m/2+(xp_i)*sin(R_i*pi/180);y_origin=n/2-(xp_i)*cos(R_i*pi/180)+1;x1=1;xe=m;y1=(y_origin-(x1-x_origin)*tan(((R_i)-90)*pi/180));ye=(y_origin-(xe-x_origin)*tan(((R_i)-90)*pi/180));xv=[x1 xe];yv=[y1,ye];hold on;line(xv,yv);plot(x_origin,y_origin,'.r');end例6-9I=zeros(100,100); %建立简单图像I(25:75,25:75)=1;figuresubplot(121);imshow(I); %显示建立的图像theta=0:180; %规定变换角度的范围[R,xp]=radon(I,theta); %计算radon变换subplot(122);imagesc(theta,xp,R); %以图像方式显示变换结果Rtitle('R_{\theta}(X\prime)'); %显示图像标题xlabel('\theta(degrees)'); %显示x坐标ylabel('X\prime'); %显示y坐标set(gca,'Xtick',0:20:180); %设置x坐标刻度colormap(hot); %设置调色板colorbar; %显示当前图像的调色板例6-10RGB=imread('hai1.jpg'); %读入真彩色图像GRAY=rgb2gray(RGB); %将真彩色图像转换为灰度图像figure;subplot(221);imshow(RGB); %显示真彩色图像subplot(222);imshow(GRAY); %显示灰度图像[R,xp]=radon(GRAY,[0 45]); %计算变换角度为0°和60°的Radon变换subplot(223);plot(xp,R(:,1));%显示0°方向上的Radon变换title('R_{0^o}(x\prime)');subplot(224);plot(xp,R(:,2));%显示60°方向上的Radon变换title('R_{60^o}(x\prime)');例6-11%产生测试图像并显示,如图6-30(a)所示I=phantom(256);figure;imshow(I);%计算映射数据,设定几何关系为“弧度”,然后分别给定光束密度为2弧度、1弧度%以及0.25弧度。