搜档网
当前位置:搜档网 › 激光光斑中心位置判定及其圆拟合讲解

激光光斑中心位置判定及其圆拟合讲解

激光光斑中心位置判定及其圆拟合讲解
激光光斑中心位置判定及其圆拟合讲解

第一章彩色图像的二值化1图像的二值化原理

2 图像的二值化的程序实现

3二值化前后效果对比

第二章去除噪声

1去除噪声的原理

2去除噪声的程序实现

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

第三章圆拟合

1圆拟合原理

2圆拟合的程序实现

3拟合效果

第四章求圆心及半径

第五章完整的Matlab程序

第一章彩色图像的二值化

第一节图像的二值化原理

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

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

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

相关程序:

J=imread('1.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进行二值化。

J=imread('1.jpg'); %读图像

P=rgb2gray(J);%转换为灰度图像level=graythresh(P);%求分割阈值I=im2bw(P,level);%二值化imshow(I); %显示二值化图像第三节二值化前后效果对比

第二章去除噪声

第一节去除噪声的原理

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

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

方法一:首先将图像变成灰度图像,然后进行中值滤波。

I=imread('1.JPG');

I=rgb2gray(I);

subplot(2,3,1),imshow(I);title('原始图像');

k1=medfilt2(I); %进行3*3滤波

k2=medfilt2(I,[5,5]);%进行5*5滤波

subplot(2,3,3),imshow(k1);title('3*3中值滤波后的图像');

subplot(2,3,4),imshow(k2);title('5*5中值滤波后的图像');

方法二:先利用bwlabel函数标注连通区域,在通过regionprops函数找出其中的噪声区域,并置零,以此达到去除噪声的目的。

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);

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

第三章圆拟合

第一节圆拟合原理

首先通过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=7时的效果

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

第四章求圆心及半径

通过在所拟合的圆上任取三个点,通过这三个点确定远的圆心和蚌精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)) % 求半径

第五章完整的Matlab程序

clc;

clear all;

close all;

I = imread('1.jpg');

I = im2bw(I);

figure;

imshow(I);

L = bwlabel(I); %连通区域划分

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

'MinorAxisLength', 'Eccentricity', 'Centroid'});%求连通区域属性

Regionprops:(计算出在图像各个区域中像素总个数,包含某区域的最小凸多边形,与区域具有相同标准二阶中心矩的椭圆的长轴长度(像素意义下),与区域具有相同标准二阶中心矩的椭圆的短轴长度(像素意义下),与区域具有相同标准二阶中心矩的椭圆的离心率(可作为特征),给出每个区域的质心)

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)) % 求半径

相关主题