图像处理
一、实习任务
利用MATLAB里面的一些特定函数和GUI可视化图形界面设计一个属于自己的photoshop,使其完成简易的放大、缩小、截图以及直方图统计等功能。
二、实习内容
1、布局设计
2、程序设计 %文件打开
[name,path]=uigetfile({\'*.*\';\'*.bmp\';\'*.tif\';\'*.png\';\'*.gif\';\'*.jpg\'},\'载入图像\'); if isequal(name,0)|isequal(path,0) errordlg(\'没有选中文件\',\'出错\'); return; else x=imread([path,name]); axes(handles.axes1); imshow(x); handles.img=x; handles.noise_img=x; guidata(hObject,handles) end
%文件保存
[filename,pathname] = uiputfile({\'*.*\';\'*.bmp\';\'*.tif\';\'*.png\';\'*.gif\';\'*.jpg\'},\'图片保存为\'); if isequal([filename,pathname],[0,0]) errordlg(\'没有保存\',\'出错\'); return; else file=strcat(pathname,filename); (handles.axes2); i=getimage(gca); imwrite(i,file); end
%文件退出 clc; close all; close(gcf);
%灰度处理
axes(handles.axes2); if isrgb(handles.img) y=rgb2gray(handles.img); %RGB•••••••••• imshow(y); else msgbox(\'这已经是灰度图像\',\'转换失败\'); end %截图
set(handles.axes2,\'HandleVisibility\',\'ON\'); axes(handles.axes2); y=imcrop(handles.img); imshow(y); handles.Timage=y;
%双线性缩小
axes(handles.axes2); prompt={\'输入放大倍数:\'}; defans={\'0.2\'}; p=inputdlg(prompt,\'输入放大倍数\',1,defans); p1=str2num(p{1}); y=imresize(handles.img,p1,\'bilinear\'); %法缩小 imshow(y);
%双线放大
axes(handles.axes2); prompt={\'输入放大倍数:\'}; defans={\'2\'}; p=inputdlg(prompt,\'输入放大倍数\',1,defans); p1=str2num(p{1}); y=imresize(handles.img,p1,\'bilinear\'); %值法放大 imshow(y);
%上下翻转
最近邻插值最近邻插axes(handles.axes2); x=(handles.img); if isrgb(handles.img) for k=1:3 y(:,:,k)=flipud(x(:,:,k));%上下翻转函数 end imshow(y); else x=(handles.img); y=flipud(x); imshow(y); end
%左右翻转
axes(handles.axes2); if isrgb(handles.img) x=(handles.img); for k=1:3 y(:,:,k)=fliplr(x(:,:,k));%左右翻转函数 end imshow(y); else x=(handles.img); y=fliplr(x); imshow(y); end
%左转90度
axes(handles.axes2); x=(handles.img); y=imrotate(x,90); imshow(y);
%右转90度
axes(handles.axes2); x=(handles.img); y=imrotate(x,-90); imshow(y);
%任意角度旋转 axes(handles.axes2); prompt={\'输入参数1:\'}; defans={\'30\'}; p=inputdlg(prompt,\'输入参数\',1,defans); p1=str2num(p{1}); y=imrotate(handles.img,p1); imshow(y);
%亮度处理
prompt={\'输入参数1\',\'输入参数2\',\'输入gamma\'}; defans={\'[0 0.7]\',\'[0 1]\',\'1\'}; p=inputdlg(prompt,\'输入参数\',1,defans); p1=str2num(p{1}); p2=str2num(p{2}); p3=str2num(p{3}); gamma=p3; x=(handles.img); y=imadjust(x,p1,p2,gamma); axes(handles.axes2); imshow(y); %G直方图
set(handles.axes2,\'HandleVisibility\',\'ON\'); axes(handles.axes2); if isrgb(handles.img) x=imhist(handles.img(:,:,2)); %直方图统计 x1=x(1:10:256); horz=1:10:256; bar(horz,x1); set(handles.axes2,\'xtick\',0:50:255); else msgbox(\'这是灰度图像\',\'旋转失败\'); end %R直方图
set(handles.axes2,\'HandleVisibility\',\'ON\'); axes(handles.axes2); x=imhist(handles.img(:,:,1)); %统计
x1=x(1:10:256); horz=1:10:256; bar(horz,x1); set(handles.axes2,\'xtick\',0:50:255); %B直方图
set(handles.axes2,\'HandleVisibility\',\'ON\'); axes(handles.axes2); if isrgb(handles.img)
直方图x=imhist(handles.img(:,:,3)); %直方图统计
x1=x(1:10:256); horz=1:10:256; bar(horz,x1); %axis([0 255 0 150000]); set(handles.axes2,\'xtick\',0:50:255); %set(handles.axes2,\'ytick\',0:2000:15000); else msgbox(\'这是灰度图像\',\'旋转失败\'); end
%直方图均衡
set(handles.axes2,\'HandleVisibility\',\'ON\'); axes(handles.axes2); if isrgb(handles.img) a=histeq(handles.img(:,:,1)); b=histeq(handles.img(:,:,2)); c=histeq(handles.img(:,:,3)); k(:,:,1)=a; k(:,:,2)=b; k(:,:,3)=c; imshow(k); else h=histeq(handles.img); %直方图均衡 imshow(h); end
3、效果图
三、遇到的问题及解决方法
1、遇到的问题
最开始在Command里面用imread打开图片是可行的,但到了GUI里面之后,会出现一些错误,主要就是提示说:找不到对应的地方。还有就是在编写完程序之后,放大感觉没有任何变化。
2、解决方法
在查询资料后发现,在GUI里面打开图片是需要编写图片的地址以及格式的,要先判断你要操作的图片是否存在,如果不存在,应该提示你不存在的错误;在不能放大这个问题上,后来发现是axes2不够大,也就是画布不够大,再放大了画布后,放大就明显多了,缩小的时候也是这样。
四、主要收获和心得体会
在俩周的自动化软件实训里面,最大的感触就是MATLAB很强大,不但可以用自己自带的函数,还可以和C语言Java等语言连接共用,在处理图像上有自己独特的优势,在编辑菜单之后再进行相应的编程,做出来的界面和网页一样好看,这俩周特别快,不过收获很多,在很大程度上锻炼了我们的设计能力。