gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:34:29 26 4
gpt4 key购买 nike

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

  • 将图像加载到 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 值的差距来工作吗,或者它绝对必须通过使用欧氏距离来完成?

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

最佳答案

您的代码确实有效,尽管其中有些考虑过度。

试试这个:

The code has been moved to the Update section at the bottom of the post

结果:

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 来协助随机选择颜色;请记住,此函数会在第一个元素和指定的元素之间随机选择。

关于c# - 比较像素中的 RGB 颜色并将其原始颜色更改为最接近的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16095030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com