2013-10-27 67 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