2011-12-16 48 views

Respuesta

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

EDITAR

Si por la saturación, es decir el canal S una imagen de HSV en, tiene que separe su imagen en tres canales con split(), aplicar la corrección de la saturación para el canal S, y luego júntelos con merge().

+0

La función anterior funcionará para cualquier tipo de matriz, simplemente Do bitute CV_8UC1 para su tipo. La documentación para la función convertTo se puede encontrar [aquí] (http://opencv.itseez.com/modules/core/doc/basic_structures.html#mat-convertto) – Chris

+0

Sí, si desea tratar solo el canal S Tendría que separar eso primero. En cuanto a lo que es más rápido, no sé, ¡prueba los dos y mira! – Chris

+0

ConvertTo definitivamente está optimizado, pero la penalidad de dividir y fusionar (con todas las asignaciones involucradas) puede ser mayor que la ganancia de usar la conversión optimizada(). Como dijo Chris, intenta ver. – 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 - Creo que se hizo la pregunta para conocer una respuesta alternativa que usted dio. –

0

Para los experimentos que intentaron, el método alternativo de valores de división de HSV, el ajuste de los canales individuales y luego hacer una fusión dio un mejor rendimiento. A continuación se muestra lo que funcionó para mí muchas veces más rápido en comparación con bucle a través de píxeles:

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

Tenga en cuenta que me había convertido los valores a float32 durante la transformación BGR2HSV para evitar valores negativos durante la transformación de saturación al debido uint8 (por defecto) de desbordamiento:

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

y convertida de nuevo a los valores predeterminados después de mi uint8 ajuste de saturación:

imgrgb = cv2.cvtColor(imghsv.astype("uint8"), cv2.COLOR_HSV2BGR) 
Cuestiones relacionadas