【问题标题】:Calculating the number of blue pixels in a picture计算图片中蓝色像素的数量
【发布时间】:2013-10-27 20:27:32
【问题描述】:

我是 openCV 和 Python 的新手,有一个关于它的问题。我正在尝试查找图片的蓝色像素数量,以便可以将它们用作阈值,以便与其他图片进行比较。我已尝试查看文档,但找不到任何有用的信息。

谁能给点提示或帮助?


BLUE_MAX = np.array([0, 0, 200], np.uint8)
BLUE_MIN = np.array([50, 50, 255], np.uint8)

dst = cv.inRange(img, BLUE_VALUE_MIN, BLUE_VALUE_MAX)
no_blue = cv.countNonZero(dst)

print('The number of blue pixels is: ' + str(no_blue))

-因此,根据您的建议,我构建了以下函数,但运行它时得到的只是一张空白图片。

【问题讨论】:

  • 欢迎来到 Stack Overflow!如果不了解更多背景信息,我们不太可能为您提供帮助。您可以在这里和describe what you've tried 发布您的实际代码吗?请务必检查question checklist。谢谢!
  • 您需要定义“蓝色像素”的含义。

标签: python opencv


【解决方案1】:

如果您要在拍摄的图像中寻找蓝色像素,我建议您先转换为 HSV 颜色空间,然后再寻找蓝色的颜色范围。这样,您可以忽略亮度分量。

有关 HSV 颜色空间中的颜色范围,请参阅 this question

【讨论】:

    【解决方案2】:

    要计算 RGB 图像中的蓝色像素,您只需执行以下操作

    1. Inrange 将源图像滤除蓝色成分为二值图像。
    2. 使用函数countNonZero计算二进制图像中的非零像素。

    您可以参考下面的 C++ 代码了解如何操作

    #include <stdio.h>
    #include <opencv2/opencv.hpp>
    using namespace cv;
    using namespace std;
    
    int main()
    {
        Mat src,dst;
        src = imread("rgb1.jpg",1);
        inRange(src, Scalar(200,0,0), Scalar(255,50,50), dst); //In range with approximate blue range
        cout<<"No of blue pixels---->"<<countNonZero(dst)<<endl;
        imshow("src",src); 
        imshow("out",out);
    
        waitKey(0);
    
        return 0;
    }
    

    编辑:-

    这是工作的python代码

    import cv2
    import numpy as np
    
    img = cv2.imread("bgr.png")
    BLUE_MIN = np.array([0, 0, 200], np.uint8)
    BLUE_MAX = np.array([50, 50, 255], np.uint8)
    
    dst = cv2.inRange(img, BLUE_MIN, BLUE_MAX)
    no_blue = cv2.countNonZero(dst)
    print('The number of blue pixels is: ' + str(no_blue))
    cv2.namedWindow("opencv")
    cv2.imshow("opencv",img)
    cv2.waitKey(0)
    

    希望这就是你要找的......

    编辑2:-

    正如@kigurai 在 OpenCV 下面评论的那样,考虑 BGR 顺序中的图像,我为 BLUE_MIN 和 BLUE_MAX 数组给出了错误的顺序。 所以在上面的代码中的行

     BLUE_MIN = np.array([0, 0, 200], np.uint8)    
     BLUE_MAX = np.array([50, 50, 255], np.uint8)  
    

    应该改为

     BLUE_MIN = np.array([200, 0, 0], np.uint8) // minimum value of blue pixel in BGR order
     BLUE_MAX = np.array([255, 50, 50], np.uint8)// maximum value of blue pixel in BGR order
    

    【讨论】:

    • 感谢您的帮助,我想我开始明白了,但您能解释一下 inRange() 行的确切作用吗?
    • inRange() 检查数组元素是否位于作为参数提供的两个标量之间。其中第一个标量是蓝色的最低可能 RGB 值,第二个标量是蓝色可能的最高 RGB 值。所以 inRange() 检查你的源图像是否包含这些标量之间的像素值,如果是,它会将相应的像素设置为目标图像中的最大值。
    • 所以基本上它所做的是获取输入图片,扫描它,确定哪些像素位于最低和最高蓝色值之间,并将该像素设置为可能的最高蓝色值。在count非零函数中,你不应该使用inRange函数的输出图像吗?
    • 抱歉编码错误,您必须将 inRange() 的结果传递给 countNonZero。我将编辑我的答案。
    • 在您编辑答案之前我做了同样的事情,但代码仍然无法正常工作。我给程序两张不同的图片,结果我得到零。我认为这与最小和最大蓝色值有关。它对你有用吗?
    猜你喜欢
    • 2020-03-07
    • 2020-06-09
    • 2011-10-28
    • 1970-01-01
    • 2023-03-26
    • 2012-04-27
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多