2011-12-16 16 views

Odpowiedz

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

EDIT

Jeśli przez nasycenie, to znaczy kanał S w HSV obrazu, trzeba Separe obraz w trzech kanałach z split() nanieść korekty nasycenia do kanału S i następnie połącz je z merge().

+0

Powyższa funkcja będzie działać na każdym rodzaju matrycy, po prostu su bstitute CV_8UC1 dla Twojego typu. Dokumentację funkcji convertTo można znaleźć tutaj (http://opencv.itseez.com/modules/core/doc/basic_structures.html#mat-convertto) – Chris

+0

Tak, jeśli chcesz traktować tylko kanał S, musiał najpierw to oddzielić. A co do tego jest szybsze - nie wiem, spróbuj obu i zobacz! – Chris

+0

ConvertTo jest zdecydowanie zoptymalizowany, ale kara podziału i scalenia (z wszystkimi zaangażowanymi alokacjami) może być wyższa niż zysk użycia zoptymalizowanej konwersji(). Jak powiedział Chris, spróbuj i zobacz. – 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

@Karlphillip - Myślę, że pytanie zostało zadane, aby poznać alternatywną odpowiedź, którą podałeś. –

0

W eksperymentach prób, alternatywny sposób wartości rozszczepienie HSV dostosowywania indywidualnych kanałów, a następnie wykonując seryjnej dał lepsze wyniki. Poniżej jest co pracował dla mnie wiele razy szybciej w porównaniu do przelotowego pikseli:

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

Zauważ, że miałem przeliczone wartości do float32 podczas transformacji BGR2HSV uniknąć ujemne wartości podczas transformacji nasycenia do rzetelnego uint8 (domyślnie) przelewowego:

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

i przekształcono go z powrotem do domyślnego Uint8 po moim regulacji nasycenia:

imgrgb = cv2.cvtColor(imghsv.astype("uint8"), cv2.COLOR_HSV2BGR) 
Powiązane problemy