Swe*_*edi 4 python opencv colors image-processing
我参考了以下stackoverflow 线程来计算颜色校正矩阵。
正如上面提到的线程中提到的,我想从 sRGB 颜色空间转换为线性 sRGB 空间,我尝试使用 pwkit颜色空间映射器代码进行转换。
但是,我不确定生成的线性 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,:])
Run Code Online (Sandbox Code Playgroud)
转换的结果为:[0.30946892 0.23455058 0.19806932]
输入 sRGB 应在 0-1 之间,如何将 sRGB 通道的值从 [0-255] 缩放到 [0-1],简单除以 255.0 会得到正确的线性 sRGB 值吗?如何验证转换是否产生了正确的线性 sRGB 值?
从术语的角度来看,假设您的图像有效地进行了 sRGB 编码,即遵循 IEC 61966-2-1:1999,您将通过应用 sRGB 电光传递函数 (EOTF)(一种颜色分量传递函数(CCTF)因此说:
我想从 sRGB 颜色空间转换为线性 RGB 空间
不正确,因为您仍然有效地使用 sRGB 编码颜色,唯一的区别是在使用解码 CCTF 之前它们是非线性编码的。加性 RGB 色彩空间由一组三个组件定义:原色、白点和 CCTF。通过使用 CCTF,您没有改变所有原色或白点,即色域是相同的,因此您应该说的是更多这样的内容:
我想从 sRGB 色彩空间转换为线性 sRGB 色彩空间
现在,为了验证您的方法是否正确,您可以与参考实现(例如Color)进行比较,其代码在您引用的 SO 线程中使用:使用 sRGB 逆 EOTF 进行非线性编码时,18% 灰度为 118:
>>> int(round(colour.models.eotf_inverse_sRGB(0.18) * 255))
118
Run Code Online (Sandbox Code Playgroud)
从那里您可以检查您的方法是否确实转换回 18%,并且确实如此(忽略四舍五入)!
0.18116424424986022
Run Code Online (Sandbox Code Playgroud)