当前位置: 首页 > news >正文

图像中不规则物体的长轴与短轴:OpenCV实现指南

1.首先,读取图像并将其转换为灰度图像。

2.进行图像预处理,包括使用高斯模糊和阈值化,以便更好地处理图像。

3.通过使用OpenCV的cv2.findContours()函数,找到图像中的所有轮廓。

4.遍历所有轮廓,如果轮廓点的数量大于等于5个,则将这个轮廓拟合为一个椭圆。

5.如果成功拟合出椭圆,则获取椭圆的中心坐标、长轴长度、短轴长度和旋转角度。

6.使用计算得到的椭圆信息,计算出长轴和短轴的端点坐标。

7.使用OpenCV的cv2.ellipse()函数在原始图像上绘制椭圆,并使用cv2.circle()函数在图像上绘制长轴和短轴的四个端点,并分别用红色和蓝色表示。

8.最后,显示带有椭圆和端点的图像,等待用户按下任意键后关闭显示窗口。

import cv2
import numpy as npimage = cv2.imread("XXX.png", cv2.IMREAD_GRAYSCALE)
blur = cv2.GaussianBlur(image, (5, 5), 0)
_, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)ellipse = None
for contour in contours:if len(contour) >= 5:ellipse = cv2.fitEllipse(contour)breakif ellipse is not None:center, axes, angle = ellipsemajor_axis, minor_axis = axesangle_rad = np.deg2rad(angle)cos_angle = np.cos(angle_rad)sin_angle = np.sin(angle_rad)# 长轴端点坐标x1 = int(center[0] + major_axis / 2 * cos_angle)y1 = int(center[1] - major_axis / 2 * sin_angle)x2 = int(center[0] - major_axis / 2 * cos_angle)y2 = int(center[1] + major_axis / 2 * sin_angle)# 短轴端点坐标x3 = int(center[0] + minor_axis / 2 * sin_angle)y3 = int(center[1] + minor_axis / 2 * cos_angle)x4 = int(center[0] - minor_axis / 2 * sin_angle)y4 = int(center[1] - minor_axis / 2 * cos_angle)# 在图像上绘制椭圆及长轴和短轴的端点image_with_ellipse = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)cv2.ellipse(image_with_ellipse, ellipse, (0, 255, 0), 2)cv2.circle(image_with_ellipse, (x1, y1), 5, (0, 0, 255), -1)  # 长轴端点用红色标记cv2.circle(image_with_ellipse, (x2, y2), 5, (0, 0, 255), -1)  # 长轴端点用红色标记cv2.circle(image_with_ellipse, (x3, y3), 5, (255, 0, 0), -1)  # 短轴端点用蓝色标记cv2.circle(image_with_ellipse, (x4, y4), 5, (255, 0, 0), -1)  # 短轴端点用蓝色标记# 显示图像cv2.imshow("Image with Ellipse and Axes", image_with_ellipse)cv2.waitKey(0)cv2.destroyAllWindows()
else:print("No ellipse found.")
http://www.lryc.cn/news/102681.html

相关文章:

  • C/C++开发,opencv与qt结合播放视频
  • 磁共振图像处理中 fft1c 和 ifft1c 函数的 Python 实现
  • 阿里云国际站香港地域服务器访问延迟丢包的原因及解决方法
  • GULI PART.1
  • NetApp FAS2750 和 FAS2820:适用于分布式企业和从远程到核心的 FAS
  • 剑指YOLOv8改进最新MPDIoU损失函数:超越现有多种G/D/C/EIoU,23年7月首发论文,高效准确的边界框回归的损失
  • SQL-每日一题【1070. 产品销售分析 III】
  • 为何押注AI大模型的微软云,业绩增速反而不如谷歌云?
  • CDN加速服务的工作原理
  • 在CSDN学Golang云原生(Kubernetes Service)
  • 【数据结构篇C++实现】- 图
  • Sentinel持久化规则
  • list与sort()
  • 6个月、21天,GoldenDB分布式数据库核心系统落地中移动
  • 如何正确培养数据思维?
  • JavaScript中的?.和??的用法
  • Git for linux
  • uniapp小程序,根据小程序的环境版本,控制的显页面功能按钮的示隐藏
  • kotlin 编写一个简单的天气预报app(二)增加搜索城市功能
  • 【分布鲁棒、状态估计】分布式鲁棒优化电力系统状态估计研究[几种算法进行比较](Matlab代码实现)
  • vue中的require
  • Linux进程间共享内存通信时如何同步?(附源码)
  • spring注解驱动开发(二)
  • 【C++】——类和对象
  • 【Docker】使用docker-maven-plugin插件构建发布推镜像到私有仓库
  • 区块链学习笔记
  • 实用上位机--QT
  • os.signal golang中的信号处理
  • Python源码:Tkinter组件布局管理的3种方式
  • 网络防御之VPN