簡體   English   中英

比較像素中的RGB顏色並將其原始顏色更改為最接近的顏色

[英]Compare RGB colors in a pixel and change its original color to the closest one

我的任務需要幫助。 基本上,這就是我想要做的:

  • 將圖像加載到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值的差距來實現,或者它必須通過使用歐幾里德距離完成嗎?

如果您不介意,請告訴我如何解決這個問題或者如何編寫代碼。 我讀過一個非常相似的問題,但給出的答案仍然沒有給我一些線索。

你的代碼實際上是有效的,盡管有一些過度的思考。

試試這個:

代碼已移至 帖子底部的“更新” 部分

結果:

結果


我已經刪除了過度思考的部分。

  • 沒有理由(至少從閱讀你的問題)為什么你需要反轉顏色分量值;

    1. 簡單地做R = pixelColor.R就足夠了;

    2. 通過這個,您不必將其視為“紅色含量最少 ”,而是“ 如果紅色含量最多則為 紅色 !”

  • 正如LightStriker指出的那樣 :您缺少(代碼中沒有任何地方)將新值設置回圖像的代碼;

    1. 這是使用img.SetPixel(x, y, pixelColor)
  • 我添加了一個else子句來匹配沒有單個顏色分量大於其他顏色分量的像素。

    1. 例如,黃色(255,255,0)將不符合您的規則;

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


更新:根據以下評論要求進一步澄清。 以下是添加更多條件語句的方法:

// 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來幫助隨機選擇顏色; 請記住,此函數將在第一個元素和指定的元素之間隨機選擇。

以下是反轉所有顏色。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM