Reputation: 2343
I am reading a DNG image having size 3120 x 4208 by RawPy
.
dng = rawpy.imread("TestImages/IMG_20200108_161323.dng")
When debug, I saw dng
has a field named color_matrix
- a numpy array with shape 3x4, it looks like that:
[[ 0.24399559 0.57969594 0.1763085 0. ]
[-0.00469256 0.96858126 0.03611127 0. ]
[-0.00366105 -0.06751718 1.0711782 0. ]]
. According to RawPy document:
Color matrix, read from file for some cameras, calculated for others. Return type:
ndarray
of shape (3,4)
After searching I still do not understand that field. Could you explain it for me, please? Thank you for reading.
Upvotes: 2
Views: 1155
Reputation: 207798
A color-matrix like this:
A B C D
E F G H
I J K L
normally means you calculate the new Red value (Rn), new Green value (Gn) and new Blue value (Bn) from the old Red (Ro), old Green (Go) and old Blue (Bo) like this:
Rn = A*Ro + B*Go + C*Bo + D
Gn = E*Ro + F*Go + G*Bo + H
Bn = I*Ro + J*Go + K*Bo + L
D
, H
and L
are just constant "offsets".
Let's do an example with this image:
So, if you want to swap the Red and Blue channels and make the Green channel into solid 64 you could do this:
#!/usr/bin/env python3
from PIL import Image
# Open image
im = Image.open('start.jpg')
# Define color matrix to swap the red and blue channels and set green to absolute 64
# This says:
# New red = 0*old red + 0*old green + 1*old blue + 0offset
# New green = 0*old red + 0*old green + 0*old blue + 64offset
# New blue = 1*old red + 0*old green + 0*old blue + 0offset
Matrix = ( 0, 0, 1, 0,
0, 0, 0, 64,
1, 0, 0, 0)
# Apply matrix and save
result = im.convert("RGB", Matrix).save('result.png')
Coming to your specific matrix now... The values for F
and K
in your matrix are nearly 1
so, your matrix is performing minimal changes to the Green and Blue channel. However, it is deriving the new Red channel quite heavily from the existing Green channel because B=0.57969594
and the other entries on that first row are low.
Keywords: Python, image processing, Color-matrix, colour matrix, swap channels.
Upvotes: 3