如何用opencv更改饱和度值?

Tae*_*hin 11 opencv

为了给每个像素的饱和度值添加常数值,我在双循环中执行此操作.我想知道是否有更简单,更快速的命令实现这一点.

Pun*_*t S 14

对于我尝试的实验,分割 hsv 值、调整各个通道然后进行合并的替代方法提供了更好的性能。与循环像素相比,下面的方法对我来说要快很多倍:

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

请注意,我已在 BGR2HSV 转换期间将值转换为 float32,以避免饱和转换期间因 uint8(默认)溢出而出现负值:

imghsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV).astype("float32")
Run Code Online (Sandbox Code Playgroud)

并在饱和度调整后将其转换回默认 uint8:

imgrgb = cv2.cvtColor(imghsv.astype("uint8"), cv2.COLOR_HSV2BGR)
Run Code Online (Sandbox Code Playgroud)


Sam*_*Sam 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); 
Run Code Online (Sandbox Code Playgroud)

编辑

如果饱和度是指HSV图像中的S通道,则需要在三个通道中分割图像split(),将饱和度校正应用于S通道,然后将它们放在一起merge().