图像预处理:轮廓扩展

Image preprocessing: contour expansion

我想做一些图像预处理,但有一个步骤我不确定最好的方法。

我有带注释的有趣区域的 MRI 图像,我检测轮廓并裁剪图像:

我将在此处 post 我的代码,以便您了解我如何完成前面的步骤以及我们拥有的数据

lower_orange = np.array([0, 80, 50],np.uint8)
upper_orange = np.array([255, 255, 255],np.uint8)

for frame in frames:

    cv2.imshow('Original frame',frame)
    cv2.waitKey(0)

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    contour = cv2.inRange(hsv, lower_orange, upper_orange)

    x,y,w,h = cv2.boundingRect(contour)

    mask_inv = cv2.bitwise_not(contour)
    frame = cv2.bitwise_and(hsv,hsv,mask = mask_inv)

    cv2.imshow('Contoured frame',frame)
    cv2.waitKey(0)

    croped = frame[y:y+h,x:x+w]

    resized = cv2.resize(croped,(240,240))

    gray = resized[:,:,2]

    cv2.imshow('Grayscale frame',gray)
    cv2.waitKey(0)

    feature.append(gray)

我现在要做的是把轮廓外的东西都涂黑:

您知道使用 OpenCV 执行此操作的任何本机方法吗?或者任何算法或非本地方法来实现?

非常感谢

正如 Yunus Temuerlenkl 在评论中告诉我的那样。

此方法的精度取决于轮廓蒙版的精度

尽管这是一种迭代方法,但它不会为我增加太多处理时间。您可以做的一件事是并行处理您的images/frames

for idx, frame in enumerate(frames):

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    contour = cv2.inRange(hsv, lower_orange, upper_orange)

    x,y,w,h = cv2.boundingRect(contour)

    croped_img = frame[y:y+h,x:x+w]
    croped_mask = contour[y:y+h,x:x+w]

    resized_gray_img = cv2.resize(croped_img,(dim,dim))[:,:,2]
    resized_mask = cv2.resize(croped_mask,(dim,dim))

    for row in range(dim):
        i = 0
        is_contour = False

        while((i < dim) & (not is_contour)):
            if(resized_mask[row,i]):
                is_contour = True
            resized_gray_img[row,i] = 0
            i+=1
        
        if not is_contour: continue
        is_contour = False

        i = dim -1

        while((i >= 0) & (not is_contour)):
            if(resized_mask[row,i]):
                is_contour = True
            resized_gray_img[row,i] = 0
            i-=1
   
    mask_inv = cv2.bitwise_not(resized_mask) 
    img = cv2.bitwise_and(resized_gray_img,resized_gray_img,mask = mask_inv)

    feature.append(img)