当前位置:文档之家› MATLAB程序大全

MATLAB程序大全

1.全景图到穹景图这个程序我最初是用FreeImage写的,这两天改成了matlab,再不贴上来,我就要忘了。

看到一篇文章有这样的变换,挺有意思的,就拿来试了一下,文章点此。

全景图到穹顶图变换,通俗的说就是将全景图首尾相接做成一个圆环的样子。

先看下面这图:下面的矩形就是我们要处理的全景图,上面的矩形是变换后的图像。

下面图像的底边对应穹顶图的圆,顶边对应穹顶图的外圆,当然,反过来也是可以的。

程序流程:1.定义穹顶图圆和外圆的半径,变换后的像素就填充在这个外半径的圆环中。

2.遍历穹顶图,当所处理当前像素位于圆环,则通过极坐标反变换去全景图中寻找相应位置的像素进行填充。

3.遍历完图像就行了。

用的技巧和图像旋转或放大缩小都是类似的。

处理结果:原图:结果:matlab代码如下:clear all;close all;clc;img=imread('pan.jpg');imshow(img);[m,n]=size(img);r1=100; %环半径r2=r1+m; %外环半径imgn=zeros(2*r2,2*r2);[re_m,re_n]=size(imgn);for y=1:re_mfor x=1:re_ndis_x=x-re_n/2;dis_y=y-re_m/2;l=sqrt(dis_x^2+dis_y^2);if l<=r2 && l>=r1theta=0;if y>re_m/2theta=atan2(dis_y,dis_x);endif y<re_m/2theta=pi+atan2(-dis_y,-dis_x);endif y==re_m/2theta=atan2(dis_y,dis_x)+0.0001;endxx=ceil(n*theta/(2*pi));yy=ceil(l-r1);if yy>=1 && yy<=m && xx>=1 && xx<=nimgn(y,x)=img(yy,xx);endendendendfigure;imshow(imgn,[])最后要说的是,一般我们要是有一全景图,通常会用cubic映射,将图像变换为立方体的六个面,然后通过图形学方法贴到立方体上,就能做出类似谷歌街景的样子。

cubic映射应该才是全景图最常用的处理方法,不过那又是另一类变换了。

2.GUI保存图像% --- Executes on button press in pushbutton5.function pushbutton5_Callback(hObject, eventdata, handles)% hObject handle to pushbutton5 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global src_img;[filename,pathname] = uiputfile({'*.jpg';'*.bmp';'*.gif';'*.png';'*.tif'}, 'Write Pic');str=[pathname filename];if str~=0imwrite(src_img,str);end3.GUI读入图像% --- Executes on button press in pushbutton1.function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)[filename,pathname] = uigetfile({'*.*';'*.jpg';'*.bmp';'*.gif';'*.png';'*.tif'},'Read Pic'); str = [pathname filename];global src_img;if ~isequal([pathname,filename],[0,0])src_img = imread(str);axes(handles.axes1);imshow(src_img);end4. GUI选项卡1.在这个网址下载一个工具包,里面应该有四个文件:tabselectionfcp.p、tabselectionfcn.m、tabpanel.p和tabpanel.m,显然代码用.p格式进行加密了。

2.建立一个空GUI文件,就起名kong.fig吧。

3.在kong.fig上画一个Static Text,默认的tag为text1。

4.终端运行tabpanel('kong.fig','text1');命令,得到如下界面:5.点击add panel就能添加选项卡了,如图:6.选中不同的选项卡,点击edit,就能进入常见的GUI编辑模式:7.编辑完保存下就行了,所有的功能都在kong.m文件中实现。

注意,不同选项卡添加的组建时,tag会有重复,因此需要修改tag名。

8.终端输入kong就能得到如下结果:5. structure tensor结构量根据结构量能区分图像的平坦区域、边缘区域与角点区域。

此算法也算是计算机科学最重要的32个算法之一了。

的文章中此算法名称为Strukturtensor 算法,不过我搜索了一下,Strukturtensor这个单词好像是德语,翻译过来就是structure tensor结构量了。

此处所说的量不是相对论或黎曼几何里的量,黎曼几何的量好多论文都叫量场了。

也不是数学界还没研究明白的对矩阵进行扩展的高阶量,主要是量分解。

