基于matlab哈哈镜制作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机视觉课程设计实验报告

一、题目:哈哈镜的制作

三、实验目的:

1、掌握几何变换的原理。

2、读入待制作的图片,实现图片的缩小放大、水平外凹、水平外凸、梯形变形、三角形,S 形和波浪型。

四、实验原理:

变形处理整体都是一个思路,把原图每一行经过缩放拷到新图的相应行。

每次变形都是在原图的基础上,根据想要变换的图象形状,计算出每一行的起始位,再计算出每一行新的总长度。

1)对于放大、缩小可以根据最近邻插值或者双线性插值来进行变化,放大我们采用了双线性方法,缩小采用了最近邻插值方法。

2)对于水平内凹和水平外凸,以周期为2倍高度的正弦函数来进行变化,变化后远图象的高度坐标不变,宽度坐标以一定比例变化。

3)对于三角形和梯形,原图象高度坐标不变,宽度坐标以线性来进行变化。

4)对于宽度不变的变形,如波浪形,直接一次变形拷贝一整行。对于高度不变的图形,如S形,也可以用这个方法,或者说是把起始点确定后,将坐标点进行平移。

5)除放大效果外,缩小、水平外凹、水平外凸、梯形变形、三角形,S形和波浪型均采用最近邻插值方法进行变化。

五、实验步骤(附程序主代码):

1、打开图象

clear;clc; %清空工作空间

[filename,pathname]=uigetfile({'*.*','All Files(*.*)'});

file=fullfile(pathname,filename);

t1=imread(file);

t2=rgb2gray(t1); %将打开的彩色图像转换为灰度图

imshow(t2)

save temp t2;

2、缩小

load temp t2 %加载打开的图片

[m,n]=size(t2);

x2=double(t2);

for i=1:m

for j=1:n

w=round(i*0.5); %宽度缩小为原来一半

h=round(j*0.5); %高度缩小为原来一半

x3(w,h)=x2(i,j); %最近邻插值,象素值赋给新的图象

end

end

figure,imshow(mat2gray(x3))

3、放大

x3=zeros(fix(m*2),fix(n*2)); %开辟空间

for i=2:fix((m-1)*2)

for j=2:fix((n-1)*2)

p=fix(i/2);

q=fix(j/2);

x3(i,j)=[x2(p+1,q)-x2(p,q)]*(i/2-fix(i/2))+[x2(p,q+1)-x2(p,q)]*(j/2-

fix(j/2))+[x2(p+1,q+1)+x2(p,q)-x2(p,q+1)-x2(p+1,q)]*(i/2-fix(i/2))*

(j/2-fix(j/2))+x2(p,q); %双线性插值

end

end

4、水平内凹

t3(m,n)=0; %开辟新图象空间

for i = 1:m

a = (2*pi/m)*i; %i转化为弧度形式

p=round(abs(30*sin(a/2))+0.5);

q=round(-abs(30*sin(a/2))-0.5); % 正弦函数变换,周期为2M

for j=p:q+n

x=i; %变化后高度坐标不变

y=round((j-p)*n/((q+n-p+1))); %宽度坐标以(j-p)*n/((q+n-p+1)))比例变化 if (x>0&&x<=m) &&(y>0&&y<=n)

t3(i,j)=t2(x,y);

else

t3(i,j)=255;

end

end

end

5、水平外凸

a=round(sin(pi/2));

t3(m,n+2*a)=0;

grade=50;

for i =1:m

b =2*pi/m*i; %i转化为弧度形式

j1=round(abs(sin(2*pi-b/2)*grade+grade)+0.5);

j2=round(sin(b/2)*grade-grade-0.5); % 正弦函数变换,周期为2M

for j=j1:j2+n

x=i; %变化后高度坐标不变

y=round((j-j1)*n/((j2+n-j1+1))); %宽度坐标以(j-j1)*n/((j2+n-j1+1))比例变化 if (x>0&&x<=m) &&(y>0&&y<=n)

t3(i,j)=t2(x,y);

else

t3(i,j)=255;

end

end

end

6、梯形

prompt={'please input p:'};

title='请输入上底缩放比例:';

lines=1;

def={'0.5'}; %默认上底缩放比例值

p=inputdlg(prompt,title,lines,def); %对话框输入上底缩放比例 p=str2double(p);

prompt={'please input q:'};

title='请输入下底缩放比例:';

lines=1;

def={'0.8'}; %默认下底缩放比例值

q=inputdlg(prompt,title,lines,def); %对话框输入下底缩放比例 q=str2double(q);

n1=round(n*p+0.5);

n2=round(n*q+0.5);

sd=min(n1,n2); %短底

xd=max(n1,n2); %长底

t3 = zeros(m,xd);

bi=abs(n2-n1)/2/m;%斜率

for i = 1:m

if n1

a=round((m-i+1)*bi+0.5);%缩进长度

newx=sd+2*i*bi;%变化后的下底的长度

else

a=round((i-1)*bi+0.5);

newx=xd-2*i*bi;%变化后的下底的长度

end

for j=a:a+round(newx+0.5)

x=i;

y=round((j-a)*n/newx);

if (x>0&&x<=m) &&(y>0&&y<=n)

t3(i,j)=t2(x,y);

else

t3(i,j)=255;

end

end

end

7、三角形

t3(m,n)=0;

for i=1:m

for j=1:round(i*n/m)

x=i; %高度坐标不变

相关文档
最新文档