在将 XYZ 转换为线性 sRGB 期间答案超出范围 [0,1]
during conversion of XYZ to linear sRGB answer is out of range [0,1]
我的任务是将 RGB 图像转换为 LuvImage。
在此域中执行线性拉伸。然后将其转换回 RGB 域。
原图:
[[ 0 0 0]
[255 0 0]
[100 100 100]
[ 0 100 100]]
Luv域线性拉伸后的Luv图像
[[0 , 0, 0],
[100 , 175, 37.7],
[79.64, 0, 0],
[71.2 ,-29.29,-6.339]]
现在,我正在将其转换为 XYZ 图像。答案是,
[[0,0, 0],
[1.5, 1, 0.53],
[0.533, 0.56, 0.61],
[0.344, 0.425, 0.523]]
现在,我正在将它转换成线性 sRGB 图像
通过将图像与 matrix:
相乘
[[3.240479, -1.53715, -0.498535],
[-0.969256, 1.875991, 0.041556],
[0.055648, -0.204043, 1.057311]]
此转换的答案 - 线性 sRGB 图像,
[[0. 0. 0. ],
[3.07132001 0.44046801 0.44082034],
[0.55904669 0.55972465 0.55993322],
[0.20106868 0.4850426 0.48520307]]
这里的问题是第2个像素的sRGB值不在[0,1]的范围内。对于所有其他像素,我得到了正确的值。
def XYZToLinearRGB(self, XYZImage):
'''
to find linearsRGBImage, we multiply XYZImage with static array
[[3.240479, -1.53715, -0.498535],
[-0.969256, 1.875991, 0.041556],
[0.055648, -0.204043, 1.057311]]
'''
rows, cols, bands = XYZImage.shape # bands == 3
linearsRGBImage = np.zeros([rows, cols, bands], dtype=float)
multiplierMatrix = np.array([[3.240479, -1.53715, -0.498535],
[-0.969256, 1.875991, 0.041556],
[0.055648, -0.204043, 1.057311]])
for i in range(0, rows):
for j in range(0, cols):
X,Y,Z = XYZImage[i,j]
linearsRGBImage[i,j] = np.matmul(multiplierMatrix, np.array([X,Y,Z]))
#for j -ends
#for i -ends
return linearsRGBImage
此转换的代码如上。有人可以指出我在第二个像素上做错了什么,以及如何解决它吗?
好吧,我在研究后发现的一个简单解决方案就是裁剪值。
因此,如果该值超出范围,假设 r<0,那么我们会将 r 指定为 0。
对于较大的值也是如此。如果 r>1(在我的例子中是 3.07),我们会将 r 指定为 1。
所以我的代码的最新版本:
def XYZToLinearRGB(self, XYZImage):
'''
to find linearsRGBImage, we multiply XYZImage with static array
[[3.240479, -1.53715, -0.498535],
[-0.969256, 1.875991, 0.041556],
[0.055648, -0.204043, 1.057311]]
'''
rows, cols, bands = XYZImage.shape # bands == 3
linearsRGBImage = np.zeros([rows, cols, bands], dtype=float)
multiplierMatrix = np.array([[3.240479, -1.53715, -0.498535],
[-0.969256, 1.875991, 0.041556],
[0.055648, -0.204043, 1.057311]])
for i in range(0, rows):
for j in range(0, cols):
X,Y,Z = XYZImage[i,j]
rgbList = np.matmul(multiplierMatrix, np.array([X,Y,Z]))
for index, val in enumerate(rgbList):
if val<0:
rgbList[index]=0
#if val -ends
if val>1:
rgbList[index]=1
#if val -ends
#for index, val -ends
linearsRGBImage[i,j]=rgbList
#for j -ends
#for i -ends
return linearsRGBImage
如有更好的建议,欢迎提出。
我的任务是将 RGB 图像转换为 LuvImage。 在此域中执行线性拉伸。然后将其转换回 RGB 域。
原图:
[[ 0 0 0]
[255 0 0]
[100 100 100]
[ 0 100 100]]
Luv域线性拉伸后的Luv图像
[[0 , 0, 0],
[100 , 175, 37.7],
[79.64, 0, 0],
[71.2 ,-29.29,-6.339]]
现在,我正在将其转换为 XYZ 图像。答案是,
[[0,0, 0],
[1.5, 1, 0.53],
[0.533, 0.56, 0.61],
[0.344, 0.425, 0.523]]
现在,我正在将它转换成线性 sRGB 图像 通过将图像与 matrix:
相乘[[3.240479, -1.53715, -0.498535],
[-0.969256, 1.875991, 0.041556],
[0.055648, -0.204043, 1.057311]]
此转换的答案 - 线性 sRGB 图像,
[[0. 0. 0. ],
[3.07132001 0.44046801 0.44082034],
[0.55904669 0.55972465 0.55993322],
[0.20106868 0.4850426 0.48520307]]
这里的问题是第2个像素的sRGB值不在[0,1]的范围内。对于所有其他像素,我得到了正确的值。
def XYZToLinearRGB(self, XYZImage):
'''
to find linearsRGBImage, we multiply XYZImage with static array
[[3.240479, -1.53715, -0.498535],
[-0.969256, 1.875991, 0.041556],
[0.055648, -0.204043, 1.057311]]
'''
rows, cols, bands = XYZImage.shape # bands == 3
linearsRGBImage = np.zeros([rows, cols, bands], dtype=float)
multiplierMatrix = np.array([[3.240479, -1.53715, -0.498535],
[-0.969256, 1.875991, 0.041556],
[0.055648, -0.204043, 1.057311]])
for i in range(0, rows):
for j in range(0, cols):
X,Y,Z = XYZImage[i,j]
linearsRGBImage[i,j] = np.matmul(multiplierMatrix, np.array([X,Y,Z]))
#for j -ends
#for i -ends
return linearsRGBImage
此转换的代码如上。有人可以指出我在第二个像素上做错了什么,以及如何解决它吗?
好吧,我在研究后发现的一个简单解决方案就是裁剪值。 因此,如果该值超出范围,假设 r<0,那么我们会将 r 指定为 0。 对于较大的值也是如此。如果 r>1(在我的例子中是 3.07),我们会将 r 指定为 1。
所以我的代码的最新版本:
def XYZToLinearRGB(self, XYZImage):
'''
to find linearsRGBImage, we multiply XYZImage with static array
[[3.240479, -1.53715, -0.498535],
[-0.969256, 1.875991, 0.041556],
[0.055648, -0.204043, 1.057311]]
'''
rows, cols, bands = XYZImage.shape # bands == 3
linearsRGBImage = np.zeros([rows, cols, bands], dtype=float)
multiplierMatrix = np.array([[3.240479, -1.53715, -0.498535],
[-0.969256, 1.875991, 0.041556],
[0.055648, -0.204043, 1.057311]])
for i in range(0, rows):
for j in range(0, cols):
X,Y,Z = XYZImage[i,j]
rgbList = np.matmul(multiplierMatrix, np.array([X,Y,Z]))
for index, val in enumerate(rgbList):
if val<0:
rgbList[index]=0
#if val -ends
if val>1:
rgbList[index]=1
#if val -ends
#for index, val -ends
linearsRGBImage[i,j]=rgbList
#for j -ends
#for i -ends
return linearsRGBImage
如有更好的建议,欢迎提出。