2017-09-18 120 views
0

我是一個圖像處理新手。使用opencv,如何刪除透明圖像中的非對象?

我試圖調整矩形/框架的大小,將我的對象綁定在透明圖像中。

enter image description here

但我不知道如何做到這一點。

請幫幫我。

非常感謝。 P/s:與作物不重複。在作物中,你已經修復了一個元組(Crop,from x,y,w,h)。但在我看來,我不知道該在哪裏收割。我們需要首先檢測包含我的對象(太陽眼鏡)的最小矩形,然後裁剪。

+0

[如何使用Python在OpenCV中裁剪圖像](https://stackoverflow.com/questions/15589517/how-to-crop-an-image-in-opencv-using-python) – api55

+0

In可能重複的一個,你有2個版本,PIL和OpenCV。唯一可能的區別是透明部分,至少在加載OpenCV時必須將-1放入標誌部分。 – api55

+0

@ api55否與作物重複。裁剪你已經修復了一個元組(Crop,from x,y,w,h)。但在我看來,我不知道該在哪裏收割。我們需要檢測包含我的對象的最小矩形(太陽眼鏡) –

回答

0

首先,你必須加載具有阿爾法支持在圖像中的OpenCV

import cv2 
import numpy as np #needed in the second step 
im = cv2.imread("image.png", cv2.IMREAD_UNCHANGED) 

通知的cv2.IMREAD_UNCHANGED,這等於-1。這將加載圖像與BGRA

然後將找到的對象的邊界矩形格式

# axis 0 is the row(y) and axis(x) 1 is the column 
y,x = im[:,:,3].nonzero() # get the nonzero alpha coordinates 
minx = np.min(x) 
miny = np.min(y) 
maxx = np.max(x) 
maxy = np.max(y) 

然後你裁剪

cropImg = im[miny:maxy, minx:maxx] 

最後,你表現對象,並保存結果到磁盤

cv2.imwrite("cropped.png", cropImg) 
cv2.imshow("cropped", cropImg) 
cv2.waitKey(0) 

我沒有時間測試此代碼,所以我可能有一個錯字。我希望它能幫助你。任何問題,只是評論這個答案

UPDATE

這裏是一個小更新,刪除多餘的白色部分:

首先取得布林面具它是白色的

whiteCellsMask = np.logical_and(cropImg[:,:,0] == 255, np.logical_and(cropImg[:,:,1] == 255, cropImg[:,:,2]== 255)) 

然後更改掩碼值的阿爾法爲0

cropImg[whiteCellsMask,:] = [255, 255, 255, 0] 

這將改變所有像素都是白色(255,255,255)透明(alpha = 0)。

+0

此代碼不是裁剪輪廓對象,請參閱我的照片https://i.stack.imgur.com/Xy9VB.png。請刪除這張圖片的一些白色噪音邊界。它看起來非常糟糕,當我插入這張照片到另一個 –

+0

@JameH那麼,你的問題是調整圖像的大小以適應邊界,但是......這是可能的,因爲你想刪除的額外部分是白色的,看看我的更新代碼.. – api55