目录
1. 形态学操作
利用形态学操作(例如腐蚀、膨胀、开运算、闭运算等)可以使分割边界更加平滑和连续。腐蚀可以消除小的不连续区域,膨胀可以填充空洞,而开运算可以平滑边界并保留边缘信息,闭运算则可以填充小的孔洞。
import cv2
import numpy as np
# 读取语义分割结果
segmentation_result = cv2.imread('segmentation_result.png', 0) # 读取单通道图像
# 形态学操作
kernel = np.ones((5,5), np.uint8)
smoothed_result = cv2.morphologyEx(segmentation_result, cv2.MORPH_CLOSE, kernel)
2. 边缘平滑化
在分割边界上应用边缘平滑化算法(如高斯滤波、均值滤波、中值滤波等)可以减少噪声并使得边界更加平滑。
python code
smoothed_result = cv2.GaussianBlur(segmentation_result, (5, 5), 0)
3. 轮廓近似
利用轮廓近似算法(如Douglas-Peucker算法)可以对边界轮廓进行抽稀,从而使得轮廓更加平滑。
contours, _ = cv2.findContours(segmentation_result, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
epsilon = 0.02 * cv2.arcLength(contours[0], True)
approx = cv2.approxPolyDP(contours[0], epsilon, True)
smoothed_result = np.zeros_like(segmentation_result)
cv2.drawContours(smoothed_result, [approx], -1, 255, thickness=cv2.FILLED)
python 有回归线平滑 2D 轮廓
import cv2
import numpy as np
from scipy.interpolate import splprep, splev
# 假设有一组轮廓点坐标
x = np.array([80, 100, 120, 140, 160])
y = np.array([5+50, 15+50, 10+50, 25+50, 20+50])
# 多项式拟合
tck, _ = splprep([x, y], s=0) # s 参数控制拟合平滑度
# 生成新的平滑轮廓点
new_points = splev(np.linspace(0, 1, 100), tck)
# 创建一张空白图像
image = np.zeros((500, 500,3), dtype=np.uint8)
for (xi, yi) in zip(x, y):
cv2.circle(image, (xi, yi), 3, color=(0,0,255), thickness=1)
# 将平滑后的轮廓点转换为整数坐标,并绘制在图像上
smoothed_contour = np.array(new_points, dtype=np.int32).T.reshape((-1, 1, 2))
cv2.polylines(image, [smoothed_contour], isClosed=False, color=(0,255,0), thickness=1)
# 使用 OpenCV 的 imshow 函数显示图像
cv2.imshow('Smoothed Contour Visualization', image)
cv2.waitKey(0) # 等待用户按键
cv2.destroyAllWindows() # 关闭所有 OpenCV 窗口