2013-10-27 7 views
6

मैं ओपनसीवी और पायथन के लिए नया हूं और इसके बारे में एक प्रश्न है। मैं एक तस्वीर के नीले रंग के पिक्सेल की मात्रा को खोजने की कोशिश कर रहा हूं ताकि मैं उन्हें अन्य चित्रों की तुलना करने के लिए थ्रेसहोल्ड के रूप में उपयोग कर सकूं। मैंने प्रलेखन को देखने की कोशिश की है लेकिन मुझे अभी तक कुछ भी उपयोगी नहीं मिला।एक तस्वीर में नीले पिक्सल की संख्या की गणना

क्या कोई संकेत या कुछ मदद दे सकता है?


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

स्टैक ओवरफ़्लो में आपका स्वागत है! हम अधिक संदर्भ देखने के बिना आपकी मदद करने में असमर्थ होने की संभावना नहीं है। क्या आप अपना वास्तविक कोड यहां पोस्ट कर सकते हैं और [आपने जो कोशिश की है उसका वर्णन करें] (http://whathaveyoutried.com)? [प्रश्न चेकलिस्ट] (http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist) को भी जांचना सुनिश्चित करें। धन्यवाद! –

+1

आपको "नीली पिक्सेल" से क्या मतलब है परिभाषित करने की आवश्यकता है। –

उत्तर

8

एक आरजीबी छवि आप बस कर सकते हैं में नीले पिक्सेल गिनती के लिए एक द्विआधारी छवि के लिए नीले घटक को फ़िल्टर करने के

  1. Inrange स्रोत छवि निम्नलिखित।
  2. फ़ंक्शन countNonZero का उपयोग कर बाइनरी छवि में गैर शून्य पिक्सेल की गणना करें।

आप इसे कैसे करना

#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; 
} 

संपादित करें के लिए सी ++ कोड नीचे उल्लेख कर सकते हैं: -

यहाँ काम कर रहे अजगर कोड

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) 

आशा यह क्या है है आप ढूंढ रहे हैं .....

,210

EDIT2: -

के रूप में @ kigurai OpenCV नीचे टिप्पणी की बीजीआर क्रम में छवि पर विचार और मैं 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() जांचता है कि सरणी तत्व तर्क के रूप में आपूर्ति किए गए दो स्केलर के बीच हैं। जहां पहला स्केलर नीला रंग का सबसे कम संभव आरजीबी मूल्य है और दूसरा स्केलर नीला रंग का सबसे अधिक संभव आरजीबी मान है। तो inRange() जांचता है कि क्या आपकी स्रोत छवि में इन स्केलर के बीच पिक्सेल मान है और यदि ऐसा है तो यह आपकी गंतव्य छवि में संबंधित पिक्सेल को अधिकतम मान पर सेट करेगा। – Haris

+0

तो मूल रूप से यह इनपुट चित्र लेने के लिए होता है, इसके माध्यम से स्कैन करें, यह निर्धारित करें कि कौन से पिक्सेल निम्नतम और उच्चतम नीले मान के बीच हैं, और सेट जो पिक्सेल उच्चतम संभव नीले मान के लिए है। गिनती गैर शून्य फ़ंक्शन में, क्या आप इनरेंज फ़ंक्शन से आउटपुट छवि का उपयोग नहीं करना चाहते हैं? – Aris

1

करने के लिए बदल जाना चाहिए कि आप देख रहे हैं, मैं पहली बार एचएसवी रंग स्थान को बदलने की सलाह देते हैं और फिर देखने के लिए एक फोटो छवि में नीले पिक्सल के लिए नीले रंग के लिए रंग सीमा। इस तरह, आप चमक घटक को अनदेखा कर सकते हैं।

एचएसवी रंग अंतरिक्ष में रंग श्रृंखला के लिए this question देखें।

संबंधित मुद्दे