You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用OpenCV Python调整亮度、对比度、鲜艳度等图像属性?

Python OpenCV: Adjusting Brightness, Contrast, Vibrance, Hue, Saturation & Lightness

Hey there! As someone who’s been down the OpenCV Python rabbit hole, let’s walk through all your image adjustment needs step by step—translating that C++ tutorial to Python, fixing up your HSV code, and tackling vibrance, which is a bit trickier than basic saturation.


1. Brightness & Contrast Adjustment (Python Version)

The C++ tutorial you linked uses a simple linear transformation: new_img = alpha * img + beta, where:

  • alpha (>0) controls contrast: values >1 amp up contrast, <1 tone it down
  • beta controls brightness: positive values brighten, negative values darken

In Python, cv2.convertScaleAbs() handles this safely (it prevents pixel values from overflowing or dropping below valid ranges):

import cv2
import numpy as np

def adjust_brightness_contrast(img, alpha=1.0, beta=0):
    # alpha: contrast factor (try 1.0-3.0)
    # beta: brightness offset (try -100 to 100)
    adjusted = cv2.convertScaleAbs(img, alpha=alpha, beta=beta)
    return adjusted

# Example usage
img = cv2.imread("your_image.jpg")
brightened = adjust_brightness_contrast(img, alpha=1.0, beta=30)
high_contrast = adjust_brightness_contrast(img, alpha=1.5, beta=0)

2. Hue, Saturation, Lightness (HSV Space)

Your existing code is close, but we need to fix edge cases to keep pixel values within OpenCV’s valid HSV ranges (H: 0-179, S/V: 0-255):

def adjust_hsv(img, h_offset=0, s_offset=0, v_offset=0):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(hsv)
    
    # Adjust Hue (wrap around to stay within 0-179)
    h = cv2.add(h, h_offset)
    h = np.mod(h, 180)  # Ensures hue doesn't go out of bounds
    
    # Adjust Saturation & Lightness (clamp to 0-255)
    s = np.clip(cv2.add(s, s_offset), 0, 255)
    v = np.clip(cv2.add(v, v_offset), 0, 255)
    
    final_hsv = cv2.merge((h, s, v))
    return cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)

# Example usage
hue_shifted = adjust_hsv(img, h_offset=30)  # Shift hue by 30 degrees
more_saturated = adjust_hsv(img, s_offset=50)
brighter_lightness = adjust_hsv(img, v_offset=40)

3. Vibrance Adjustment

Vibrance is different from saturation—it boosts the saturation of less-saturated colors without over-saturating already vivid ones. Here’s a practical implementation:

def adjust_vibrance(img, vibrance_factor=0.5):
    # vibrance_factor: 0 (no change) to 1 (max vibrance)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    s = hsv[:, :, 1].astype(np.float32)
    
    # Calculate how saturated each pixel is (0 = grayscale, 1 = fully saturated)
    s_ratio = s / 255.0
    
    # Boost saturation more for dull pixels, leave bright ones mostly untouched
    new_s = s + (255 - s) * vibrance_factor * (1 - s_ratio)
    new_s = np.clip(new_s, 0, 255).astype(np.uint8)
    
    hsv[:, :, 1] = new_s
    return cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)

# Example usage
vibrant_img = adjust_vibrance(img, vibrance_factor=0.7)

This formula ensures dull areas get a noticeable boost, while already vibrant parts don’t look washed out or over-processed.


You can chain these adjustments to get your perfect image:

# Load your image
img = cv2.imread("your_image.jpg")

# Apply adjustments in sequence
adjusted = adjust_brightness_contrast(img, alpha=1.2, beta=15)
adjusted = adjust_hsv(adjusted, s_offset=20)
adjusted = adjust_vibrance(adjusted, vibrance_factor=0.6)

# View the result
cv2.imshow("Final Adjusted Image", adjusted)
cv2.waitKey(0)
cv2.destroyAllWindows()

内容的提问来源于stack exchange,提问作者Antonie Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:33:33