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

C# 比较像素中的RGB颜色,并将其原始颜色更改为最接近的颜色,c#,colors,pixel,rgb,C#,Colors,Pixel,Rgb,我的任务需要帮助。基本上,这就是我想要做的: 将图像加载到PictureBox 计算每个像素中255(最大值)和R值之间的差值,255和G值之间的差值,以及B值之间的差值 根据上述计算,最小绝对值表示像素的颜色更接近该颜色(例如:(255-R值)具有最小绝对值,因此像素更接近该颜色) 将像素颜色更改为更接近的颜色(在上面的示例中,这意味着将其更改为红色) 在输出图片框中显示结果 因此,我将获得具有这三种原色的图像 我编写了如下代码: Bitmap img = new Bitmap(I

我的任务需要帮助。基本上,这就是我想要做的:

  • 将图像加载到
    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;
Bitmap img=新位图(InputPictureBox.Image);
字节R,G,B;
彩色像素;
对于(int x=0;x
问题是,彩色图像随后会反转。那么,我的代码出了什么问题?我假设
if
语句不起作用,但我不知道为什么。我错了吗

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


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

下面是反转所有颜色

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;

您的代码实际上是有效的,尽管其中有一些过度思考

试试这个:

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

结果:


我已经删除了过度思考的部分

  • 没有理由(至少从阅读您的问题)需要反转颜色分量值

  • 简单地做
    R=pixelColor.R
    就足够了

  • 通过这一点,你不必把它看作是“哪一个拥有最少的 “红色”,而是“如果它的红色量最多,它就是红色”!”

  • As:您缺少(代码中没有)将新值设置回图像的代码

  • 这是使用
    img.SetPixel(x,y,pixelColor)
    实现的
  • 我添加了一个
    else
    子句来匹配没有单色分量大于其他两种分量的像素

  • 例如,黄色(255,255,0)将不符合您的规则

  • 使用此答案中的版本,它将被一个
    黑色
    像素替换


更新:按照要求进一步澄清的要求。以下是如何添加更多条件语句:

// 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;
//新建(开始)--------------------------------------------------
Color[]randomizedColors=新颜色[]{Color.Red,Color.Green,Color.Blue};
随机随机发生器=新随机();
//新(完)--------------------------------------------------
位图img=新位图(InputPictureBox.Image);
字节R,G,B;
彩色像素;
//新(开始)--------------------------------------------------
Func ColorRandomizer=(numberOfColors)=>
{
如果(NumberOfColor>RandomizedColor.Length)
{
NumberOfColor=随机颜色。长度;
}
返回randomizedColors[randomizer.Next(numberOfColors)];
};
//新(完)--------------------------------------------------
对于(int x=0;xG&&R>B)
{
pixelColor=颜色。红色;
}
否则如果(G>R&&G>B)
{
pixelColor=Color.Green;
}
否则如果(B>R&B>G)
{
pixelColor=颜色。蓝色;
}
//新(开始)--------------------------------------------------
else if(pixelColor==Color.Yellow)
{
//2=红色或绿色
pixelColor=颜色随机化器(2);
}
else if(pixelColor=Color.FromArgb(152152152))
{
//3=红色、绿色或蓝色
pixelColor=色彩随机化器(3);
}
/*else if(像素颜色=某些其他颜色)
{
//3=红色、绿色或蓝色
pixelColor=色彩随机化器(3);
} */
//新(完)--------------------------------------------------
其他的
{
pixelColor=颜色。黑色;
}
img.SetPixel(x,y,pixelColor);
}
}
OutputPictureBox.Image=img;
使用此更新的代码,将所有应随机拾取的颜色添加到
randomizedColors
数组中。使用lambda函数,
ColorRandomizer
,帮助随机选择颜色;请记住,此函数将在第一个元素和指定元素之间随机选择。

使用m访问位图数据