【问题标题】:Detecting an object and get the mean pixel value (BGR)检测物体并获得平均像素值 (BGR)
【发布时间】:2016-12-29 19:34:05
【问题描述】:

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

【问题讨论】:

    标签: python opencv image-processing


    【解决方案1】:

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

    因此,您只有非黑色像素的平均值,因此没有黑色背景的叶子。

    希望这有帮助!

    【讨论】:

    • 函数 cv::countNonZero 出现错误 cn == 1。如何解决?
    • 使用 te 掩码,而不是 mask_upstate,因为掩码是二进制图像,乘数计算得出相同的结果。刚刚编辑!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2015-09-11
    • 2011-06-30
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多