【问题标题】:How to fill the background of a cropped image如何填充裁剪图像的背景
【发布时间】:2021-09-30 04:49:20
【问题描述】:

目前,我在 OpenCV 中使用给定的 x,y 坐标裁剪了一张图像。我正在尝试检测所述图像上的白色像素并显示它们。该代码工作正常,但在我用来制作屏幕截图的示例视频的某些帧上,裁剪背景也包括带有白色的元素。

我有以下代码:

import cv2

img = cv2.imread('Image_crop.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,gray = cv2.threshold(gray, 150,255,0)
gray2 = gray.copy()

cv2.imshow('IMG',gray2)
cv2.waitKey(0)
cv2.destroyAllWindows()

作物产量:

白色像素输出:

想要的输出:

有没有办法填充裁剪图像的背景或获得想要的输出?

【问题讨论】:

  • 不要指望grabcut 能完美运行。它不知道它看到了什么。它会对边缘和颜色范围做出反应,仅此而已。 -- 只需手动定义一次掩码(在图像编辑器中)。你不需要任何算法,因为掩码永远不会改变。

标签: python opencv


【解决方案1】:

嗯,这并不像看起来那么容易。简单的解决方案可能是使用cv2.grabCutSample 教程),但它不会为您带来完美的结果。

首先不要裁剪图像,而是将边界设置为cv2.grabCut,然后遮盖背景并裁剪图像。

img = cv2.imread('image.jpg') 
mask = np.zeros(img.shape[:2], np.uint8)

bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)

rect = (x, y, width, height) # boundary of interest
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
img = img * mask2[:, :, np.newaxis]

# crop the image and ...

如果输入是视频,您可以使用对象跟踪算法提高性能。

【讨论】:

  • 谢谢你这对我有用,左边的边缘还有一点白色,有什么办法可以去掉,还是用grabcut一定会发生这种情况?
  • grabcut 或任何其他算法在所有情况下都无法完美分离前景和背景。您可以尝试对您的特定任务使用直观的方法。例如,如果您知道您想要的始终是中间形状或始终是特定形状,或者......您可以提高准确性。
  • 是的,我是这么想的,我会尝试调查一下,但现在看起来不错,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2011-12-26
相关资源
最近更新 更多