2016-12-29 66 views
1

我有一張白紙作爲背景的圖片,我需要去除噪點(黃點)並獲得像素值(bgr)葉。檢測一個物體並得到平均像素值(BGR)

我用綠色閾值來檢測葉子並用原始圖像掩蓋它。我使用cv2.mean來獲取像素值,但它計算所有像素包括黑色區域/背景。

如何獲得只爲葉的像素值? 這裏是我使用的代碼:

import cv2 
import numpy as np 

img=cv2.imread('crop21.jpg') 
blur=cv2.GaussianBlur(img,(5,5),0) 
hsv=cv2.cvtColor(blur,cv2.COLOR_BGR2HSV) 
#threshold green 
low_g=np.array([35,100,60],np.uint8) 
up_g=np.array([85,255,190],np.uint8) 
mask=cv2.inRange(hsv,low_g,up_g) 
mask_upstate=cv2.bitwise_and(blur, blur, mask=mask) 
#get the bgr value 
mean=cv2.mean(mask_upstate) 
print (mean) 

cv2.imshow('image',mask_upstate) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

回答

0

所以基本上你有一個葉子和黑色背景上的遮蓋的圖像。現在的問題是,它將顏色的總和除以所有像素的數量,而不是將其除以具有葉子的像素的數量。要解決這個一個簡單快速的方法是,將結果從mean = cv2.mean(mask_upstate)通過Total pixels/Non-black pixels,這是可以做到乘以如下:

# Get the BGR value 
mean = cv2.mean(mask_upstate) 
multiplier = float(mask.size)/cv2.countNonZero(mask) 
mean = tuple([multiplier * x for x in mean]) 

因此,你剛纔的非黑色像素的平均值,ERGO葉無黑色的背景。

希望這有助於!

+0

我在函數cv :: countNonZero中遇到錯誤cn == 1。如何解決它? – gygem

+0

使用te mask,而不是mask_upstate,因爲mask是一個二進制圖像,並且乘法器計算給出了相同的結果。剛剛編輯! – ebeneditos

+1

哦,它的工作....非常感謝 – gygem