【ISP】PS色阶调整算法

1.原理

本博客实现 Photoshop 的色阶调整算法,包括输入动态线性拉伸、伽马变换和输出线性拉伸。

色彩平衡是通过对颜色的调整使图像达到颜色平衡,可以用于调节颜色缺陷或表现效果。

Photoshop 的色阶调整分为输入色阶调整和输出色阶调整。

输入色阶调整有 3 个调节参数:黑场阈值、白场阈值和灰场值:

  • ,输入图像的黑场阈值,input shadows
  • ,输入图像的白场阈值,input hithlight
  • ,中间调,灰场调节值,midtone

输入图像中低于黑场阈值的像素置 0 (黑色),高于白场阈值的像素置 255(白色)。灰场调节值默认值 1.0,调节范围 [0.01, 9.99]。灰场调节值增大的效果是加灰降对比度,减小的效果是减灰加对比度。

输出色阶调整有 2个调节参数:黑场阈值  、白场阈值 ,分别对应着输出图像的最小像素值、最大像素值。

在进行色阶调整时,Photoshop 显示图像的灰度直方图,为用户设置调节参数提供参考。

输出色阶调整方法是基于动态范围进行线性拉伸:

对彩色图像的各个颜色通道可以设置统一的白场、黑场和灰场参数;也可以对 R/G/B 各颜色通道分别设置白场、黑场和灰场参数,对各通道进行独立的色阶调节。但这会导致各通道的拉伸曲线不同,因此可能导致偏色。

2.python实现

实现 Photoshop 的色阶调整算法,包括输入动态线性拉伸、伽马变换和输出线性拉伸。

    # 14.13 Photoshop 色阶调整算法
    def levelAdjust(img, Sin=0, Hin=255, Mt=1.0, Sout=0, Hout=255):
        Sin = min(max(Sin, 0), Hin-2)  # Sin, 黑场阈值, 0<=Sin<Hin
        Hin = min(Hin, 255)  # Hin, 白场阈值, Sin<Hin<=255
        Mt  = min(max(Mt, 0.01), 9.99)  # Mt, 灰场调节值, 0.01~9.99
        Sout = min(max(Sout, 0), Hout-2)  # Sout, 输出黑场阈值, 0<=Sout<Hout
        Hout = min(Hout, 255)  # Hout, 输出白场阈值, Sout<Hout<=255

        difIn = Hin - Sin
        difOut = Hout - Sout
        table = np.zeros(256, np.uint16)
        for i in range(256):
            V1 = min(max(255 * (i-Sin)/difIn,0), 255)  # 输入动态线性拉伸
            V2 = 255 * np.power(V1/255, 1/Mt)  # 灰场伽马调节
            table[i] = min(max(Sout+difOut*V2/255, 0), 255)  # 输出线性拉伸

        imgTone = cv.LUT(img, table)
        return imgTone

    img = cv.imread("../images/buddha01.png", flags=1)  # 读取彩色
    equ1 = levelAdjust(img, 10, 225, 1.0, 10, 245)
    equ2 = levelAdjust(img, 10, 225, 1.2, 10, 245)

    plt.figure(figsize=(9, 6))
    plt.subplot(131), plt.title("origin"), plt.axis('off')
    plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.subplot(132), plt.title("colorEqu1"), plt.axis('off')
    plt.imshow(cv.cvtColor(equ1, cv.COLOR_BGR2RGB))
    plt.subplot(133), plt.title("colorEqu2"), plt.axis('off')
    plt.imshow(cv.cvtColor(equ2, cv.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值