2011-12-16 14 views
9

प्रत्येक पिक्सेल के संतृप्ति मूल्य को निरंतर मान जोड़ने के लिए, मैं इसे डबल लूप में करता हूं। मुझे आश्चर्य है कि यह प्राप्त करने में कोई आसान और तेज़ आदेश है या नहीं।ओपनसीवी के साथ संतृप्ति मूल्यों को कैसे बदला जाए?

उत्तर

6
Mat img(200, 300, CV_8UC1); 

Mat saturated; 

double saturation = 10; 
double scale = 1; 

// what it does here is dst = (uchar) ((double)src*scale+saturation); 
img.convertTo(saturated, CV_8UC1, scale, saturation); 

संपादित

संतृप्ति से, आप एक एचएसवी छवि में एस चैनल मतलब हैं, तो आप split() साथ तीन चैनलों में अपनी छवि separe को, एस चैनल में संतृप्ति सुधार लागू की जरूरत है, और फिर उन्हें merge() के साथ एक साथ रखें।

+0

ऊपर समारोह मैट्रिक्स के किसी भी प्रकार के लिए, बस सु काम करेंगे अपने प्रकार के लिए cv_8UC1 bstitute। कन्वर्ट टू फंक्शन के लिए प्रलेखन [यहां] पाया जा सकता है (http://opencv.itseez.com/modules/core/doc/basic_structures.html#mat-convertto) – Chris

+0

हां, अगर आप केवल एस चैनल का इलाज करना चाहते हैं पहले इसे अलग करने की आवश्यकता होगी। जिसके लिए तेज़ है - मुझे नहीं पता, दोनों कोशिश करें और देखें! – Chris

+0

कन्वर्टटो निश्चित रूप से अनुकूलित है, लेकिन विभाजन और विलय का जुर्माना (सभी आवंटन के साथ) वह अनुकूलित कन्वर्ट() का उपयोग करने के लाभ से अधिक हो सकता है। जैसा कि क्रिस ने कहा, कोशिश करो और देखें। – Sam

2
// BGR to HSV 
cvCvtColor(img, img, CV_BGR2HSV);  

for (int i=0; i < img.rows ; i++) 
{ 
     for(int j=0; j < img.cols; j++) 
     { 
      // You need to check this, but I think index 1 is for saturation, but it might be 0 or 2 
      int idx = 1; 
      img.at<cv::Vec3b>(i,j)[idx] = new_value; 

      // or: 
      // img.at<cv::Vec3b>(i,j)[idx] += adds_constant_value; 
     } 
} 

// HSV back to BGR 
cvCvtColor(img, img, CV_HSV2BGR); 
+0

@ करफिलिप - मुझे लगता है कि आपके द्वारा दिए गए वैकल्पिक उत्तर को जानने के लिए प्रश्न पूछा गया था। –

0

प्रयोगों मैं कोशिश की के लिए, बंटवारे एचएसवी मूल्यों की वैकल्पिक विधि, अलग-अलग चैनलों को एडजस्ट करने के लिए और फिर किसी मर्ज कर एक बेहतर प्रदर्शन दिया।

(h, s, v) = cv2.split(imghsv) 
s = s*satadj 
s = np.clip(s,0,255) 
imghsv = cv2.merge([h,s,v]) 

ध्यान दें कि मैं मान बदल दिया था BGR2HSV परिवर्तन के दौरान float32 के कारण uint8 (डिफ़ॉल्ट) अतिप्रवाह को संतृप्ति परिवर्तन के दौरान ऋणात्मक मानों से बचने के लिए: नीचे क्या मेरे लिए कई गुना तेजी से काम किया पिक्सल के माध्यम से पाशन की तुलना में है:

imghsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV).astype("float32") 

और इसे वापस परिवर्तित मेरी संतृप्ति समायोजन के बाद uint8 डिफ़ॉल्ट:

imgrgb = cv2.cvtColor(imghsv.astype("uint8"), cv2.COLOR_HSV2BGR) 
संबंधित मुद्दे