为了给每个像素的饱和度值添加常数值,我在双循环中执行此操作。我想知道是否有更简单,更快的命令来实现这一目标。
答案 0 :(得分:9)
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()
在三个通道中分割图像,将饱和度校正应用于S通道,然后将其与{{{{{{ 1}}。
答案 1 :(得分: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);
答案 2 :(得分:2)
对于我尝试的实验,分割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)