如何对阈值分割图像做平滑细化处理以用于点云计算
优化实现方案
你可以按照以下步骤修改代码,即可得到更平滑纤细、精度更高的分割结果:
- 第一步:预处理添加高斯模糊,去除原始图像的随机噪点,避免分割结果出现毛刺
- 第二步:替换固定阈值为自适应局部阈值,适配光切图像可能存在的局部光照不均问题,分割精度更高
- 第三步:添加形态学开运算,去除分割结果中的小面积噪点
- 第四步:使用图像细化(骨架提取)算法,将分割得到的粗线条压缩为单像素宽度的纤细线条,完全适配后续点云计算的需求
- 第五步:修改输出格式为无损PNG,避免JPG有损压缩导致的线条边缘变形、精度损失
优化后代码
import cv2 import numpy as np import os # 路径配置 input_path = r'C:\Users\MERYEM\Desktop\scan\Chosen' output_path = r'C:\Users\MERYEM\Desktop\scan\threshold_images' os.makedirs(output_path, exist_ok=True) file_count = len(os.listdir(input_path)) for i in range(1, file_count+1): # 读取图像转灰度 img = cv2.imread(os.path.join(input_path, f"{i}.jpg")) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 1. 高斯模糊去噪 blur = cv2.GaussianBlur(gray, (3,3), 0) # 2. 自适应阈值分割 thresh = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 3. 开运算去除小噪点 kernel = np.ones((2,2), np.uint8) clean_thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1) # 4. 细化提取骨架,得到纤细平滑的线条 # 注意:需要先安装opencv-contrib-python才能使用thinning接口 thin_line = cv2.ximgproc.thinning(clean_thresh, thinningType=cv2.ximgproc.THINNING_ZHANGSUEN) # 5. 保存为无损PNG save_res = cv2.imwrite(os.path.join(output_path, f"{i}.png"), thin_line) print(f"第{i}张文件保存成功" if save_res else f"第{i}张文件保存失败") cv2.destroyAllWindows()
额外说明
如果运行时提示找不到ximgproc模块,执行pip install opencv-contrib-python安装扩展包即可。如果对线条粗细有调整需求,可以修改形态学 kernel 的大小,或者在细化前先执行1-2次腐蚀操作即可。
内容的提问来源于stack exchange,提问作者Meryem Çiftçi
相关产品推荐
相关产品推荐

