import cv2
import numpy as np
filename = './mask/3.png'
# 读取灰度图像
gray_image = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)
# 使用适当的阈值将图像转换为二值图像
_, binary_image = cv2.threshold(gray_image, 128, 255, cv2.THRESH_BINARY)
# 寻找分割区域的轮廓
contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 检查是否找到至少一个有效轮廓
if contours:
# 创建与输入图像相同大小的彩色图像(白色背景)
segmentation_image = np.zeros((gray_image.shape[0], gray_image.shape[1], 3), dtype=np.uint8)
segmentation_image[:, :] = (255, 255, 255) # 白色背景
# 遍历每个轮廓
for contour in contours:
# 计算轮廓的边界框
x, y, w, h = cv2.boundingRect(contour)
# 计算边界框的中心点
center_x = x + w // 2
center_y = y + h // 2
# 计算轮廓的重心
M = cv2.moments(contour)
if M["m00"] != 0:
centroid_x = int(M["m10"] / M["m00"])
centroid_y = int(M["m01"] / M["m00"])
# 在图像上绘制中心点和重心(红色和黄色)
cv2.circle(segmentation_image, (center_x, center_y), 10, (0, 0, 255), -1) # 红色
cv2.circle(segmentation_image, (centroid_x, centroid_y), 5, (0, 255, 255), -1) # 黄色
# 绘制轮廓区域(蓝色)
cv2.drawContours(segmentation_image, [contour], 0, (255, 0, 0), 1)
# 显示结果图像
cv2.imshow('Segmentation with Contours, Centers, and Centroids', segmentation_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print("Error: No valid contours found.")
参数解释
filename: 输入图像的文件路径。
gray_image: 读取的灰度图像。
binary_image: 通过阈值处理生成的二值图像。
contours: 通过轮廓检测得到的轮廓信息。
segmentation_image: 结果可视化。
结论
该脚本通过OpenCV实现了对语义分割结果的后处理和可视化,标记了轮廓、中心点和重心。用户可以根据实际需求调整阈值和颜色,以获得更符合自己应用场景的可视化效果。