首页 新闻 会员 周边

python使用opencv提取最外层轮廓,对接近白色的形状无法提取轮廓

0
悬赏园豆:20 [待解决问题]

这是原图

这是提取到的轮廓图

原图中的八角星超过图形边界的部分提取不到

lsl\/\的主页 lsl\/\ | 初学一级 | 园豆:182
提问于:2023-06-13 11:01
< >
分享
所有回答(2)
0

这个问题可能是由于图像处理阶段的阈值选择不合适导致的。为了解决这个问题,你可以尝试以下方法:

调整阈值:尝试使用不同的阈值方法和阈值值来进行图像二值化。你可以尝试使用cv2.threshold函数中的不同阈值类型(如cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV等)和不同的阈值值,找到最适合你的图像的组合。

图像预处理:在进行轮廓提取之前,可以尝试进行一些图像预处理操作,如平滑、滤波或形态学操作等。这可能有助于去除噪声或改善轮廓的连通性。例如,你可以尝试使用cv2.blur进行平滑处理,或使用cv2.morphologyEx进行开运算或闭运算等形态学操作。

轮廓过滤:在提取轮廓后,可以根据轮廓的特征进行进一步的过滤。例如,你可以计算轮廓的面积,并根据面积大小进行过滤,以排除过小或过大的轮廓。

以下是一个示例代码,演示了如何调整阈值和应用形态学操作来提取轮廓:

python
Copy code
import cv2
import numpy as np

读取原始图像

image = cv2.imread('original_image.jpg')

将图像转换为灰度图

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

应用高斯平滑来去除噪声

blur = cv2.GaussianBlur(gray, (5, 5), 0)

通过自适应阈值处理进行图像二值化

thresh = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 2)

进行形态学操作,填充闭合区域

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

提取轮廓

contours, _ = cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

在新图像上绘制轮廓

contour_image = np.zeros_like(image)
cv2.drawContours(contour_image, contours, -1, (0, 255, 0), 2)

显示原始图像和提取到的轮廓图像

cv2.imshow("Original Image", image)
cv2.imshow("Contour Image", contour_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
请根据你的具体情况调整代码中的参数,特别是阈值和形态学操作的参数,以获得最佳的结果。

Technologyforgood | 园豆:5992 (大侠五级) | 2023-06-13 22:07
0

我也没有试过,但猜测透明图像可以叠加一个黑色背景再检测轮廓?

wuhanuniversity | 园豆:202 (菜鸟二级) | 2024-05-08 17:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册