基于MATLAB的激光光斑图像处理算法

常用的激光光斑中心检测算法有均值法、重心法及Hough变换法、圆拟合等。本设计拟采用圆拟合对激光光斑进行检测。

一、激光光斑图像预处理

激光光斑原始图像中光斑内部光强分布不均匀,且图像偏暗,对比度较差,不利于原始信号特征量的提取,因此必须进行预处理。首先,需要对光斑图像进行亮度调节,并进行去噪预处理。然后对图像进行阈值分割以分开图像和背景,即将灰度图像转化为二值图像,通过中值滤波滤除脉冲干扰及图像扫描噪声。由于二值化后的图像边缘还包含一些较大的噪声,因此需要采用形态学方法去除这些噪声以平滑光斑边缘。最后对图像边缘进行轮廓跟踪和圆拟合。

1.1 亮度调节

由于光斑原始图像往往内部光强分布不均匀,且图像偏暗,对比度较差,这会直接影响图像的后续处理和边缘检测,因此需要对图像进行亮度调节。

1.2 阈值处理及二值化

阈值处理是一种区域分割技术,主要利用图像中要提取的目标物体和背景在灰度上的差异,选择一个合适的阈值,通过判断图像中的每一个像素点的特征属性是否满足阈值的要求来确定图像中该像素点属于目标区域还是背景区域,从而产生二值图像。阈值的选取成为是否正确分割的关键,不同的阈值其处理结果差异很大。若阈值选取过高,则过多地把背景像素错分为目标;相反,若阈值选取过低,又会过多地把目标像素错分为背景。

1.3 中值滤波

中值滤波是一种非线性滤波,它能在滤除噪声的同时很好地保持图像边缘,克服平均值滤波所引起的图像细节模糊,对滤除脉冲干扰及图像扫描噪声最有效。中值滤波的原理简单,它把以某像素为中心的小窗口内所有像素的灰度按从小到大排序,取排序结果的中间值作为该像素的灰度值。经过非线性拉伸,背景干扰与其临近像素的灰度值有很大差异,因此经排序后取中值的结果是强迫将此干扰变成与其临近像素的灰度值一样,达到去除干扰的目的。

1.4 形态学处理

数学形态学由一组形态学的代数运算子组成,包括4个基本运算:膨胀、腐蚀、开运算和闭运算。由于开运算和闭运算所处理的信息分别与图像的凸、凹处相关,它们本身就是单边算子,可以利用开运算和闭运算去除图像的噪声。本设计中将开运算和闭运算结合起来对光斑进行处理。

1.5 激光光斑图像的圆拟合

首先,找出与所求区域具有相同标准二阶中心矩的椭圆的长轴长度、短轴长度、离心率等,并找出包含所求区域的最小凸多边形的顶点坐标。然后用所求椭圆的长轴长度、短轴长度和离心率确定一个正多边形,使该正多边形具有一个相当大的边数,以至于接近一个圆,这个圆即为所要拟合的圆。

二、光斑图像处理实例

利用CCD图像传感器获取到激光光束的光斑图像,通过对原始图像进行亮度调节、阈值分割、二值化处理后的结果如下图所示:

在这里插入图片描述

图 1 光斑图像二值化处理

随后,进行中值滤波、形态学处理以及边缘检测等预处理,再通过轮廓跟踪和圆拟合等图像处理后得到激光光斑的中心位置坐标和直径大小。此时,得到激光光斑中心坐标为(353.016,406.746),光斑的半径为85.376。结果下图所示:

在这里插入图片描述

图 2 激光光斑拟合结果

相关程序代码,可私信博主。

  • 25
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要找到光斑中心,可以通过以下步骤使用OpenCV实现: 1. 对像进行预处理,例如灰度化、高斯模糊等操作,以便更好地识别光斑。 2. 使用二值化方法将像转换为黑白像,可以使用阈值分割或自适应阈值分割方法。 3. 使用形态学操作(例如膨胀和腐蚀)来去除噪声和填充光斑。 4. 使用Hough变换检测光斑形轮廓。 5. 根据检测到的形轮廓,计算心坐标即为光斑中心。 以下是一个示例代码,用于在OpenCV中实现这些步骤: ```python import cv2 import numpy as np # 读取原始像 img = cv2.imread('image.jpg') # 灰度化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊 blur = cv2.GaussianBlur(gray, (5, 5), 0) # 二值化 ret, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) # 形态学操作 kernel = np.ones((3, 3), np.uint8) closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) # Hough变换 circles = cv2.HoughCircles(closing, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0) # 绘制检测到的形轮廓 if circles is not None: circles = np.round(circles[0, :]).astype("int") for (x, y, r) in circles: cv2.circle(img, (x, y), r, (0, 255, 0), 2) cv2.circle(img, (x, y), 2, (0, 0, 255), 3) # 输出心坐标 print("Center coordinates: ({}, {})".format(x, y)) # 显示结果 cv2.imshow("Result", img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,此代码仅为示例,可能需要根据实际情况进行调整和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简单光学

您的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值