当前位置:文档之家› 激光光斑中心位置及大小的确定Matlab

激光光斑中心位置及大小的确定Matlab

燕山大学

课程设计说明书

题目:20 目标位置及大小的确定

学院(系):电气工程学院

年级专业: 11级仪表1班

学号: 110103020029 学生姓名:张钊

指导教师:赵彦涛吴飞

教师职称:副教授副教授

燕山大学课程设计(论文)任务书

院(系):电气工程学院基层教学单位:自动化仪表系

2013年12 月 27日

摘要

首先对图像进行二值化,然后对二值图像进行去除噪声操作,通过找出与所求区域具有相同标准二阶中心矩的椭圆的长轴长度,短轴长度,离心率等,并找出包含所求区域的最小凸多边形,的顶点坐标。通过一定的方法,用所求椭圆的相关参数确定一个正多边形。使该正多边形具有一个相当大的边数,是该多边形接近一个圆。这个圆就是所要拟合的圆。最后通过三个点求圆的中心和半径。运用多种方法实现改程序,并计算各种方法所需时间。

关键字二值化处理去噪声处理圆的拟合已知三点求圆的中心和半径计算时间

目录

第一章彩色图像的二值化

1.图像的二值化原理 (5)

2. 图像的二值化的程序实现 (5)

3.二值化前后效果对比 (6)

第二章去除噪声

1去除噪声的原理 (7)

2去除噪声的程序实现 (7)

3去除噪声前后的图像对比 (9)

第三章圆拟合

1圆拟合原理 (9)

2圆拟合的程序实现 (10)

3拟合效果 (12)

第四章求圆心及半径 (14)

第五章Matlab中计算程序运行的时间 (14)

第六章Matlab程序 (15)

总结 (29)

参考文献资料 (29)

第一章彩色图像的二值化

第一节图像的二值化原理

图像的二值化处理就是将图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。

第二节图像的二值化的程序实现

方法一:首先将图像转变为灰度图像,再利用max,min等函数求阈值分割点,最后转化为二值化图像

相关程序:

J=imread(' C:\Users\DELL\Desktop\软件\20亮点图像\4.JPG'); %读图像

figure;imshow(J); %显示原始图像

P=rgb2gray(J); %转换为灰度图像

[m,n]=size(P); %获取图像的行数和列数

ma=max(max(P)); %求最大值

mi=min(min(P)); %求最小值

limen=(ma+mi)/2; %求分割阈值

I=(P>limen); %二值化

figure;imshow(I); %显示二值化图像

方法二:首先将图像转变为灰度图像,再利用graythresh等函数求阈值分割点,最后用

函数im2bw进行二值化。

I=imread(' C:\Users\DELL\Desktop\软件\20亮点图像\4.JPG '); %读图像P=rgb2gray(I);%转换为灰度图像

level=graythresh(P);%求分割阈值

I=im2bw(P,level);%二值化

imshow(I); %显示二值化图像

第三节二值化前后效果对比

第二章去除噪声

第一节去除噪声的原理

噪声在理论上可以定义为“不可预测,只能用概率统计方法来认识的随机误差”。实际获得的图像一般都因受到某种干扰而含有噪声。引起噪声的原因有敏感元器件的内部噪声、相片底片上感光材料的颗粒、传输通道的干扰及量化噪声等。噪声产生的原因决定了噪声的分布特性及它和图像信号的关系。

第二节去除噪声的程序实现

方法1

L = bwlabel(I); % 功能:标注二进制图像中已连接的部分。

stats = regionprops(L, {'Area', 'ConvexHull', 'MajorAxisLength', ...

'MinorAxisLength', 'Eccentricity', 'Centroid'}); %用来度量图像区域属性的函数。测量

标注矩阵L中每一个标注区域的一系列属性。L中不同的正整数元素对应不同的区域。% A = []; %定义数组A%

for i = 1 : length(stats)

A = [A stats(i).Area]; % 'Area'是标量,计算出在图像各个区域中像素总个数。% End

[mA, ind] = max(A);

I1 = I;

I1(find(L~=ind)) = 0;

Figure ;

imshow(I1);

方法二,中值滤波

clear

clc

I=imread('C:\Users\DELL\Desktop\1.bmp');

I=im2double(I);

I=medfilt2(I);

imshow(I,[]);

title('');

第三节去除噪声前后的图像对比

第三章圆拟合

第一节圆拟合原理

首先通过regionprops函数找出与所求区域具有相同标准二阶中心矩的椭圆的长轴长度,短轴长度,离心率等,并找出包含所求区域的最小凸多边形,的顶点坐标。通过一定的方法,用所求椭圆的相关参数确定一个正多边形。使该正多边形具有一个相当大的边数,是该多边形接近一个圆。这个圆就是所要拟合的圆。在指令t = linspace(0, 2*pi,N)中,N-1表示所求正多边形的边数,N越大,所拟合的圆越精确。

第二节圆拟合的程序实现

stats = regionprops(L, {'Area', 'ConvexHull', 'MajorAxisLength', ...

'MinorAxisLength', 'Eccentricity', 'Centroid'}); %用来度量图像区域属性的函数。测量标注矩阵L中每一个标注区域的一系列属性。L中不同的正整数元素对应不同的区域。% A = []; %定义数组A%

for i = 1 : length(stats)

A = [A stats(i).Area]; % 'Area'是标量,计算出在图像各个区域中像素总个数。% End

[mA, ind] = max(A);

I1 = I;

I1(find(L~=ind)) = 0;

figure;

imshow(I1)

hold on;

