Axes majeurs et mineurs des objets irréguliers dans les images : guide d'implémentation d'OpenCV

1. Tout d’abord, lisez l’image et convertissez-la en image en niveaux de gris.

2. Effectuez un prétraitement de l'image, notamment en utilisant le flou gaussien et le seuillage, pour un meilleur traitement de l'image.

3. Recherchez tous les contours de l'image à l'aide de la fonction cv2.findContours() d'OpenCV.

4. Parcourez tous les contours. Si le nombre de points du contour est supérieur ou égal à 5, ajustez le contour à une ellipse.

5. Si l'ellipse est ajustée avec succès, les coordonnées centrales, la longueur du grand axe, la longueur du petit axe et l'angle de rotation de l'ellipse sont obtenus.

6. Utilisez les informations d'ellipse calculées pour calculer les coordonnées des points finaux de l'axe principal et de l'axe mineur.

7. Utilisez la fonction cv2.ellipse() d'OpenCV pour dessiner une ellipse sur l'image originale, et utilisez la fonction cv2.circle() pour dessiner les quatre extrémités de l'axe majeur et de l'axe mineur sur l'image, et représentez-les en rouge et bleu respectivement.

8. Enfin, affichez l'image avec l'ellipse et les extrémités, attendez que l'utilisateur appuie sur n'importe quelle touche, puis fermez la fenêtre d'affichage.

import cv2
import numpy as np

image = 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)
        break

if ellipse is not None:
    center, axes, angle = ellipse
    major_axis, minor_axis = axes
    angle_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.")

Guess you like

Origin blog.csdn.net/hasque2019/article/details/131931028