wannyaky_F 2023-10-18 13:47 采纳率: 60%
浏览 15
已结题

关于图像处理自动化添加掩膜的问题

打算将中间木箱以外的区域全部用掩膜覆盖,写了以下代码,运行时报错,请教是哪里的问题,该如何修改才能实现

img


代码如下:

import cv2
import numpy as np

读取图像

img = cv2.imread('sand.jpg')

获取显示窗口的大小

window_width = 800
window_height = 800

调整图像的尺寸

src = cv2.resize(img, (window_width, window_height))

转换为灰度图像

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

使用Canny算法检测边缘

edges = cv2.Canny(gray, 100, 200)

对边缘进行膨胀操作,以强化边缘区域

edges_dilated = cv2.dilate(edges, None, iterations=3)

创建一个全黑的空白图像

mask = np.zeros_like(src)

在空白图像上绘制边缘,组成分割掩模

cv2.drawContours(mask, [edges_dilated], -1, (255, 255, 255), -1)

将分割掩模应用于原始图像,得到分割结果

segmented = cv2.bitwise_and(src, mask)

保存分割结果为图像文件

cv2.imwrite('output.jpg', segmented)

报错结果如下:

img

  • 写回答

2条回答 默认 最新

  • lazyn 2023-10-18 14:17
    关注

    cv2.drawContours 一般使用 cv2.findContours() 返回的轮廓进行绘制,你代码中的 edges_dilated 不是 cv2.drawContours 所需要的轮廓形式,使用下面的代码可以绘制轮廓,但是效果不佳

    import cv2
    import numpy as np
    
    # 读取图像
    img = cv2.imread('sand.jpg')
    
    # 获取显示窗口的大小
    window_width = 800
    window_height = 800
    
    # 调整图像的尺寸
    src = cv2.resize(img, (window_width, window_height))
    
    # 转换为灰度图像
    gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    
    # 使用Canny算法检测边缘
    edges = cv2.Canny(gray, 100, 200)
    
    # 对边缘进行膨胀操作,以强化边缘区域
    edges_dilated = cv2.dilate(edges, None, iterations=3)
    
    # 创建一个全黑的空白图像
    
    # 在空白图像上绘制边缘,组成分割掩模
    # cv2.drawContours(mask, [edges_dilated], -1, (255, 255, 255), -1)
    mask = cv2.merge([edges_dilated, edges_dilated, edges_dilated])
    # 将分割掩模应用于原始图像,得到分割结果
    segmented = cv2.bitwise_and(src, mask)
    
    # 保存分割结果为图像文件
    cv2.imwrite('output.jpg', segmented)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月25日
  • 已采纳回答 3月17日
  • 创建了问题 10月18日