当前位置: 首页 > article >正文

【图像处理】OpenCv + Python 实现 Photoshop 中的色彩平衡功能

前言

这是使用 python 和 OpenCv 实现的 Photoshop 中色彩平衡功能的代码,可以设置阴影,高光和中间调的色调参数来调整图片的色彩平衡。

参考文章二也有 python 版本的代码实现,虽然中间调的部分貌似没有实现,但是理论部分讲解还是不错的。

我的代码是基于参考文章一中的 Matlab 代码转写实现的。

代码

import cv2
import numpy as np

def normalize_coeffs(coeffs):
    median_val = sorted(coeffs)[1]
    return np.array([coef - median_val for coef in coeffs])

def highlight_handle(img, highlight_coeffs):
    highlights_alpha = 0.003923 * normalize_coeffs(highlight_coeffs)

    a = np.diag(np.maximum(highlights_alpha, 0)) * np.eye(3)
    b = np.diag(-np.minimum(highlights_alpha, 0)) * (1 - np.eye(3))

    highlights_alpha = np.sum(a + b, axis=0)
    img = img / (1 - highlights_alpha.reshape(1, 1, 3))
    return img

def shadow_handle(img, shadows_coef):
    shadows_alpha = 0.003923 * normalize_coeffs(shadows_coef)

    a = np.diag(-np.minimum(shadows_alpha, 0)) * np.eye(3)
    b = np.diag(np.maximum(shadows_alpha, 0)) * (1 - np.eye(3))
    shadows_alpha = np.sum(a + b, axis=0)

    img = (img - shadows_alpha.reshape(1, 1, 3)) / (1 - shadows_alpha.reshape(1, 1, 3))
    return img

def mid_tone_handle(img, mid_tone_coeffs):  
    mid_tone_alpha = -0.0033944 * normalize_coeffs(mid_tone_coeffs)

    f = np.diag(mid_tone_alpha) * (2 * np.eye(3) - 1)
    mid_tone_gamma = np.exp(np.sum(f, axis=0))

    img = np.power(img, mid_tone_gamma.reshape(1, 1, 3))
    return img

def img_bgr2rgb(img):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
    img = img.astype(np.float32) / 255.0
    img = img.copy()
    return img

def img_rgb2bgr(img):
    img = cv2.normalize(img, None, 0, 255, cv2.NORM_MINMAX)
    img = img.astype(np.uint8)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
    return img

def display(image):
    cv2.namedWindow("img", cv2.WINDOW_NORMAL)
    cv2.imshow("img", image)
    cv2.waitKey()

def main(
        image_path,
        shadow_coefficients,
        mid_tone_coefficients,
        highlight_coefficients
):
    image = cv2.imread(image_path)
    image = img_bgr2rgb(image)
    
    image = highlight_handle(image, highlight_coefficients)
    image = shadow_handle(image, shadow_coefficients)
    image = mid_tone_handle(image, mid_tone_coefficients)
    
    image = np.clip(image, 0, 1)
    image = img_rgb2bgr(image)
    
    display(image)

if __name__ == '__main__':
    main(
        image_path=r"C:\Users\XXXX\Desktop\capture.png",
        shadow_coefficients=[0, 0, 0],
        mid_tone_coefficients=[0, 0, 0],
        highlight_coefficients=[0, 0, 0],
    )

参考文章:

  • Photoshop 中的色彩平衡调整图层的原理分析
  • PS 色彩平衡之算法公式原理详解及 Python 实现

http://www.kler.cn/a/466336.html

相关文章:

  • springboot远程链接spark
  • SpringMVC(六)拦截器
  • RabbitMQ实现生产者消费者
  • 蓝桥杯备赛:C++基础,顺序表和vector(STL)
  • GESP真题 | 2024年12月1级-编程题2《奇数和偶数》及答案(Python版)
  • 理解linux内核中的几种地址
  • 机器学习经典算法——逻辑回归
  • 在K8S中,Pod请求另一个Pod偶尔出现超时或延迟,如何排查?
  • 【LeetCode】803、打砖块
  • BurpSuite2024.11
  • JLINK V9插入电脑没反应
  • 基于深度学习的视觉检测小项目(二) 环境和框架搭建
  • pytorch张量高级索引介绍
  • Sublime Text4 4189 安装激活【 2025年1月3日 亲测可用】
  • LLM 中的 Decoder Only
  • df.set_index(‘name‘).groupby(‘team‘).apply(first_3, ‘Q1‘)
  • 被催更了,2025元旦源码继续免费送
  • 一文讲清楚webpack和vite原理
  • Vue 快速入门:开启前端新征程
  • 像品茶一样品设计模式,早日突破编码新境界。
  • 2025 年软件行业展望:除了 AI,还有更多精彩
  • STM32CUBE快速入门02
  • 免费下载 | 2024网络安全产业发展核心洞察与趋势预测
  • 【VUE】使用create-vue快速创建一个vue + vite +vue-route 等其他查看的工程
  • 私享樱花盛景:滨江一品苑,尊享春日浪漫
  • df.groupby()方法使用表达式分组