2013-10-27 68 views
6

我是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!我们不可能在没有看到更多背景的情况下为您提供帮助。你可以在这里发布你的实际代码吗?[描述你试过的东西](http://whathaveyoutried.com)?请务必检查[问题清单](http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist)。谢谢! –

+1

您需要定义“蓝色像素”的含义。 –

回答

8

对于你可以简单地做一个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) 

希望这是什么您正在寻找.....

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 
+0

感谢您的帮助,我认为我已经开始了解这一点,但是能否解释inRange()行的确切含义? – Aris

+0

inRange()检查数组元素是否位于作为参数提供的两个Scalar之间。其中第一个标量是蓝色的最低可能RGB值,第二个标量是蓝色最高可能RGB值。因此,inRange()会检查源图像是否包含这些标量之间的像素值,如果是,则会在目标图像中将相应像素设置为最大值。 – Haris

+0

所以基本上它是采取输入图片,扫描它,确定哪些像素位于最低和最高的蓝色值之间,并将该像素设置为最高可能的蓝色值。 在计数非零功能,你不应该使用inRange函数的输出图像? – Aris

1

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

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