opencv 如何用相邻的颜色填充图像上的对象?

mkshixfv  于 2023-05-23  发布在  其他
关注(0)|答案(2)|浏览(120)

目前,我正面临着用相邻的颜色给粉红色的盒子着色的麻烦,这样图像看起来会更真实的。我的形象是这样的:

到目前为止,我使用CV2包并实现了这一点:

我的代码:

up = np.array([151,157,255])
pink_mask = cv2.inRange(img, up, up)
cnts, _ = cv2.findContours(pink_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in cnts:
    color = tuple(map(int, img[0, 0]))
    cv2.fillPoly(img, pts=[c], color=color)

在这里,我用图像上的第一个像素填充,因为我不知道如何用相邻的颜色填充它。

nhn9ugyo

nhn9ugyo1#

我们可以扩大遮罩,并使用cv2.inPaint:

import numpy as np
import cv2

img = cv2.imread('input.png')

up = np.array([151,157,255])
pink_mask = cv2.inRange(img, up, up)
#cnts, _ = cv2.findContours(pink_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# for c in cnts:
#     color = tuple(map(int, img[0, 0]))
#     cv2.fillPoly(img, pts=[c], color=color)
pink_mask = cv2.dilate(pink_mask, np.ones((3, 3), np.uint8))  # Dilate the mask

img = cv2.inpaint(img, pink_mask, 5, cv2.INPAINT_TELEA)

cv2.imwrite('output.png', img)

输出:

62lalag4

62lalag42#

使用'cv2.boundingRect[c]'获取当前轮廓' x,y,w和h。如果要根据检测到的轮廓的左手填充颜色,请使用(x - 5,y)。如果你想在右边填充颜色,使用(x + w + 5,y)。
请注意,5只是使用的偏移量。你可以从1开始。

相关问题