【问题标题】:How to convert from sRGB to linear sRGB for computing the color correction matrix in opencv? (CCM)如何从 sRGB 转换为线性 sRGB 以计算 opencv 中的颜色校正矩阵? (CCM)
【发布时间】:2019-11-23 18:26:05
【问题描述】:

我参考了以下stackoverflow thread 来计算颜色校正矩阵。

正如上面提到的线程中提到的,我想从 sRGB 颜色空间转换为线性 sRGB 空间,我正在尝试使用pwkit colorspace mapper 代码进行转换。

但是,我不确定生成的线性 sRGB 值,因为该函数需要 [0-1] 范围内的 sRGB,将 sRGB 值除以 255.0,正确的方法是什么?如何验证函数返回的线性 sRGB 值是否正确?

import os
import numpy as np
import cv2 
import matplotlib.pyplot as plt

def srgb_to_linsrgb (srgb):
    """Convert sRGB values to physically linear ones. The transformation is
       uniform in RGB, so *srgb* can be of any shape.

       *srgb* values should range between 0 and 1, inclusively.

    """
    gamma = ((srgb + 0.055) / 1.055)**2.4
    scale = srgb / 12.92
    return np.where (srgb > 0.04045, gamma, scale)


if __name__ == "__main__":

    colorChecker = cv2.imread('C:/Users/Ai/Documents/Urine Sample Analysis/Assets/colorchecker_1.jpg')
    cc = cv2.cvtColor(colorChecker,cv2.COLOR_BGR2RGB)
    plt.imshow(cc)

    #Convert srgb to linear rgb
    cc = cc / 255.0
    cc1 = srgb_to_linsrgb(cc)
    print("Conversion from sRGB to linear RGB:\n")
    print(cc1[1,1,:])

转换结果为:[0.30946892 0.23455058 0.19806932]

输入的 sRGB 应该在 0-1 之间,如何将 sRGB 通道的值从 [0-255] 缩放到 [0-1],简单除以 255.0 会产生正确的线性 sRGB 值吗?如何验证转换是否产生了正确的线性 sRGB 值?

【问题讨论】:

    标签: python opencv image-processing colors


    【解决方案1】:

    从术语的角度来看,假设您的图像是有效的 sRGB 编码,即遵循 IEC 61966-2-1:1999,您正在通过应用 sRGB 电光传递函数 (EOTF) 解码 sRGB 编码的非线性光值,一种颜色分量传递函数(CCTF)因此说:

    我想从 sRGB 颜色空间转换为线性 RGB 空间

    不正确,因为您仍在有效地使用 sRGB 编码颜色,唯一的区别是在使用解码 CCTF 之前,它们是非线性编码的。加法 RGB 颜色空间由一组三个组件定义:原色、白点和 CCTF。通过使用 CCTF,您并没有改变所有的原色或白点,即色域是相同的,因此您应该说的更多的是这些方面:

    我想从 sRGB 颜色空间转换为线性 sRGB 颜色空间

    现在要验证您的方法是否正确,您可以与参考实现进行比较,例如 Colour,其代码在您引用的 SO 线程中使用:在使用 sRGB 逆 EOTF 进行非线性编码时,18% 灰度为 118:

    >>> int(round(colour.models.eotf_inverse_sRGB(0.18) * 255))
    118
    

    从那里您可以检查您的方法是否确实转换回 18%,并且确实如此(不考虑四舍五入)!

    0.18116424424986022
    

    【讨论】:

    • 嗨,非常感谢您澄清了一些重要概念,也感谢您分享有关 Color lib,我尝试使用我的代码并通过首先对其进行归一化来转换 18% 灰度值 (118,118,118) ( (118,118,118) / 255.0) 得到结果:0.18116424。
    猜你喜欢
    • 2022-12-10
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2020-08-09
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多