temp = stats(ind).ConvexHull; % 'ConvexHull'是p行2列的矩阵,包含某区域的最小凸多边形。此矩阵的每一行存储此多边形一个顶点的xy坐标。%

t = linspace(0, 2*pi); % 用法:linspace(x1,x2,N)

功能:linspace是Matlab中的一个指令,用于产生x1,x2之间的N点行矢量。其中x1、x2、N分别为起始值、终止值、元素个数。若缺省N,默认点数为100。应用举例

例一:

在matlab的命令窗口输入:

X=linspace(1,100)

将产生从1到100步长为1的数组。类似于在命令窗口中输入:

X=[1:1:100]

例二:

在命令窗口中输入:

X=linspace(5,100,20)

将输出:

X =

5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100

这和X=[5:5:100]的效果是一样的。%

c1 = stats(ind).Centroid; % 'Centroid'是1行ndims(L)列的向量,给出每个区域的质心(重心)。注意:Centroid 的第一个元素是重心水平坐标(x坐标)、第二个元素是重心垂直坐标(y坐标)。Centroid 所有其它元素则按照维顺序排列。

a1 = stats(ind).MajorAxisLength; % 'MajorAxisLength'是标量,椭圆的长轴长度(像素意义下)。标准二阶中心矩就是标准方差%

b1 = stats(ind).MinorAxisLength; % 'MinorAxisLength'是标量,的椭圆的短轴长度(像素意义下)%

d1 = stats(ind).Eccentricity; % 'Eccentricity'是标量,椭圆的离心率(可作为特征)%

x1 = c1(1) + d1*b1*cos(t);

y1 = c1(2) + d1*a1*sin(t);

m=plot(x1, y1, 'b-'); %拟合出一个蓝色的圆

第三节拟合效果

t = linspace(0, 2*pi,N)中,N=5时的效果

t = linspace(0, 2*pi,N)中,N=700时的效果

第四章求圆心及半径

通过在所拟合的圆上任取三个点,通过这三个点确定远的圆心和半径。x2=x1(1,1);

y2=y1(1,1);

x3=x1(1,100);

y3=y1(1,100);

x4=x1(1,300);

y4=y1(1,300);

a=2*(x3-x2);

b=2*(y3-y2);

n=(x3*x3+y3*y3-x2*x2-y2*y2);

d=2*(x4-x3);

e=2*(y4-y3);

f=(x4*x4+y4*y4-x3*x3-y3*y3);

x0=(b*f-e*n)/(b*d-e*a+eps) % 求圆心坐标

y0=(d*n-a*f)/(b*d-e*a+eps)

r0=sqrt((x0-x2)*(x0-x2)+(y0-y2)*(y0-y2)) % 求半径

第五章Matlab中计算程序运行时间

一,tic和toc组合

计算tic和toc之间那段程序之间的运行时间,它的经典格式为

1. tic

2. 。。。。。。。。。。

3. toc 复制代码换句话说程序,

程序遇到tic时Matlab自动开始计时,运行到toc时自动计算此时与最近一次ti之间的时间。

二,etime(t1,t2)并和clock配合

来计算t1 t2之间的时间差,它是通过调用windows系统的时钟进行时间差计算得到运行时间的,应用的形式

1. t1=clock;

2. 。。。。。。。。。。。

3. t2=clock;

4. etime(t2,t1)

第六章Matlab程序

程序一:

t1=clock;

I = imread('C:\Users\DELL\Desktop\软件\20亮点图像\4.JPG');

P=rgb2gray(I);%转换为灰度图像

level=graythresh(P);%求分割阈值

I = im2bw(I);

figure;

imshow(I);

L = bwlabel(I);

stats = regionprops(L, {'Area', 'ConvexHull', 'MajorAxisLength', ... 'MinorAxisLength', 'Eccentricity', 'Centroid'});

A = [];

for i = 1 : length(stats)

A = [A stats(i).Area];

end

[mA, ind] = max(A);

I1 = I;

I1(find(L~=ind)) = 0;

figure;

imshow(I1);

hold on;1

temp = stats(ind).ConvexHull;

t = linspace(0, 2*pi,500);

c1 = stats(ind).Centroid;

a1 = stats(ind).MajorAxisLength;

b1 = stats(ind).MinorAxisLength;

d1 = stats(ind).Eccentricity;

x1 = c1(1) + d1*b1*cos(t);

y1 = c1(2) + d1*a1*sin(t);

m=plot(x1, y1, 'g-');

x2=x1(1,1);

y2=y1(1,1);

x3=x1(1,30);

y3=y1(1,30);

x4=x1(1,80);

y4=y1(1,80);

a=2*(x3-x2);

b=2*(y3-y2);

n=(x3*x3+y3*y3-x2*x2-y2*y2);

d=2*(x4-x3);

e=2*(y4-y3);

f=(x4*x4+y4*y4-x3*x3-y3*y3);

x0=(b*f-e*n)/(b*d-e*a+eps) % 求圆心

y0=(d*n-a*f)/(b*d-e*a+eps)

r0=sqrt((x0-x2)*(x0-x2)+(y0-y2)*(y0-y2)) % 求半径t2=clock;

etime(t2,t1)

运行结果及图像:

程序二:应用利用max,min等函数求阈值分割点,最后转化为二值化图像,去噪后利用中值滤波处理

clear all;clc;

t1=clock;

I=imread('C:\Users\DELL\Desktop\软件\20亮点图像\4.JPG');

figure;imshow(I); %显示原始图像

P=rgb2gray(I); %转换为灰度图像

[m,n]=size(P); %获取图像的行数和列数

相关主题
文本预览
相关文档 最新文档