matlab高级编程与应用-图像处理实验报告

上传人:xins****2008 文档编号:116479448 上传时间:2019-11-16 格式:DOCX 页数:32 大小:2.09MB
返回 下载 相关 举报
matlab高级编程与应用-图像处理实验报告_第1页
第1页 / 共32页
matlab高级编程与应用-图像处理实验报告_第2页
第2页 / 共32页
matlab高级编程与应用-图像处理实验报告_第3页
第3页 / 共32页
matlab高级编程与应用-图像处理实验报告_第4页
第4页 / 共32页
matlab高级编程与应用-图像处理实验报告_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《matlab高级编程与应用-图像处理实验报告》由会员分享,可在线阅读,更多相关《matlab高级编程与应用-图像处理实验报告(32页珍藏版)》请在金锄头文库上搜索。

1、图像处理实验报告自03 张驰昱 2010012028一、 基础知识(a) 以测试图像的中心为圆心,图像的长和宽中较小值的一半为半径画一个红颜色的圆问题分析:构造一个与原图像大小相同的矩阵并按照要求在矩阵中“画”出形状,然后点乘原图像矩阵就可以了。新的构造矩阵在需要保留原图像的地方须置为1。具体实现: load(hall.mat);hall=im2double(hall_color); %把8位无符号整形线性转化为0到1之间的数xx,yy,=size(hall); %得到图像长宽R=min(xx,yy)/2; %设半径R为长宽中的较小值的一半circle=ones(xx,yy); %申请一个与原

