返回

轮廓的更多属性

人工智能

面积

轮廓的面积是轮廓所占的像素数。可以使用OpenCV函数cv2.contourArea()计算轮廓的面积。

import cv2

# 加载图像
image = cv2.imread('image.jpg')

# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测算子检测边缘
edges = cv2.Canny(gray, 100, 200)

# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算每个轮廓的面积
for contour in contours:
    area = cv2.contourArea(contour)
    print(area)

周长

轮廓的周长是轮廓边界上的所有像素的长度之和。可以使用OpenCV函数cv2.arcLength()计算轮廓的周长。

import cv2

# 加载图像
image = cv2.imread('image.jpg')

# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测算子检测边缘
edges = cv2.Canny(gray, 100, 200)

# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算每个轮廓的周长
for contour in contours:
    perimeter = cv2.arcLength(contour, True)
    print(perimeter)

边界框

轮廓的边界框是轮廓所占的最小矩形。可以使用OpenCV函数cv2.boundingRect()计算轮廓的边界框。

import cv2

# 加载图像
image = cv2.imread('image.jpg')

# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测算子检测边缘
edges = cv2.Canny(gray, 100, 200)

# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算每个轮廓的边界框
for contour in contours:
    x, y, w, h = cv2.boundingRect(contour)
    print(x, y, w, h)

中心

轮廓的中心是轮廓所有点的平均值。可以使用OpenCV函数cv2.moments()计算轮廓的中心。

import cv2

# 加载图像
image = cv2.imread('image.jpg')

# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测算子检测边缘
edges = cv2.Canny(gray, 100, 200)

# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算每个轮廓的中心
for contour in contours:
    M = cv2.moments(contour)
    cX = int(M["m10"] / M["m00"])
    cY = int(M["m01"] / M["m00"])
    print(cX, cY)

长宽比

轮廓的长宽比是轮廓的宽度与高度之比。可以使用OpenCV函数cv2.boundingRect()计算轮廓的长宽比。

import cv2

# 加载图像
image = cv2.imread('image.jpg')

# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测算子检测边缘
edges = cv2.Canny(gray, 100, 200)

# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算每个轮廓的长宽比
for contour in contours:
    x, y, w, h = cv2.boundingRect(contour)
    aspect_ratio = w / h
    print(aspect_ratio)

矩形度

轮廓的矩形度是轮廓的面积与其最小边界矩形的面积之比。可以使用OpenCV函数cv2.contourArea()cv2.boundingRect()计算轮廓的矩形度。

import cv2

# 加载图像
image = cv2.imread('image.jpg')

# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测算子检测边缘
edges = cv2.Canny(gray, 100, 200)

# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算每个轮廓的矩形度
for contour in contours:
    area = cv2.contourArea(contour)
    x, y, w, h = cv2.boundingRect(contour)
    rect_area = w * h
    rect_ratio = area / rect_area
    print(rect_ratio)

范围

轮廓的范围是轮廓的面积与轮廓周长的平方之比。可以使用OpenCV函数cv2.contourArea()cv2.arcLength()计算轮廓的范围。

import cv2

# 加载图像
image = cv2.imread('image.jpg')

# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测算子检测边缘
edges = cv2.Canny(gray, 100, 200)

# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算每个轮廓的范围
for contour in contours:
    area = cv2.contourArea(contour)
    perimeter = cv2.arcLength(contour, True)
    circularity = 4 * np.pi * area / (perimeter * perimeter)
    print(circularity)

坚实度

轮廓的坚实度是轮廓的面积与其凸包的面积之比。可以使用OpenCV函数cv2.contourArea()cv2.convexHull()计算轮廓的坚实度。

import cv2

# 加载图像
image = cv2.imread('image.jpg')

# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测算子检测边缘
edges = cv2.Canny(gray, 100, 200)

# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算每个轮廓的坚实度
for contour in contours:
    area = cv2.contourArea(contour)
    hull = cv2.convexHull(contour)
    hull_area = cv2.contourArea(hull)
    solidity = area / hull_area
    print(solidity)

等效直径

轮廓的等效直径是轮廓面积的圆的直径。可以使用OpenCV函数cv2.contourArea()np.sqrt()计算轮廓的等效直径。

import cv2
import numpy as np

# 加载图像
image = cv2.imread('image.jpg')

# 将图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用Canny边缘检测算子检测边缘
edges = cv2.Can