7

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

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

4

2 回答 2

10

要计算 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
于 2013-10-28T05:24:55.013 回答
3

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

有关 HSV 颜色空间中的颜色范围,请参阅此问题

于 2013-10-30T04:27:13.210 回答