计算图片中蓝色像素的数量

8

我刚接触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))

-所以根据您的建议,我编写了以下功能,但当我运行它时,只会得到一张空白图片。


1
欢迎来到Stack Overflow!如果没有更多上下文,我们可能无法帮助您。您能在这里发布您的实际代码并描述您尝试过什么吗?还请务必检查问题清单。谢谢! - Christian Ternus
1
你需要定义一下“蓝色像素”是什么意思。 - Hannes Ovrén
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

谢谢您的帮助,我觉得我开始理解了,但是您能解释一下inRange()这行代码具体是做什么吗? - akortex
inRange() 函数用于检查数组元素是否位于作为参数传入的两个 Scalar 值之间。第一个 Scalar 值是蓝色最低可能的 RGB 值,第二个 Scalar 值是蓝色最高可能的 RGB 值。因此,inRange() 函数会检查源图像中的像素值是否位于这些 Scalar 值之间,如果是,则将对应的像素设置为目标图像中的最大值。 - Haris
所以基本上它所做的就是获取输入图片,扫描图片,确定哪些像素点处于最低和最高蓝色值之间,并将该像素点设置为最高可能的蓝色值。在计算非零函数中,你是否应该使用 inRange 函数的输出图像? - akortex
抱歉,代码有误,您需要将inRange()的结果传递给countNonZero。我会编辑我的答案。 - Haris
由于OpenCV默认以BGR格式加载图像而不是RGB格式,因此BLUE_MIN和BLUE_MAX应该颠倒吗? - Hannes Ovrén
显示剩余2条评论

3
如果您在照片中寻找蓝色像素,我建议首先将其转换为HSV颜色空间,然后查找蓝色的颜色范围。这样,您可以忽略亮度成分。
请参阅此问题以了解HSV颜色空间中的颜色范围。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接