比较像素中的RGB颜色并将其原始颜色更改为最接近的颜色

时间:2013-04-18 23:56:09

标签: c# colors pixel rgb

我的作业需要帮助。基本上,这就是我想要做的事情:

  • 将图片加载到PictureBox
  • 计算每个像素中255(最大值)和R值之间的差值,以及255和G值之间的差值,以及B值的差值
  • 从上面的计算中,最小绝对值将表示像素的颜色更接近该颜色(例如:(255-R值)具有最小的绝对值,因此像素更接近该颜色)
  • 将像素颜色更改为更接近的颜色(在上面的示例中,表示将其更改为红色)
  • 在输出图片框中显示结果

结果,我将获得具有这三种基色的图像。

我写了这样的代码:

    Bitmap img = new Bitmap(InputPictureBox.Image);
        byte R, G, B;
        Color pixelColor;
        for (int x = 0; x < img.Width; x++)
        {
            for (int y = 0; y < img.Height; y++)
            {
                pixelColor = img.GetPixel(x, y);
                R = (byte) Math.Abs(pixelColor.R - 255);
                G = (byte) Math.Abs(pixelColor.G - 255);
                B = (byte) Math.Abs(pixelColor.B - 255);

                if (R < G && R < B)
                {
                    pixelColor = Color.Red;
                }
                else if (G < R && G < B)
                {
                    pixelColor = Color.Green;
                }
                else if (B < R && B < G)
                {
                    pixelColor = Color.Blue;
                }
            }
        }
  OutputPictureBox.Image = img;

问题是彩色图像然后转向反转。那么,我的代码有什么问题?我假设if语句不起作用,但我不知道为什么。我错了吗?

还有一个与我上面的代码相关的问题,它是否可以通过简单地计算R / G / B值的差距来实际工作,或者它必须通过使用欧几里德距离来完成?

如果您不介意,请告诉我如何解决这个问题或者如何编写代码。我读过一个非常相似的问题,但给出的答案仍然没有给我一些线索。

2 个答案:

答案 0 :(得分:4)

你的代码确实有效,尽管有一些过度的思考。

试试这个:

  

代码已移至帖子底部的更新部分

结果:

Result


我删除了过度思考的部分。

  • 没有理由(至少在阅读您的问题时)为什么需要反转颜色分量值;

    1. 只需R = pixelColor.R即可;

    2. 通过这个必须将其视为“ 数量< 红色“,而是,”如果它的最多红色,则红色!“

  • 作为LightStriker pointed out:您缺少(代码中没有任何地方)将新值重新设置回图像的代码;

    1. 这是使用img.SetPixel(x, y, pixelColor)完成的。
  • 我添加了else子句来匹配没有单一颜色成分大于其他像素的像素。

    1. 例如,黄色(255,255,0)与您的规则不匹配;

    2. 使用此答案中的版本,它会被Black像素替换。


更新comments below要求进一步说明。以下是添加更多条件语句的方法:

// NEW (start) --------------------------------------------------
Color[] randomizedColors = new Color[] { Color.Red, Color.Green, Color.Blue };
Random randomizer = new Random();
// NEW (end) --------------------------------------------------

Bitmap img = new Bitmap(InputPictureBox.Image);
byte R, G, B;
Color pixelColor;

// NEW (start) --------------------------------------------------
Func<int, Color> ColorRandomizer = (numberOfColors) =>
{
    if (numberOfColors > randomizedColors.Length)
    {
        numberOfColors = randomizedColors.Length;
    }
    return randomizedColors[randomizer.Next(numberOfColors)];
};
// NEW (end) --------------------------------------------------

for (int x = 0; x < img.Width; x++)
{
    for (int y = 0; y < img.Height; y++)
    {
        pixelColor = img.GetPixel(x, y);
        R = pixelColor.R;
        G = pixelColor.G;
        B = pixelColor.B;

        if (R > G && R > B)
        {
            pixelColor = Color.Red;
        }
        else if (G > R && G > B)
        {
            pixelColor = Color.Green;
        }
        else if (B > R && B > G)
        {
            pixelColor = Color.Blue;
        }
// NEW (start) --------------------------------------------------
        else if (pixelColor == Color.Yellow)
        {
            // 2 = Red or Green
            pixelColor = ColorRandomizer(2);
        }
        else if (pixelColor = Color.FromArgb(152, 152, 152))
        {
            // 3 = Red, Green, or Blue
            pixelColor = ColorRandomizer(3);
        }
        /* else if (pixelColor = Some_Other_Color)
        {
            // 3 = Red, Green, or Blue
            pixelColor = ColorRandomizer(3);
        } */
// NEW (end) --------------------------------------------------
        else
        {
            pixelColor = Color.Black;
        }
        img.SetPixel(x, y, pixelColor);
    }
}

OutputPictureBox.Image = img;

使用此更新代码,将应该随机选取的所有颜色添加到randomizedColors数组中。使用lambda函数ColorRandomizer来帮助随机选择颜色;请记住,此函数将在第一个元素和指定的元素之间随机选择。

答案 1 :(得分:0)

以下是反转所有颜色。

R = (byte) Math.Abs(pixelColor.R - 255);
G = (byte) Math.Abs(pixelColor.G - 255);
B = (byte) Math.Abs(pixelColor.B - 255);

您可以使用:

R = (byte) pixelColor.R;
G = (byte) pixelColor.G;
B = (byte) pixelColor.B;