我正在使用一些語義分割算法的火炬產生分割圖像的二進制掩碼。然後,我想根據該蒙版裁剪圖像。要清楚我需要在每個像素的基礎上裁剪它。這看起來像一個簡單的問題,但我能想到的唯一解決方案是反轉類似於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. 橢圓二進制掩碼
- 4. 如何基於黑暗區域/噪音裁剪圖像?
- 5. 如何在Android中裁剪基於矩形的圖像?
- 6. 裁剪圖像
- 7. 裁剪圖像
- 8. 無法剪裁/裁剪圖像
- 9. 二進制圖像剪切算法
- 10. 如何在裁剪之前裁剪大尺寸圖像而不裁剪?
- 11. WPF圖像裁剪
- 12. html5圖像裁剪
- 13. WPF圖像裁剪
- 14. 笨裁剪圖像
- 15. 裁剪android圖像
- 16. GWT圖像裁剪
- 17. Silverlight圖像裁剪
- 18. 裁剪YUV圖像
- 19. raphael.js裁剪圖像
- 20. Android,如何裁剪圖像視圖
- 21. android-進行裁剪圖像不正常
- 22. 如何合併兩個圖像作爲Python中的透明二進制掩碼?
- 23. 使用openCV裁剪圖像使用Android二進制文件的矩陣
- 24. 使用Javascript複製和裁剪圖像
- 25. 沒有複製的裁剪圖像
- 26. 如何裁剪圓形圖像openvc android
- 27. 如何用css裁剪圖像
- 28. 如何將圖像裁剪成圓形?
- 29. 如何從路徑中裁剪圖像?
- 30. 如何裁剪捕獲的圖像? --C#
使用findContours或提取所有掩模點(手動),並使用minBoundingRect功能。之後使用子圖像獲取裁剪後的圖像。 – Micka