机器视觉课内实验.docx
《机器视觉课内实验.docx》由会员分享,可在线阅读,更多相关《机器视觉课内实验.docx(22页珍藏版)》请在冰豆网上搜索。
机器视觉课内实验
机器视觉课内实验报告
(4次)
学院:
自动化
班级:
智能
姓名:
学号:
实验一:
一种摄像机标定算法的编程实现………………………1
实验二:
图像预处理算法的编程实现……………………………8
实验三:
基于一阶微分算子的边缘检测…………………………14
实验四:
基于二阶微分算子的边缘检测…………………………17
《机器视觉》
课内实验报告
(1)
摄像机标定算法的编程实现
专业:
智能科学与技术
班级:
学号:
姓名:
实验时间:
实验一
MATLAB编程实现基于直接线性变换的摄像机标定方法
一、实验目的
掌握摄像机标定方法的原理,采用直接线性变换方法,通过MATLAB编程实现摄像机内参数和外参数的估计。
2、实验原理
摄像机标定是指建立摄像机图像像素位置与场景点位置之间的关系,其途径是根据摄像机模型,由已知特征点的图像坐标求解摄像机的模型参数。
直接线性变换是将像点和物点的成像几何关系在齐次坐标下写成透视投影矩阵的形式:
其中(u,v,1)为图像坐标系下的点的齐次坐标,(X,Y,Z)为世界坐标系下的空间点的欧氏坐标,P为3*4的透视投影矩阵,s为未知尺度因子。
消去s,可以得到方程组:
当已知N个空间点和对应的图像上的点时,可以得到一个含有2*N个方程的方程组:
三、实验步骤
1读取一幅图像并显示;
2检查内存(数组)中的图像;
3实现图像直方图均衡化;
4读取图像中像素点的坐标值;
5保存图像;
6检查新生成文件的信息;
7使用阈值操作将图像转换为二值图像;
8根据RGB图像创建一幅灰度图像;
9调节图像的对比度;
10在同一个窗口内显示两幅图像;
11掌握Matlab命令及函数,获取标定块图像的特征点坐标;
12根据DLT摄像机标定方法原理编写Matlab程序,估计摄像机内参数和外参数;
四、程序代码及实验结果显示
代码:
I=imread('C:
\Users\wwww\Desktop\12.jpg');
imshow(I);
whos
figure,
I1=rgb2gray(I);
figure,imshow(I1)
imhist(I1);
I2=histeq(I1);
figure,imshow(I2)
figure,imhist(I2)
a=imread('C:
\Users\wwww\Desktop\12.jpg');
imwrite(I1,'DSgray.jpg');
imwrite(I2,'DSgrayeq.jpg');
inf=imfinfo('C:
\Users\wwww\Desktop\12.jpg');
level=graythresh(I2);
bw=im2bw(I2,level);
figure,imshow(bw)
whos
I3=imadjust(I2,stretchlim(I2),[01]);
figure,imshow(I3);
a=imread('C:
\Users\wwww\Desktop\12.jpg');
b=imread('DSgray.jpg');
subplot(1,2,1),imshow(a);
subplot(1,2,2),imshow(b);
clear;
xpot=[];
ypot=[];
imshow('C:
\Users\wwww\Desktop\12.jpg');
holdon;
n=input('Pleaseinputthenumberofpot:
');
fori=1:
n
[x,y]=ginput
(1);
plot(x,y,'or');
text(x+1,y+1,num2str(i));
xpot=[xpot,x];
ypot=[ypot,y];
end
[xpot;ypot]
[xw;yw;zw]
a=[xw',yw',zw',ones([1001]),zeros([1004]),(-1)*xpot'.*xw',(-1)*xpot'.*yw',(-1)*xpot'.*zw',-1*xpot';zeros([1004]),xw',yw',zw',ones([1001]),(-1)*ypot'.*xw',(-1)*ypot'.*yw',(-1)*ypot'.*zw',-1*ypot'];
c=a(:
1:
11);
b=a(:
12);
l=(-1)*(c'*c)^(-1)*c'*b;
显示两幅图
对比度调节
均衡化直方图
灰度图
直方图
二进制图
图片信息:
名称:
12.jpg
项目类型:
JPG图像
文件夹路径:
C:
\Users\wwww\Desktop
创建日期:
2017年11月6日,星期一13:
16
修改日期:
2017年11月6日,星期一13:
16
大小:
111KB
分辨率:
1024x638
宽度:
1024像素
高度:
638像素
水平分辨率:
72dpi
垂直分辨率:
72dpi
位深度:
24
检查内存中的图像:
NameSizeBytesClassAttributes
I638x1024x31959936uint8
ans2x15240double
i1x18double
n1x18double
x1x18double
xpot1x15120double
y1x18double
ypot1x15120double
NameSizeBytesClassAttributes
I638x1024x31959936uint8
I1638x1024653312uint8
I2638x1024653312uint8
a638x1024x31959936uint8
ans2x15240double
bw638x1024653312logical
i1x18double
inf1x142720struct
level1x18double
n1x18double
x1x18double
xpot1x15120double
y1x18double
ypot1x15120double
Pleaseinputthenumberofpot:
10
ans=
550.3592391.7113261.9085521.5141838.8099921.7394211.4296117.6831770.3028957.7958
463.7254308.6831146.4296160.8521283.4437492.5704460.1197247.3873113.9789157.2465
五、实验心得
《机器视觉》
课内实验报告
(2)
图像预处理算法的编程实现
专业:
智能科学与技术
班级:
学号:
姓名:
实验时间:
实验二:
图像预处理算法的编程实现
一、实验目的
掌握图像预处理的基本方法及其主要思想,编程实现直方图均衡化、直方图规定化和图像的锐化处理。
2、实验原理
(1)直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了像素灰度值的动态范围,从而可达到增强图像整体对比度的效果。
直方图均衡化是灰度变换的一个重要应用,广泛应用在图像增强处理中,它是以累计分布函数变换为基础的直方图修正法之一,可以产生一幅灰度级分布具有均匀概率密度的图像,扩展了像素的取值动态范围。
若像素点的原灰度为R,变换后的灰度为S,需要注意的是R、S是归一化后的灰度值,其灰度变换函数T(R)为:
式中,
是第j级灰度值的概率,
是图像中j级灰度的像素总数,
是图像中灰度级的总数目,
是图像中像素的总数。
对变换后的S值取最靠近的一个灰度级的值,建立灰度级变换表,将原图像变换为直方图均衡的图像。
(2)直方图规定化是能够有目的地增强某个灰度区间的图像,即能够人为地修正直方图的形状,使之与期望的形状相匹配。
换句话说,希望可以人为地改变直方图形状,使之成为某个特定的形状,直方图规定化就是针对上述要求提出来的一种增强技术,它可以按照预先设定的某个形状来调整图像的直方图。
直方图规定化是在运用均衡化原理的基础上,通过建立原始图像和期望图像之间的关系,选择地控制直方图,使原始图像的直方图变成规定的形状,从而弥补了直方图均衡不具备交互作用的特性。
(3)图像锐化是一种补偿轮廓、突出边缘信息以使图像更为清晰的处理方法。
为了要把图像中间任何方向伸展的边缘和轮廓线变得清晰,我们希望对图像的某种运算是各向同性的。
可以证明偏导平方和的运算是各向同性的,即:
式中
是图像旋转前的坐标,
是图像旋转后的坐标。
梯度运算就是在这个式子的基础上开方得到的。
图像(x,y)点的梯度值:
为了突出物体的边缘,常常采用梯度值的改进算法,将图像各个点的梯度值与某一阈值作比较,如果大于阈值,该像素点的灰度用梯度值表示,否则用一个
固定的灰度值表示。
我们在对图像增强的过程中,采用的是一种简单的高频滤波增强方法:
式中f,g分别为锐化前后的图像,
是与扩散效应有关的系数。
表示对图像f进行二次微分的拉普拉斯算子。
这表明不模糊的图像可以由模糊的图像减去乘上系数的模糊图像拉普拉斯算子来得到。
可以用下面的模板H={{1,4,1},{4,-20,4},{1,4,1}}来近似。
在具体实现时,上述模板H中的各个系数可以改变,
这个系数的选择也很重要,太大了会使图像的轮廓过冲,太小了则图像锐化不明显。
实验表明,
选取2-8之间往往可以达到比较满意的效果。
3、实验步骤
1、输入一幅图像;
2、对该图像进行直方图均衡化处理,输出实验结果;
3、对该图像进行直方图规定化处理,输出实验结果;
4、对该图像进行图像锐化,输出实验结果;
5、对实验结果截图,并分析实验结果。
4、程序代码及实验结果显示
1、直方图均衡化
I=imread('C:
\Users\wwww\Pictures\桌面图片\c.jpg');
I=rgb2gray(I);
figure;
subplot(2,2,1);
imshow(I);
subplot(2,2,2);
imhist(I);%获取图像数据直方图
I1=histeq(I);%直方图均衡化
subplot(2,2,3);
imshow(I1);
subplot(2,2,4);
imhist(I1);
2、直方图规定化
clearall;
closeall;
%扩展原图像形成中间图像的高斯滤波
orgin=imread('C:
\Users\wwww\Pictures\桌面图片\c.jpg');
orgin=rgb2gray(orgin);%读入原图像
[m_o,n_o]=size(orgin);
orgin_hist=imhist(orgin)/(m_o*n_o);
standard=imread('C:
\Users\wwww\Pictures\桌面图片\j.jpg');%读入标准图
standard=rgb2gray(standard);
[m_s,n_s]=size(standard);
standard_hist=imhist(standard)/(m_s*n_s);
startdard_value=[];%标准图累积直方
orgin_value=[];%原图像累积直方
fori=1:
256
startdard_value=[startdard_valuesum(standard_hist(1:
i))];
orgin_value=[orgin_valuesum(orgin_hist(1:
i))];
end
fori=1:
256
value{i}=startdard_value-orgin_value(i);
value{i}=abs(value{i});
[tempindex(i)]=min(value{i});
end
newimg=zeros(m_o,n_o);
fori=1:
m_o
forj=1:
n_o
newimg(i,j)=index(orgin(i,j)+1)-1;
end
end
newimg=uint8(newimg);
subplot(2,3,1);imshow(orgin);title('原图');
subplot(2,3,2);imshow(standard);title('标准图');
subplot(2,3,3);imshow(newimg);title('myself匹配到标准图');
subplot(2,3,4);imhist(orgin);
title('原图');
subplot(2,3,5);imhist(standard);
title('标准图');
subplot(2,3,6);imhist(newimg);
title('myself匹配到标准图');
3、直方图锐化
I=imread('C:
\Users\wwww\Pictures\桌面图片\j.jpg');
A=rgb2gray(I);
figure,subplot(221),imshow(A);
title('原图');
hs=fspecial('sobel');
S=imfilter(A,hs);
hp=fspecial('prewitt');
P=imfilter(A,hs);
A=double(A);%双精度型
H=[010,1-41,010];%拉普拉斯算子
J=conv2(A,H,'same');
K=A-J;
subplot(222),imshow(K);
title('拉普拉斯锐化图像');
subplot(223),imshow(S);
title('sobel算子锐化图像');
subplot(224),imshow(P);
title('prewitt算子锐化图像');
五、实验总结
《机器视觉》
课内实验报告(3)
基于一阶微分算子的边缘检测
专业:
智能科学与技术
班级:
学号:
姓名:
实验时间:
实验三:
基于一阶微分算子的边缘检测
一、实验目的
1了解常见的一阶微分算子的原理及其卷积模板。
2熟练掌握MATLAB图像处理工具箱中的使用方法,利用Roberts算子、Sobel算子和Prewitt算子等一阶微分算子编程实现边缘检测。
3熟悉图像边缘检测方法。
二、实验的主要仪器设备
1微型计算机
2MATLAB软件(安装图像处理工具箱)
3典型的灰度图像文件
三、实验原理
边缘检测的基本思想是通过检测每个像素和其邻域的状态,以决定该像素是否位于一个物体的边界上。
如果一个像素位于一个物体的边界上,则其邻域像素的灰度值的变化就比较大。
假如可以应用某种算法检测出这种变化并进行量化表示,那么就可以确定物体的边界。
四、实验内容
1利用MATLAB图像处理工具箱进行边缘检测。
2结合实验原理,通过编程实现的实验结果比较各种边缘检测方法。
五、实验步骤
1读入一幅图像
2选择不同的边缘检测方法,对图像进行边缘检测
3分析不同检测方法对图像处理的效果
6、程序代码及实验结果显示
I=imread('I:
\机器视觉\lyx.jpg');
I=rgb2gray(I);
BW1=edge(I,'sobel');%利用Sobel算子进行边缘检测
BW2=edge(I,'roberts');%利用roberts算子进行边缘检测
BW3=edge(I,'prewitt');%利用prewitt算子进行边缘检测
BW4=edge(I,'log');%利用log算子进行边缘检测
BW5=edge(I,'canny');%利用canny算子进行边缘检测
subplot(2,3,1),imshow(I);
subplot(2,3,2),imshow(BW1);
subplot(2,3,3),imshow(BW2);
subplot(2,3,4),imshow(BW3);
subplot(2,3,5),imshow(BW4);
subplot(2,3,6),imshow(BW5);
七、心得体会
《机器视觉》
课内实验报告(4)
基于二阶微分算子的边缘检测
专业:
智能科学与技术
班级:
学号:
姓名:
实验时间:
实验四:
基于二阶微分算子的边缘检测
一、实验目的
1了解常见的二阶微分算子的原理及其实验步骤。
2熟练掌握MATLAB图像处理工具箱,利用LoG算子和Canny算子等微分算子编程实现边缘检测。
二、实验原理及步骤
1为了减少噪声的影响,对图像先进行平滑,然后在运用Laplacian算子。
平滑函数选择具有正态分布形式的高斯函数h(x,y):
其中σ是高斯分布的均方差。
令r2=x2+y2用高斯函数h(x,y)对图象f(i,j)做卷积,然后以对求二阶导数来计算拉普拉斯值,则:
称作高斯-拉普拉斯算子,简称LoG算子。
高斯平滑运算导致图像中边缘和其他尖锐不连续部分的模糊,其中模糊量取决于σ值。
σ值越大,噪声滤波效果越好,但同时也丢失了重要的边缘信息,影响了边缘检测器的性能。
如果取小的σ值,又有可能平滑不完全而留有太多的噪声。
因此在不知道物体尺度和位置的情况下,很难准确确定σ值。
一般来说,使用大的σ值会产生鲁棒边缘,小的σ值产生精确定位的边缘,两者结合,能够检测出图像的最佳边缘。
LoG算子可以用MATLAB中的edge函数来检测边缘:
其中,thresh是边缘检测的阈值,sigma是高斯滤波器的σ值,默认为2。
用不同σ值的LoG算子检测图象的边缘。
2Canny的主要工作是推导了最优边缘检测算子。
考核边缘检测算子的指标是:
低误判率,即尽可能少地把边缘点误认为是非边缘点;高定位精度,即准确地把边缘点定位在灰度变化最大的像素上;抑制虚假边缘。
Canny边缘检测算法步骤:
step1:
用高斯滤波器平滑图象;
step2:
用一阶偏导的有限差分来计算梯度的幅值和方向;
step3:
对梯度幅值进行非极大值抑制
step4:
用双阈值算法检测和连接边缘
三、实验程序与结果图
lenna=imread('rice.png');
lenna_3=mat2gray(lenna);
[m,n]=size(lenna_3);
lenna_4=lenna_3;
L=0;
t=0.2;
forj=2:
m-1
fork=2:
n-1
L=abs(4*lenna_3(j,k)-lenna_3(j-1,k)-lenna_3(j+1,k)-lenna_3(j,k+1)-lenna_3(j,k-1));
if(L>t)
lenna_4(j,k)=255;
else
lenna_4(j,k)=0;
end
end
end
figure;
imshow(lenna_4,[]);title('Laplacian0.2')
LoG算子
lenna=imread('rice.png');
subplot(121)
imshow(lenna,[]);title('原图')
lenna=double(lenna);
lenna_1=edge(lenna,'log');
subplot(122)
imshow(lenna_1,[]);title('LoG0.5')
Canny算子
lenna=imread('cameraman.tif');
subplot(221)
imshow(lenna,[]);title('原图')
lenna_1=edge(lenna,'canny',0.09);
subplot(222)
imshow(lenna_1,[]);title('Canny?
0.09')
lenna_2=edge(lenna,'canny',0.15);
subplot(223)
imshow(lenna_2,[]);title('Canny?
0.15')
lenna_3=edge(lenna,'canny',0.2);
subplot(224)
imshow(lenna_3,[]);title('Canny?
0.2')
四、实验分析
通过这次的实验我知道了二阶算子与一阶算子的区别,也知道了canny算子是二阶算子,并且能够在matlab上运行。
这是最后一次实验了,回顾以前的实验我发现我学到了很多跟机器视觉有关的知识,并且能够使用以学的算子来处理问题。
五、实验总结