返回
轮廓的更多属性
人工智能
2023-09-27 12:09:24
面积
轮廓的面积是轮廓所占的像素数。可以使用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