2、图像相同大小的1矩阵r=0:2*pi/400:2*pi; %一个完整圆周的弧度向量x=floor(xx/2+1+R*cos(r); %完整圆周的x坐标向量y=floor(yy/2+1+R*sin(r); %完整圆周的y坐标向量,配合之前x坐标值就是圆周坐标了circle(xx*(y-1)+x)=0; %设圆周上每个坐标点的值为0,至此一个画着黑圆的矩阵构造完成%下面是把这个构造好的矩阵点乘原图像矩阵,再在R层矩阵加上一个“白圆矩阵”就是红圆了hall_color_a(:,:,1)=hall(:,:,1).*circle+circle; hall_color_a(:,:,2)=hall(:,:,

3、2).*circle;hall_color_a(:,:,3)=hall(:,:,3).*circle;imwrite(hall_color_a,hall_color_a.jpg,JPEG);代码优化:本题花了我一点脑筋把整个圆周的矩阵坐标构造的两个向量中去,免去了循环,大大提高程序效率,基本是瞬间运行完成。运行结果:(b) 将测试图像涂成国际象棋状的“黑白格”的样子,其中“黑”即黑色,“白”则意味着保留原图。问题分析: 继续前面的构造新矩阵点乘原图像矩阵的思想。我用零矩阵和一矩阵拼出一个大的棋盘矩阵。0元素的地方就是涂黑。具体实现:load(hall.mat);hall=im2double(h

4、all_color); %把8位无符号整形线性转化为0到1之间的数xx,yy,=size(hall); %得到图像长宽x0=xx/8;y0=yy/8; %每个小格的长宽,除以8是因为棋盘是8x8的a=ones(x0,y0),zeros(x0,y0); %黑与白是棋盘的基本单元,黑与白即0和1chess=repmat(a;fliplr(a),4,4); %拼接加重复,很容易构造出一个棋盘型的01矩阵hall_color_b(:,:,1)=hall(:,:,1).*chess; %RGB三层都乘上这个棋盘矩阵hall_color_b(:,:,2)=hall(:,:,2).*chess;hall_c

5、olor_b(:,:,3)=hall(:,:,3).*chess;imwrite(hall_color_b,hall_color_b.jpg,JPEG);代码优化:这道问题的逻辑并不复杂,但是我始终想用矩阵做进一步简化,脱离一个个数值判断再运算的苦海。这个程序我简化了很多遍,一遍遍的优化逻辑和循环,最后发现这个二维加判断的问题在matlab中可以一层循环都不用,程序效率极高,也是瞬间运行完成。运行结果:二、 图像压缩编码(1) 图像的预处理是将每个像素灰度值减去128 ,这个步骤是否可以在变换域进行?请在测试图像中截取一块验证你的结论。问题分析:可以。DCT变换就是矩阵乘法,矩阵乘法有分配率,

6、先乘再加和先加再乘是一样的。具体实现:clear;clc;load hall.mat;load JpegCoeff.mat;%文件读入过程在以下代码展示中均省略,因为都一样s=hall_gray(1:8,1:8); %取一小块c1=dct2(s-128); %先减再变换c2=dct2(s)-dct2(128*ones(8,8); %先变换再减err1=c1-c2 %差值运行结果:差值err1是10-12量级的,可以忽略(2) 请编程实现二维DCT ,并和MATLAB 自带的库函数dct2比较是否一致问题分析:一维DCT变换如下:二维情况只要再右乘转置矩阵即可:C=DPTDT所以问题的关键即构造

7、D矩阵,而D矩阵可以用kron函数快速构造出。具体实现:function c=my_dct2(p)N,=size(p);D(1,:)=ones(1,N)/(N0.5); %第一行要分开构造D(2:N,:)=(2/N)0.5*cos(pi/2/N*kron(1:N-1,1:2:2*N-1);c=D*double(p)*D; %注意p是无符号整型的,转成double型才能正常进行浮点运算end代码优化:用kron免去了用循环语句构造矩阵的麻烦。运行结果:仍然用之前的小块s=hall_gray(1:8,1:8);去检验误差err2=dct2(s)-my_dct2(s),差值仍然是是10-12量级的,

8、可以忽略。我查看了matlab自带的dct2函数,发觉它是套用了一维dct实现二维dct的,其中有这样一条语句:b = dct(dct(arg1).).(3) 如果将DCT 系数矩阵中右侧四列的系数全部置零,逆变换后的图像会发生什么变化?选取一块图验证你的结论。如果左侧的四列置零呢?问题分析:DCT系数的右侧四列为高频分量,置零后对原图像影响不大,指示稍稍模糊点而已,但是左侧四列低频分量置零的话,图像的整体色调都变了,差别会较大。具体实现:s=hall_gray(1:100,1:100);c5=dct2(s); %先分别变换c6=dct2(s);c5(:,97:100)=0; %右四列置零c6

9、(:,1:4)=0; %左四列置零hall_gray_1=uint8(idct2(c5); %分别逆变换,注意转回无符号整型hall_gray_2=uint8(idct2(c6);figure(1);subplot(1,3,1),imshow(s);title(origin);subplot(1,3,2),imshow(hall_gray_1);title(zero right four);subplot(1,3,3),imshow(hall_gray_2);title(zero left four);运行结果:右四列置零几乎无变化,左四列清零后图像整体变暗,与预期相符。(4) 若对DCT 系

10、数分别做转置、旋转90 度和旋转180 度操作,逆变换后恢复的图像有何变化?选取一块图验证你的结论问题分析:DDT=1,C=DPDTDCTDT=D(DPDT)TDT=DDTPTDDT=PT即DCT系数转置后做逆变换的结果是图像的转置原图像DCT系数矩阵左上方的元素值较大,旋转90度后会到矩阵左下方,由图2.5可知,条纹状分量会增多。旋转180度后,DCT系数矩阵右下方的元素值增大,由图2.5可知,点格状分量会增多。具体实现:s=hall_gray(1:100,1:100);c7=dct2(s); %转置c8=rot90(dct2(s); %旋转90度c9=rot90(c8); %再旋转90度,

11、即180度hall_gray_3=uint8(idct2(c7); %分别逆变换hall_gray_4=uint8(idct2(c8);hall_gray_5=uint8(idct2(c9);figure(2);subplot(2,2,1),imshow(s);title(origin);subplot(2,2,2),imshow(hall_gray_3);title(transpose);subplot(2,2,3),imshow(hall_gray_4);title(rot90);subplot(2,2,4),imshow(hall_gray_5);title(rot180);运行结果:与

12、预期相符(5) 如果认为差分编码是一个系统,请绘出这个系统的频率响应,说明它是一个(低通、高通、带通、带阻)滤波器。DC 系数先进行差分编码再进行熵编码,说明DC系数的_频率分量更多。问题分析:差分运算可表示为所以它的传递函数为1-z,是个高通滤波器,压缩编码为了压缩信息要先差分再编码,说明DC系数低频分量多,这也符合常理。具体实现:b=-1 1;figure(3);freqz(b,1);(6) DC 预测误差的取值和Category值有何关系?如何利用预测误差计算出其Category?问题分析:从表2.2中不难看出以下关系%c_e表示DC预测误差if(c_e=0) category=0;el

13、se category=floor(log2(abs(c_e)+1;end(7) 你知道哪些实现Zig-Zag 扫描的方法?请利用MATLAB的强大功能设计一种最佳方法。问题分析:我用了一种最费空间但也是最省时间的方法,即把8x8矩阵zigzag的路径写死到程序里,这样兼容性差一点,即只能算8x8矩阵,但逻辑简单。后来我查了一下,好像现实中的方法就是这样的。有些是先走“横”,有些是先走“竖”。我这里按照图2.6先走“横”。具体实现:(zigzag扫描为列矢量,方便后续的操作)function r=zigzag(a)z=1,9,2,3,10,17,25,18,11,4,5,12,19,26,33

14、,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;r=a(z);end运行结果:为了检查正确性,我按照zigzag的行走顺序又写了一个“路径标号”矩阵,如果输出的正好是顺序数值,则说明程序无误。a= 0,1,5,6,14,15,27,28;. 2,4,7,13,16,26,29,42;. 3,8,12,17,25,30,41,43;. 9,11,18,24,31,40,44,53;. 10,19,23,32,39,45,52,54;. 20,22,33,38,46,51,55,60;. 21,34,37,47,50,56,59,61;. 35,36,48,49,57,58,62,63;zigzag(a)结果顺序输出了0到63,说明程序正确。(8) 对测试图像分块、DCT 和量化,将量化后的系数写成矩阵的形式,其中每一列为一个块的DCT 系数Zig-Zag 扫描后形成的列矢量,第一行为各个块的DCT系数。具体实现:load hall.mat;load JpegCoeff.mat;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号