gpt4 book ai didi

python - 在不改变图像大小的情况下屏蔽 ROI

转载 作者:太空宇宙 更新时间:2023-11-03 21:40:06 28 4
gpt4 key购买 nike

我得到了一些养牛场的图像。每个图像假设只覆盖两笔(小牛房)。但是,相机也会覆盖相邻的笔。我需要摆脱邻近笔的区域。

输入图像 -

enter image here

输出图像 -

enter image here

我已经尝试了以下命令并且它完成了工作。但是,它缩小了图像的大小,并使第 2 行中生成的边界框大小的输出。输出变得比原始图像小。在这种情况下,原始图像为 2560x1440,但输出为 2536x1406。

import cv2
import numpy as np
import matplotlib.pyplot as plt

frame = cv2.imread("input.jpg")
# pts - location of the 4 corners of the roi
pts = np.array([[6, 1425],[953, 20 ],[1934, 40 ], [2541,1340]])
rect = cv2.boundingRect(pts)
x, y, w, h = rect
croped = frame[y:y + h, x:x + w].copy()
pts = pts - pts.min(axis=0)
mask = np.zeros(croped.shape[:2], np.uint8)
cv2.drawContours(mask, [pts], -1, (255, 255, 255), -1, cv2.LINE_AA)
frame_roi = cv2.bitwise_and(croped, croped, mask=mask)
cv2.imwrite("output.jpg", frame_roi)

但是,我需要输出图像与输入图像大小相同,并且 ROI 之外的任何内容都是黑/白的(如下所示,虽然它是不同的图片)。白色或黑色蒙版区域都可以使用(上面的输出是黑色的,下面的手工编辑图像是白色的)。有没有办法用 opencv 或任何其他库来做到这一点?

enter image description here

最佳答案

enter image description here

错误在这一行

mask = np.zeros(croped.shape[:2], np.uint8)

这应该与您的原始/输入图像的大小完全相同。因此,将其更改为原始形状应该会给出正确的输出图像。

mask = np.zeros(original_image.shape, np.uint8)

这是输出图像的形状

(1440L, 2560L, 3L)

import cv2
import numpy as np

original_frame = cv2.imread("1.jpg")
frame = original_frame.copy()

# pts - location of the 4 corners of the roi
pts = np.array([[6, 1425],[953, 20],[1934, 40], [2541,1340]])
(x,y,w,h) = cv2.boundingRect(pts)

pts = pts - pts.min(axis=0)
mask = np.zeros(original_frame.shape, np.uint8)
cv2.drawContours(mask, [pts], -1, (255, 255, 255), -1, cv2.LINE_AA)
result = cv2.bitwise_and(original_frame, mask)

cv2.imshow('mask', mask)
cv2.imshow('result', result)
cv2.imwrite('result.png', result)
print(result.shape)
cv2.waitKey(0)

关于python - 在不改变图像大小的情况下屏蔽 ROI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56486024/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com