xyz2yuv/colorspace/yuv.go
2024-02-19 20:06:49 +01:00

36 lines
827 B
Go

package colorspace
import "gonum.org/v1/gonum/mat"
type YCbCrConverter struct {
Kr, Kg, Kb float64
}
func (c YCbCrConverter) ConversionRGB() (to, from *mat.Dense) {
const half = 1. / 2.
RgbToYPbPr := mat.NewDense(3, 3, []float64{
c.Kr, c.Kg, c.Kb,
-half * (c.Kr / (1 - c.Kb)), -half * (c.Kg / (1 - c.Kb)), half,
half, -half * (c.Kg / (1 - c.Kr)), -half * (c.Kb / (1 - c.Kr)),
})
YPbPrToRgb := mat.NewDense(3, 3, []float64{
1, 0, 2 - 2*c.Kr,
1, -(c.Kb / c.Kg) * (2 - 2*c.Kb), -(c.Kr / c.Kg) * (2 - 2*c.Kr),
1, 2 - 2*c.Kb, 0,
})
return YPbPrToRgb, RgbToYPbPr
}
func NewYCbCrConverter(kr, kg, kb float64) YCbCrConverter {
return YCbCrConverter{
Kr: kr,
Kg: kg,
Kb: kb,
}
}
var YCbCr_Rec709 = NewYCbCrConverter(0.2126, 0.7152, 0.0722)
var YCbCr_Rec2020 = NewYCbCrConverter(0.2127, 0.6780, 0.0593)