// RGB2YIQ
        public CustomImage <YIQPixel> RGB2YIQ(Color[][] RGBImage, bool normalize = true)
        {
            CustomImage <YIQPixel> image = new CustomImage <YIQPixel>
            {
                Width  = RGBImage[0].Length,
                Height = RGBImage[1].Length
            };

            List <YIQPixel> pixels = new List <YIQPixel>();

            for (int i = 0; i < RGBImage[0].Length; i++)
            {
                for (int j = 0; j < RGBImage[1].Length; j++)
                {
                    // Normalize each pixel value
                    float NR, NG, NB;
                    NR = normalize ? RGBImage[i][j].R / 255.00F : RGBImage[i][j].R;
                    NG = normalize ? RGBImage[i][j].G / 255.00F : RGBImage[i][j].G;
                    NB = normalize ? RGBImage[i][j].B / 255.00F : RGBImage[i][j].B;

                    YIQPixel Pixel = new YIQPixel()
                    {
                        Xpos = i,
                        Ypos = j,
                        Y    = NR * W_RGB2YIQ[0, 0] + NG * W_RGB2YIQ[0, 1] + NB * W_RGB2YIQ[0, 2],
                        I    = NR * W_RGB2YIQ[1, 0] + NG * W_RGB2YIQ[1, 1] + NB * W_RGB2YIQ[1, 2],
                        Q    = NR * W_RGB2YIQ[2, 0] + NG * W_RGB2YIQ[2, 1] + NB * W_RGB2YIQ[2, 2]
                    };
                    pixels.Add(Pixel);
                }
            }

            image.Pixels = pixels;
            return(image);
        }
        public CustomImage <RGBPixel> LumaChrominance(CustomImage <YIQPixel> YIQImage, float alpha = 1.0F, float beta = 1.0F)
        {
            CustomImage <YIQPixel> result = new CustomImage <YIQPixel>
            {
                Width  = YIQImage.Width,
                Height = YIQImage.Height
            };

            List <YIQPixel> pixels = new List <YIQPixel>();

            foreach (var pixel in YIQImage.Pixels)
            {
                YIQPixel YIQModPixel = new YIQPixel
                {
                    Xpos = pixel.Xpos,
                    Ypos = pixel.Ypos,
                    Y    = ValidateYIQ(pixel.Y * alpha, 0F, 1F),
                    I    = ValidateYIQ(pixel.I * beta, -0.5957F, 0.5957F),
                    Q    = ValidateYIQ(pixel.Q * beta, -0.5226F, 0.5226F)
                };
                pixels.Add(YIQModPixel);
            }

            result.Pixels = pixels;
            return(YIQ2RGB(result));
        }
        public CustomImage <RGBPixel> LumaFilter(CustomImage <YIQPixel> YIQImage, string filter, float min = 0.2F, float max = 0.8F)
        {
            CustomImage <YIQPixel> result = new CustomImage <YIQPixel>
            {
                Width  = YIQImage.Width,
                Height = YIQImage.Height
            };

            List <YIQPixel> pixels = new List <YIQPixel>();

            foreach (var pixel in YIQImage.Pixels)
            {
                YIQPixel YIQModPixel = new YIQPixel
                {
                    Xpos = pixel.Xpos,
                    Ypos = pixel.Ypos,
                    I    = ValidateYIQ(pixel.I, -0.5957F, 0.5957F),
                    Q    = ValidateYIQ(pixel.Q, -0.5226F, 0.5226F)
                };

                switch (filter)
                {
                case "Raíz":
                    YIQModPixel.Y = ValidateYIQ((float)Math.Sqrt(pixel.Y), 0, 1);
                    break;

                case "Cuadrado":
                    YIQModPixel.Y = ValidateYIQ((float)Math.Pow(pixel.Y, 2), 0, 1);
                    break;

                case "Lineal a trozos":
                    float n = min / (1 - min);
                    float m = (1 + n) * max;
                    float Y = m * pixel.Y - n;
                    YIQModPixel.Y = ValidateYIQ(Y, 0, 1);
                    break;
                }

                pixels.Add(YIQModPixel);
            }

            result.Pixels = pixels;
            return(YIQ2RGB(result));
        }