我有一张以白色纸为背景的叶子图片,我需要去除噪音(黄点)并获取叶子的像素值(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()

最佳答案

因此,基本上您有一个带有叶子和黑色背景的蒙版图像。现在的问题是它将颜色的总和除以所有像素的数量,而不是仅将颜色除以具有叶子的像素的数量。解决此问题的一种简单快捷方法是将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])

因此,您只有非黑色像素的平均值,因此无需黑色背景即可遍历叶子。

希望这对您有所帮助!

10-06 05:19
查看更多