【发布时间】:2019-08-08 07:17:07
【问题描述】:
您好 StackOverflow 团队,
我有一张图片,我想从图片中删除许多部分/部分。我尝试使用以下代码取自Cropping Concave polygon from Image using Opencv python
假设我有这张图片。此外,我从通过 lebelme 注释工具获得的图像中获得了多个多边形(例如矩形或任何形式的多边形)。所以,我想从图像中删除这些形状,或者只是将它们的像素更改为白色。
换句话说,Labelme Tool 会给你一个字典文件,其中字典有一个由每个部分/多边形/形状的点组成的键)
然后可以很容易地从字典文件中提取多边形点。提取点后,我们可以通过命名来定义我们的点(例如a,b,s...h),每个点都是这种多维格式“[[1526, 319], [1526, 376], [1593 , 379], [1591, 324]]"
在这里我想到了美白每个区域。但是多维数组的白化似乎不可靠。
import numpy as np
import cv2
import json
with open('ann1.json') as f:
data = json.load(f)
#%%
a = data['shapes'][0]['points']; b = data['shapes'][1]['points']; c = data['shapes'][2]['points'];
#%%
img = cv2.imread("lena.jpg")
pts = np.array(a) # Points
#%%
## (1) Crop the bounding rect
rect = cv2.boundingRect(pts)
x,y,w,h = rect
croped = img[y:y+h, x:x+w].copy()
## (2) make mask
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)
## (3) do bit-op
dst = cv2.bitwise_and(croped, croped, mask=mask)
## (4) add the white background
bg = np.ones_like(croped, np.uint8)*255
cv2.bitwise_not(bg,bg, mask=mask)
dst2 = bg+ dst
#cv2.imwrite("croped.png", croped)
#cv2.imwrite("mask.png", mask)
#cv2.imwrite("dst.png", dst)
cv2.imwrite("dst2.png", dst2)
使用 Lena 我有这个输出 。 但我需要更进一步并美白其他点/多边形,例如眼睛。
如您所见,我的代码只能使用一个多边形点。我尝试在两只眼睛的情况下附加另外两个多边形点并得到。
通过附加,我的意思是我添加了多维点(例如 pts = np.array(a+b+c))。
简而言之,有一个图像是一种使用 OpenCV 和 python 从图像中删除这些多个多边形(通过保持图像的尺寸)的捷径。
Json 文件: https://drive.google.com/file/d/1UyOYUVMHpu2vBBEdR99bwrRX5xIfdOCa/view?usp=sharing
【问题讨论】:
-
您能否编辑并添加具有预期输出的示例图像?目前,描述不是特别清楚。我认为您可能只是想组合多个掩码,“按位或”应该实现。
-
您的意思是要遍历每组点并删除该多边形?
-
谢谢,@AlexanderReynolds...我已经编辑了这个问题。让我知道是否需要进一步编辑
-
@ShawnMathew。谢谢..我的目的是通过保持图像的尺寸来删除每个多边形。循环遍历这些点可以实现吗?
-
请也分享您的 JSON 文件。
标签: python opencv image-processing computer-vision mask