计算图片中的蓝色像素数

时间:2013-10-27 20:27:33

标签: python opencv

我是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))

- 根据你的推荐,我建立了以下功能,但是当我运行它时我得到的只是一张空白图片。

2 个答案:

答案 0 :(得分:9)

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

  1. Inrange源图像将蓝色组件过滤为二进制图像。
  2. 使用函数countNonZero计算二进制图像中的非零像素。
  3. 您可以参考下面的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)
    

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

    EDIT2: -

    正如@ 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
    

答案 1 :(得分:2)

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

请参阅this question了解HSV色彩空间中的色彩范围。