这里的结构量就是一个矩阵,一个对图像像素进行组织的数据结构而已。

像素组织而成的矩阵如下:这个公式太常见了,在harris角点检测中就用到了。

其中Ix,Iy就是原对原图像在x和y方向求得的偏导。

然后求矩阵E的行列式K和迹H。

然后根据K和H的关系就能区分图像的区域模式了。

模式分以下三类:平坦区域:H=0;边缘区域:H>0 && K=0;角点区域:H>0 && K>0;harris角点检测就用到了第三类判断。

当然,在实际应用的时候H和K的值肯定都不会是理想,所以我用的都是近似判断。

处理结果如下:原图:平坦区域:边缘区域:角点区域(好像也不全角点,求角点还是harris好了):结构量行列式与迹的关系:其中红框为平坦区域,黄框为边缘区域,铝框为角点区域。

matlab代码如下:clear all; close all; clc;img=double(imread('lena.jpg'));[m n]=size(img);imshow(img,[])[Ix Iy]=gradient(img);Ix2=Ix.^2;Iy2=Iy.^2;Ixy=Ix.*Iy;k=1;lambda=zeros(m*n,2);for i=1:mfor j=1:nst=[Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; %结构量K=det(st); %求行列式H=trace(st); %求迹%所有的判断都是近似的% if H<50%认为是平坦区域% if H>50 && abs(K)<0.01*10^(-9) %认为是边缘区域if H>50 && abs(K)>0.01*10^(-9) %认为是角点区域img(i,j)=255;endlambda(k,:)=[K H];k=k+1;endendfigure;plot(lambda(:,1),lambda(:,2),'.');ylabel('trace');xlabel('det');figure;imshow(img,[])6.模糊集图像增强算法有很多变种。

不过主要就是以下三步。

1.设计隶属度函数将图像从空间域变换到模糊集域。

2.设计模糊增强算子,在模糊集域对图像进行处理。

3.根据第1步的隶属度函数重新将图像从模糊集域变换到空间域。

这和频域处理中的变换反变换不是很像么。

我使用的隶属度函数和模糊增强算子在这篇论文里,也算相关算法的经典论文了。

处理结果如下:原图:模糊集增强后:matlab代码如下:clear all; close all; clc;img=double(imread('lena.jpg'));imshow(img,[])[m n]=size(img);Fe=1;%控制参数Fd=128;xmax=max(max(img));u=(1+(xmax-img)/Fd).^(-Fe); %空间域变换到模糊域%也可以多次迭代for i=1:m %模糊域增强算子for j=1:nif u(i,j)<0.5u(i,j)=2*u(i,j)^2;elseu(i,j)=1-2*(1-u(i,j))^2;endendendimg=xmax-Fd.*(u.^(-1/Fe)-1); %模糊域变换回空间域figure;imshow(uint8(img));7.随机游走图像随机游走类似布朗运动,就是随机的向各个方向走吧。

虽然代码没什么技术含量,不过产生的图像实在太漂亮了,所以还是贴上来吧。

产生的图像:matlab代码如下:clear all;close all;clcn=70000; %游走的步数。

也是图像中像素个数,有些位置可能重复,所以白像素小于等于nx=0; %初始x坐标y=0; %初始y坐标pix=zeros(n,2); %游走产生的像素坐标neighbour=[-1 -1;-10;-11;0 -1;01;1 -1;10;11]; %当前像素邻域for i=1:nr=floor(1+8*rand()); %八邻域随机选一个来走y=y+neighbour(r,1); %y方向游走x=x+neighbour(r,2); %x方向游走pix(i,:)=[y x]; %保存坐标endminy=min(pix(:,1)); %图像坐标不可能为负,所以找最小值再整体提升为正minx=min(pix(:,2)); %同上pix(:,1)=pix(:,1)-miny+1; %像素坐标整体变为正pix(:,2)=pix(:,2)-minx+1;maxy=max(pix(:,1)); %找最大坐标值,为开辟图像做准备maxx=max(pix(:,2));img=zeros(maxy,maxx); %根据maxy、maxx产生图像for i=1:n %将游走的值赋给图像img(pix(i,1),pix(i,2))=1;endimshow(img)8.最大流/最小割学习这个算法是为学习图像处理中的图割算法做准备的。

相关主题