2015-03-01 6 views
6

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

हिस्टोग्राम की गणना के बाद, मुझे हिस्टोग्राम पर अधिकतम मूल्य मिलना चाहिए। इसके लिए, मुझे एचएसवी छवि के लिए अधिकतम binVal मान नीचे मिलना चाहिए? मेरे परिणाम छवि में केवल काला रंग क्यों है?

float binVal = hist.at<float>(h, s);

संपादित करें:

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

enter image description here enter image description here

cvtColor(src, hsv, CV_BGR2HSV); 

// Quantize the hue to 30 levels 
// and the saturation to 32 levels 
int hbins = 20, sbins = 22; 
int histSize[] = {hbins, sbins}; 
// hue varies from 0 to 179, see cvtColor 
float hranges[] = { 0, 180 }; 
// saturation varies from 0 (black-gray-white) to 
// 255 (pure spectrum color) 
float sranges[] = { 0, 256 }; 
const float* ranges[] = { hranges, sranges }; 
MatND hist; 
// we compute the histogram from the 0-th and 1-st channels 
int channels[] = {0, 1}; 

calcHist(&hsv, 1, channels, Mat(), // do not use mask 
     hist, 2, histSize, ranges, 
     true, // the histogram is uniform 
     false); 
double maxVal=0; 
minMaxLoc(hist, 0, &maxVal, 0, 0); 

int scale = 10; 
Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3); 
int maxIntensity = -100; 
for(int h = 0; h < hbins; h++) { 
    for(int s = 0; s < sbins; s++) 
    { 
     float binVal = hist.at<float>(h, s); 
     int intensity = cvRound(binVal*255/maxVal); 
     rectangle(histImg, Point(h*scale, s*scale), 
        Point((h+1)*scale - 1, (s+1)*scale - 1), 
        Scalar::all(intensity), 
        CV_FILLED); 
     if(intensity > maxIntensity) 
      maxIntensity = intensity; 
    } 
} 
std::cout << "max Intensity " << maxVal << std::endl; 
Mat dst; 
cv::threshold(src, dst, maxIntensity, 255, cv::THRESH_BINARY); 

namedWindow("Dest", 1); 
imshow("Dest", dst); 
namedWindow("Source", 1); 
imshow("Source", src); 

namedWindow("H-S Histogram", 1); 
imshow("H-S Histogram", histImg); 

उत्तर

5

समाधान

  • एच एस हिस्टोग्राम
  • ढूँढें शिखर एच महत्व समझें (minmaxLoc फ़ंक्शन का उपयोग करके)
  • स्प्लिट छवि 3 चैनल (एच, एस, वी)
  • थ्रेसहोल्ड पर लागू करें।
  • मर्ज 3 चैनल
+3

क्या आप कुछ कोड पोस्ट करना चाहते हैं? धन्यवाद –

3

यहां कुछ सुझाव आप आरंभ करने के लिए कर रहे हैं। आरजीबी में

  • सभी 3 चैनलों रंग के लिए योगदान है, तो आप होगा किसी भी तरह यह पता लगाने जहां तीन अलग अलग हिस्टोग्राम सभी अधिकतम पर हैं। (या उनकी राशि अधिकतम है, या जो भी हो।)
  • एचएसवी में एक चैनल में सभी रंग (अच्छी तरह से, ह्यू) जानकारी है, इसलिए आपको केवल एक हिस्टोग्राम पर विचार करना होगा।
  • ग्रेस्केल सभी रंगीन जानकारी को फेंक देता है, इसलिए रंग ढूंढने के लिए काफी बेकार है।

एचएसवी में कनवर्ट करने का प्रयास करें, फिर एच चैनल पर हिस्टोग्राम की गणना करें।

जैसा कि आप कहते हैं, आप हिस्टोग्राम में अधिकतम मान खोजना चाहते हैं। लेकिन:

  • तुम सिर्फ एक के बजाय मानों की एक श्रेणी पर विचार करना चाहते हो सकता है, 20-40 के बजाय सिर्फ 30 से का कहना है। विभिन्न रेंज आकारों का प्रयास करें।
  • याद रखें कि ह्यू परिपत्र है, इसलिए H=0 और H=360 समान हैं।
  • इसके बाद हिस्टोग्राम प्लॉट करने का प्रयास करें:
    http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_calculation/histogram_calculation.html
    यह देखने के लिए कि आपके परिणाम क्या समझते हैं।
  • यदि आप कई प्रकार के रंगों का उपयोग कर रहे हैं और आपको अधिकतम सीमा मिलती है, तो आप या तो उस सीमा के बीच अपने प्रभावशाली रंग के रूप में उपयोग कर सकते हैं, या आप उस सीमा के रंगों का अर्थ पा सकते हैं और उसका उपयोग करें।

    चीजों को आजमाएं। प्ले।

8

वैकल्पिक रूप से आप k-means दृष्टिकोण का प्रयास कर सकते हैं। Calculate k clustersk ~ 2..5 के साथ और अपने प्रमुख रंग के रूप में सबसे बड़े समूह का केंद्र ले लो।

OpenCV का अजगर दस्तावेज एक illustrated example कि प्रमुख रंग (रों) बहुत अच्छी तरह से हो जाता है है:

+0

मैं बहुत तेजी सबसे बड़ी रंग क्षेत्र खोजना चाहिए द्वारा छवि बनाएँ, और मेरी छवि बहुत बड़ी है। क्या यह विधि इस कार्य के लिए कुशल है? – zumma

+0

हम्म, आपकी सलाह धन्यवाद। मैं इसका इस्तेमाल नहीं करता हूं। – zumma

+0

नहीं, यह एक साधारण हिस्टोग्राम की तुलना में धीमी गति से संभव है (सटीक संस्करण भी एनपी-पूर्ण है)। लेकिन चूंकि यह कार्य 'एन' पिक्सेल से नीचे एक रंग तक एक मजबूत आयामी कमी करता है, तो संभवतः आप सभी पिक्सेल को खाते में नहीं ले सकते हैं, यानि पहले छवि को उप-नमूना (जिस विधि का उपयोग आप वास्तव में निर्धारित करने के लिए करते हैं उस पर स्वतंत्र रंग बाद में)। – mbschenkel

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