|
发表于 2023-8-7 08:01:46
|
显示全部楼层
我根据你的原代码和我之前给你的建议,编写了一些可能有用的代码片段,你可以参考或者直接复制到你的代码中。这些代码片段主要是对图像进行预处理和后处理,以提高沙丘脊线的提取效果。我使用了一些常用的图像处理库,如opencv、skimage、scipy等,你可以根据你的需要安装或者替换它们。
- # 预处理
- # 对图像进行中值滤波,去除椒盐噪声
- median = cv2.medianBlur(gray_image, 5)
- # 对图像进行直方图均衡化,增强对比度
- equalized = cv2.equalizeHist(median)
- # 对图像进行高斯滤波,平滑边缘
- blurred = cv2.GaussianBlur(equalized, (3, 3), 0)
- # 后处理
- # 对二值化后的图像进行形态学开运算,去除小的噪声区域
- kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
- opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
- # 对开运算后的图像进行形态学闭运算,填充小的空洞区域
- closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)
- # 对闭运算后的图像进行骨架化,得到沙丘脊线的细化结果
- skeleton = skimage.morphology.skeletonize(closed)
- # 对骨架化后的图像进行剪枝,去除多余的分支
- pruned = skimage.morphology.thin(skeleton, max_iter=10)
- # 对剪枝后的图像进行轮廓检测,得到沙丘脊线的连通区域
- contours, hierarchy = cv2.findContours(pruned, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- # 对每个连通区域进行多边形拟合,得到沙丘脊线的近似曲线
- polygons = []
- for contour in contours:
- epsilon = 0.01 * cv2.arcLength(contour, True) # 拟合精度参数,可以调整
- polygon = cv2.approxPolyDP(contour, epsilon, True)
- polygons.append(polygon)
- # 在原始图像上绘制沙丘脊线的近似曲线,并保存结果
- result = image.copy()
- cv2.drawContours(result, polygons, -1, (0, 0, 255), 2) # 红色曲线,可以修改颜色和粗细
- cv2.imwrite('result_image.jpg', result) # 保存结果
复制代码
希望这些代码片段能对你有所帮助。如果你还有其他问题,欢迎继续与我交流。 |
|