36 lines
827 B
Go
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)
|