西安交通大学图像测量专题实验报告班级:姓名:学号:一、实验目的:1培养学生相关图像基本处理操作的能力,利用Matlab软件,深入掌握相关图像处理操作,例如图像基本处理操作、图像变换、视频处理、图像特征提取的编程实现。
2了解有一定应用背景的图像处理算法,例如面积测量、缺陷检测,培养学生相关图像处理的分析问题的能力。
二、实验内容:(除实验1~2在XA VIS下完成外,其他实验均在Matlab下完成):1 机器视觉平台实验(面积测量)教材P178 实验T22 机器视觉平台实验(缺陷检测)教材P193 要求啤酒瓶身包装缺陷检测,自行寻找合格和不合格的图片3 图像基本处理操作(图像显示、读写、像素统计处理、图像文件I/O、颜色空间转换)4 图像质量的客观评价(峰值信噪比PSNR,并测试图像和视频序列)5 图像的几何操作(缩放、旋转、剪切、二维空间变换)6 视频处理(创建A VI视频)7 图像变换(傅立叶变换、余弦变换、小波变换)8图像特征提取(纹理特征、形状特征)三、程序、结果与分析1、机器视觉平台实验(面积测量)在实验室中的ZM-VS1200平台上完成,采用XA VIS图像处理软件。
编写程序测量正六边形面积(1)程序:readimage(d:/hmx0905/6bianxing2.bmp,i1);%读取图像convertgray(i1,i1);%彩图转换为8位灰度图showimage(i1);%显示灰度图thresholdcovert(i1,i2,fixthreshold,100);%对图像做固定阈值分割showimage(i2);%显示阈值分割后的图像pointinvert(i2,i22);%图像反色showimage(i22);%显示反色后图像contourareas(i22,1,0,i3,num,x,y,area);%采用向量分析法来提取边缘轮廓,针对轮廓进行面积计算showimage(i3);%显示轮廓图像for(i=0,num,1);h=(x[i]+20.0);v=(y[i]+0.0);cstringformat("%1f,area[i]",s);%标注面积信息gentext(h,v,15,s,red);%设置字体信息endfor();(2)实验结果与分析原图像:面积测量结果:注:实验当中一定要先把图像转换为8位灰度图2、机器视觉平台实验(缺陷检测))在实验室中的ZM-VS1200平台上完成,采用XA VIS图像处理软件。
瓶盖印刷的缺陷检测,对瓶盖的合格情况进行判断(1)程序:readimage(d:/hmx0905/muban.bmp,rgbimage_std);%读取图像作为检测模板convertdepth24to8(rgbimage_std,rgb2grayimage_std);% 24位位图转换为8位灰度图showimage(rgbimage_std);%显示模板图像readimage(d:/hmx0905/muban.bmp,rgbimage_defect);%读取需要检测的图像convertdepth24to8(rgbimage_defect,rgb2grayimage_defect);% 24位位图转换为8位灰度图graystatdefect(rgb2grayimage_std,rgb2grayimage_defect,10,result);%比较模板与待测图像是否一致,一致则result=1,不一致则result=0 showimage(rgbimage_defect);%显示缺陷%标记图像是否合格if(result=1);gentext(5,5,50,合格,black);endif();if(result=0);gentext(5,5,50,不合格,red);endif();(2)实验结果与分析模板图像检测结果3、图像基本处理操作(图像显示、读写、像素统计处理、图像文件I/O、颜色空间转换)(1)程序:%-----------------------图像基本处理操作-----------------------%clc,clear,close all;%图像文件的读操作I=imread('cat','jpg');%图像显示imshow(I);%图像文件写操作imwrite(I,'output1.jpg','jpg')%转换为灰度图H=rgb2gray (I);%灰度图像像素统计figure;imhist(H);title('灰度图像像素统计');% 彩色图像RGB各色像素统计R=I(:,:,1);G=I(:,:,2);B=I(:,:,3);figure;subplot(131);imhist(R);title('histogram of Red');subplot(132);imhist(G);title('histogram of Green');subplot(133);imhist(B);title('histogram of Blue');%颜色空间变换,RGB转换为HSVHSV=rgb2hsv(I);figure;subplot(121);subimage(I);title('RGB空间原图像');subplot(122);subimage(HSV);title('变换后HSV空间图像');%颜色空间变换,RGB转换为HSIHSI=rgb2hsi(I);figure;subplot(121);subimage(I);title('RGB空间原图像');subplot(122);subimage(HSI);title('变换后HSI空间图像');%------------------------------------------------------------------------% (2)实验结果与分析:%显示原始图像%图像文件写操作图像…output1‟保存在matlab默认路径下%灰度图像像素统计“双峰一谷”说明灰度图像中的基本纹理有不同亮度的两个区%彩色图像RGB各色像素统计%颜色空间变换,RGB转换为HSV%颜色空间变换,RGB转换为HSI4、图像质量的客观评价(峰值信噪比PSNR,并测试图像)(1)程序:%--------------------------图像质量的客观评价--------------------------% clc,clear,close all;%读入一个BMP图像,并显示lena512=imread('lena512','bmp');subplot(121);subimage(lena512);title('BMP图像');%将BMP图像转换为JPG图像,并显示imwrite(lena512,'lena.jpg','jpg');lenajpg=imread('lena','jpg');subplot(122);subimage(lenajpg);title('JPG压缩后的图像');%有损压缩后,计算BMP图像和JPG图像之间的PSNRPSNR(lena512,lenajpg);%----------------------------------------------------------------------------------%%--------------------------------PSNR子函数---------------------------------% function psnr = PSNR(A,B)sizeA = size(A);sizeB = size(B);if sizeA ~= sizeBerror('Image A and B are not of the same size');endif A == Berror('Image are identical:PSNR has infinite value');endmax2_A = max(max(A));max2_B = max(max(B));min2_A = min(min(A));min2_B = min(min(B));if max2_A>255 | max2_B>255 | (min2_A<0) | (min2_B<0) error('input matrices must have values in the interval[0,255]');enderror_diff = A-B;decibels = 20*log10(255/(sqrt(mean(mean(error_diff.^2)))));disp(sprintf('PSNR =+%5.2f dB\n',decibels))%----------------------------------------------------------------------------------% (2)实验结果与分析:将BMP格式的lena图像转换为JPG,由于JPEG压缩是有损压缩,压缩后图像的质量通过计算PSNR进行衡量计算结果RGB三通道的PSNR值分别为R.PSNR =+36.23 dBR.PSNR =+38.59 dBR.PSNR =+35.68 dB5、图像的几何操作(缩放、旋转、剪切、二维空间变换)(1)程序%----------------------------图像的几何操作--------------------------------%clc,clear,close all;%图像文件的读操作I=imread('wflower','jpg');%用bilinear插值方法进行图像缩放I2=imresize(I,1.4,'bilinear');I3=imresize(I,0.6,'bilinear');%缩放前后对比figure;imshow(I);title('原尺寸图像');figure;imshow(I2);title('1.3倍图像');figure;imshow(I3);title('0.6倍图像');%用bilinear插值方法进行图像旋转I4_1=imrotate(I,-10,'bilinear','crop');I4_2=imrotate(I,-10,'bilinear');figure;subplot(131);subimage(I);title('原图像');axis on;subplot(132);subimage(I4_1);title('旋转-10度图像(切割)');axis on;subplot(133);subimage(I4_2);title('旋转-10度图像');axis on;%图像剪切(交互进行)figure;imshow(I);title('原图像');I5=imcrop(I);figure;subplot(121);subimage(I);title('原图像');axis on;subplot(122);subimage(I5);title('剪切后图像');axis on;%仿射变换tform=maketform('affine',[1 0 0;0.5 1 0;0 0 1]);I6=imtransform(I,tform);figure;subplot(121);subimage(I);title('原图像');axis on;subplot(122);subimage(I6);title('仿射变换后图像');axis on;%透视投影变换udata=[0 1];vdata=[0 1]; %坐标系统tform2=maketform('projective',[0 0;1 0;1 1;0 1],[-4 2;-8 -3;-3 -5;6 3]);[I7,xdata,ydata]=imtransform(I,tform2,'bicubic','udata',udata,...'vdata',vdata,'size',size(I),'fill',128); figure;subplot(121);subimage(udata,vdata,I);title('原图像');axis on;subplot(122);subimage(xdata,ydata,I7);title('透视投影变换后图像');axis on; %-----------------------------------------------------------------------------------------% (2)实验结果与分析:%原尺寸图像%1.3倍尺寸图像%0.6倍尺寸图像%旋转(切割&不切割)图像%图像剪切交互式地剪切图像结果%仿射变换%透视投影变换6、视频处理(创建A VI视频)(1)程序:%-------------------------------生成40张bmp图片----------------------------------%t = linspace(0,2.5*pi,40);fact = 10*sin(t);fig=figure;[x,y,z] = peaks;for k=1:length(fact)h = surf(x,y,fact(k)*z);axis([-3 3 -3 3 -80 80])axis offcaxis([-90 90])F = getframe(fig);% 生成文件名,共同的文件名为HMXfname = strcat(num2str(k),'HMX.bmp');% 存储图片imwrite(F.cdata,fname)endclose(fig)%--------------------------------------------------------------------------------------------%%------------- ---------------- bmp图像转为avi视频--------------------------------%%调用bmp2avi子函数,将共同文件名为HMX的图片作为每帧图片组合成avi文件%起始帧为1,终止帧为40,avi文件名为HMX_TEST.avibmp2avi(1,40,'HMX.bmp','HMX_TEST.avi')%--------------------------------------------------------------------------------------------%%---------------------------------- bmp2avi子函数-------------------------------------% function bmp2avi(framestart,frameend,sourcefile,aviname)% 参数说明% framestart:起始帧% frameend:终止帧% sourcefile:BMP的共同文件名% aviname:AVI文件名% 创建A VI,并设置参数aviobj = avifile(aviname);aviobj.quality = 100;pression = 'None';% 将BMP文件转为A VIfor i = framestart:frameendfname = strcat(num2str(i),sourcefile);adata = imread(fname);aviobj = addframe(aviobj,uint8(adata));endaviobj = close(aviobj);%--------------------------------------------------------------------------------------------%(2)实验结果与分析:%40张BMP图片生成结果图片1HMX~图片40HMX%生成的A VI文件(保存在matlab默认路径下)%视频播放结果7、图像变换(傅立叶变换、余弦变换、小波变换)(1)程序:%---------------------------------图像变换-----------------------------------% clc,clear all,close all,echo off;%--------------------------傅里叶变换--------------------------%%图像文件的读操作I=imread('cameraman','tif');%转换为双精度浮点型I=im2double(I);%显示原图像figure;subplot(131);imshow(I);title('原图像');%二维傅里叶变换F1=fft2(I);%显示不进行零频调整的傅里叶谱图像subplot(132);imshow(log(1+abs(F1)),[]);title('傅里叶谱');%将二维傅里叶变换的零频率由左上角移到频谱中心FC1=fftshift(F1);%显示进行零频调整的傅里叶谱图像subplot(133);imshow(log(1+abs(FC1)),[]);title('傅里叶谱(中心化)');%----------------------------------------------------------------%%--------------------------余弦变换--------------------------%clc,clear all,echo off;%图像文件的读操作I=imread('cameraman','tif');%转换为双精度浮点型I=im2double(I);%显示原图像figure;subplot(121);imshow(I);title('原图像');%离散余弦变换J=dct2(I);%显示DCT系数图subplot(122);imshow(log(abs(J)),[]);title('DCT系数');%-------------------------------------------------------------------%%----------------------------小波变换----------------------------%clc,clear all,echo off;%图像文件的读操作I=imread('cameraman','tif');[cA1,cH1,cV1,cD1]=dwt2(I,'bior3.7');A1=upcoef2('a',cA1,'bior3.7',1);H1=upcoef2('h',cH1,'bior3.7',1);V1=upcoef2('v',cV1,'bior3.7',1);D1=upcoef2('d',cD1,'bior3.7',1);figure;subplot(221);image(wcodemat(A1,192));title('近似值系数A1');subplot(222);image(wcodemat(H1,1000));title('近似值系数H1');subplot(223);image(wcodemat(V1,1000));title('近似值系数V1');subplot(224);image(wcodemat(D1,1000));title('近似值系数D1');%---------------------------------------------------------------------------------------%(2)实验结果与分析:%傅里叶变换下图为原图像,未中心化的傅里叶谱和中心化的傅里叶谱%余弦变换%小波变换8、图像特征提取(纹理特征、形状特征)(1)程序%--------------------------------图像特征提取--------------------------------% %------------------直方图统计特征---------------------%clc,clear,close all;%图像文件的读操作I=imread('cameraman.tif');%显示原图像figure;subplot(131);imshow(I);title('原图像');%std为2D的标准差函数fun=@std2;%按8*8分块处理text1=blkproc(I,[8,8],fun);text=imresize(text1,[256,256],'bicubic');subplot(132);imshow(text,[]);title('8*8std');%按4*4分块处理text2=blkproc(I,[4,4],fun);text=imresize(text2,[256,256],'bicubic');subplot(133);imshow(text,[]);title('4*4std');%------------------------------------------------------------%%----------------------自相关函数-----------------------%clc,clear all;%图像文件的读操作I=imread('lenahui.jpg');%显示原图像figure; imshow(I);title('原图像');%设置偏移量shiftx=5;shifty=5;%调用自相关函数子函数C=autocorcoeficient(I,shiftx,shifty)%-----------------------------------------------------------%%-------------------字符质心标记----------------------%clc,clear all;%图像文件的读操作I=imread('text.png');H=rgb2gray (I);figure;imshow(H);%标记每个4连通的组件L=bwlabel(H,4);%显示标记的图像figure;imshow(L,[]);colormap('colorcube');%计算每个区域的质心s=regionprops(L,'centroid');centroids=cat(1,s.Centroid);figure;imshow(H);hold on;plot(centroids(:,1),centroids(:,2),'b*');hold off;%-------------------------------------------------------------------------------%%--------------------自相关函数子函数----------------------%function [c]=autocorcoeficient(A,shiftx,shifty)%参数说明%A:计算自相关函数的图像%shiftx:x方向的偏移量% shifty:y方向的偏移量[M,N]=size(A);B=zeros(M+2*abs(shiftx),N+2*abs(shifty));A=double(A);B=double(B);%偏移量处理,超过图像范围之外的像素值为0B(abs(shiftx)+1+shiftx:abs(shiftx)+M+shiftx,abs(shifty)+1+shifty:abs(shifty)+N+shifty)=A;%计算自相关函数sum1=0;sum2=0;for i=1:Mfor j=1:Nsum1=sum1+A(i,j)*B(abs(shiftx)+i,abs(shifty)+j);sum2=sum2+A(i,j)*A(i,j);endendc=sum1/sum2;end%-------------------------------------------------------------------%(2)实验结果与分析:%原图像、压缩图像%用来计算自相关系数的图像当偏移量xshift=5,yshift=5时lena.jpg的自相关系数C=0.9431;当偏移量xshift=10,yshift=5时lena.jpg的自相关系数为C=0.9255;当偏移量xshift=10,yshift=10时lena.jpg的自相关系数为C=0.8952;可见偏移量越大自相关系数越小。