2011-12-16 166 views

回答

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); 

編輯

如果飽和度,你的意思是在HSV圖像的S信道,則需要使用split()到separe你的形象在三個通道,飽和度校正應用到S信道,並然後將它們與merge()放在一起。

+0

上述功能適用於任何類型的矩陣工作,只需蘇爲你的類型選擇CV_8UC1。 convertTo函數的文檔可以在這裏找到(http://opencv.itseez.com/modules/core/doc/basic_structures.html#mat-convertto) – Chris 2011-12-16 15:54:11

+0

是的,如果你只想對待S頻道首先需要將其分開。至於哪個更快 - 我不知道,試試看看! – Chris 2011-12-16 16:15:31

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

對於我試過的實驗,分離hsv值,調整個別通道,然後進行合併的替代方法提供了更好的性能。下面是我工作快很多倍相比,通過像素循環:

(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) 
相關問題