2016-11-26 32 views
1

我正在使用一些語義分割算法的火炬產生分割圖像的二進制掩碼。然後,我想根據該蒙版裁剪圖像。要清楚我需要在每個像素的基礎上裁剪它。這看起來像一個簡單的問題,但我能想到的唯一解決方案是反轉類似於Coco API中的draw mask函數,或者迭代陣列中的每個像素並遮罩,如果不需要,則將像素設置爲黑色。我覺得這樣做有更好的方法。 Lua,Python,Go或C++中的庫都適用於我。有任何想法嗎?如何基於二進制掩碼裁剪圖像

+0

使用findContours或提取所有掩模點(手動),並使用minBoundingRect功能。之後使用子圖像獲取裁剪後的圖像。 – Micka

回答

3

我已經在Python中實現了這個,假設你有你的輸入圖像和掩碼作爲Mat對象。 鑑於SRC1是你的形象和src1_mask是你的二進制掩碼:

src1_mask=cv2.cvtColor(src1_mask,cv2.COLOR_GRAY2BGR)#change mask to a 3 channel image 
mask_out=cv2.subtract(src1_mask,src1) 
mask_out=cv2.subtract(src1_mask,mask_out) 

現在mask_out包含位於您定義的二進制掩碼內的圖像SRC1的一部分。

-1

您可以使用opencv中的boundingRect函數來檢索感興趣的矩形,並且可以將圖像裁剪到該矩形。 Python實現會是這個樣子:

import numpy as np 
import cv2 

mask = np.zeros([600,600], dtype=np.uint8) 
mask[200:500,200:500] = 255     # set some values to 255 to represent an actual mask 
rect = cv2.boundingRect(mask)    # function that computes the rectangle of interest 
print(rect) 

img = np.ones([600,600, 3], dtype=np.uint8) # arbitrary image 
cropped_img = img[rect[0]:(rect[0]+rect[2]), rect[1]:(rect[1]+rect[3])] # crop the image to the desired rectangle 

替代maskimg用自己的

+0

不幸的是我需要一個像素的作物解決方案 – patrickbarker

2

爲別人運行到這一點。我發現將火炬二進制掩碼張量轉換爲Double類型,然後用火炬的cmul函數對每個RGB通道進行簡單乘法運算。基本上,因爲二進制掩碼有一個1來代替分割的像素,所以該值將保持不變。而如果它在分段之外,則其具有0,當在通道上相乘時產生黑色。 Saransh的答案也很好,對於公開的簡歷很有效。