我正在使用一些語義分割算法的火炬產生分割圖像的二進制掩碼。然後,我想根據該蒙版裁剪圖像。要清楚我需要在每個像素的基礎上裁剪它。這看起來像一個簡單的問題,但我能想到的唯一解決方案是反轉類似於Coco API中的draw mask
函數,或者迭代陣列中的每個像素並遮罩,如果不需要,則將像素設置爲黑色。我覺得這樣做有更好的方法。 Lua,Python,Go或C++中的庫都適用於我。有任何想法嗎?如何基於二進制掩碼裁剪圖像
1
A
回答
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
替代mask
的img
用自己的
+0
不幸的是我需要一個像素的作物解決方案 – patrickbarker
2
爲別人運行到這一點。我發現將火炬二進制掩碼張量轉換爲Double
類型,然後用火炬的cmul
函數對每個RGB通道進行簡單乘法運算。基本上,因爲二進制掩碼有一個1
來代替分割的像素,所以該值將保持不變。而如果它在分段之外,則其具有0
,當在通道上相乘時產生黑色。 Saransh的答案也很好,對於公開的簡歷很有效。
0
使用的OpenCV .copyTo與掩模選項
http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-copyto
相關問題
- 1. 如何基於二維陣列上裁剪圖像
- 2. 我如何裁剪或裁剪製作內容圖像?
- 3. Matlab - 如何使用二進制圖像掩蓋三維圖像
- 4. 如何獲得二進制掩碼
- 5. 掩蔽從二進制圖像
- 6. 橢圓二進制掩碼
- 7. 如何裁剪DICOM圖像
- 8. 如何裁剪圖像
- 9. 如何裁剪圖像?
- 10. 如何在Android中裁剪基於矩形的圖像?
- 11. 如何基於黑暗區域/噪音裁剪圖像?
- 12. 裁剪圖像
- 13. 裁剪圖像
- 14. 裁剪圖像
- 15. 如何在基於Matlab中的二進制掩碼標記的ROI上應用圖像處理算法?
- 16. 如何基於圖像中的邊界框裁剪圖像(以編程方式)?
- 17. WinRT中的裁剪/裁剪圖像
- 18. 無法剪裁/裁剪圖像
- 19. 二進制圖像剪切算法
- 20. 圖像裁剪AVCaptureSession圖像
- 21. 關於裁剪/裁剪視圖
- 22. 如何在裁剪之前裁剪大尺寸圖像而不裁剪?
- 23. 笨裁剪圖像
- 24. 圖像裁剪c#
- 25. Itext7 - 裁剪圖像
- 26. WPF圖像裁剪
- 27. html5圖像裁剪
- 28. Silverlight圖像裁剪
- 29. 裁剪YUV圖像
- 30. WPF圖像裁剪
使用findContours或提取所有掩模點(手動),並使用minBoundingRect功能。之後使用子圖像獲取裁剪後的圖像。 – Micka