如何更改加倍到灰度图像?

时间:2014-06-13 10:04:51

标签: c# bitmap perlin-noise

我创建了一个1024 x 1024值的二维数组,范围从-1到1,但我不知道我应该如何将其更改为灰度图像。

我一直在做的是为某些值指定某种颜色,但这不是我想要的。

我有什么:

enter image description here

介于-1和1之间的特定值范围以非连续方式映射到不同的颜色(请参阅下面的代码段)

我想要的是什么:

enter image description here

-1到1之间的值被映射到灰度,从黑色-1到白色1均匀变化,反之亦然

当前版本的代码

private void button1_Click(object sender, EventArgs e)
{
    sw.Start();
    LibNoise.Perlin perlinMap = new LibNoise.Perlin();
    perlinMap.Lacunarity = lacunarity + 0.01d;
    perlinMap.NoiseQuality = LibNoise.NoiseQuality.High;
    perlinMap.OctaveCount = octaveCount;
    perlinMap.Persistence = persistence;
    perlinMap.Frequency = frequency;
    perlinMap.Seed = 1024;

    if (radioButton1.Checked)
        perlinMap.NoiseQuality = LibNoise.NoiseQuality.Low;
    else if (radioButton2.Checked)
        perlinMap.NoiseQuality = LibNoise.NoiseQuality.Standard;
    else if (radioButton3.Checked)
        perlinMap.NoiseQuality = LibNoise.NoiseQuality.High;

    double sample = trackBar6.Value * 10;

    double[,] perlinArray = new double[resolutieX, resolutieY];
    for (int x = 0; x < resolutieX; x++)
    {
        for (int y = 0; y < resolutieY; y++)
        {
            perlinArray[x, y] = perlinMap.GetValue(x / sample, y / sample, 1d);
        }
    }
    draw(perlinArray);
    textBox12.Text = sw.ElapsedMilliseconds.ToString() + "ms";
    sw.Reset();
}

public void draw(double[,] array)
{
    Color color = Color.DarkBlue;
    // Bitmap b = new Bitmap(1, 1);


    Color[,] colorArray = new Color[resolutieX, resolutieY];
    Bitmap afbeelding = new Bitmap( 1024, 1024);

    // int tileSize = 1024 / resolutieY;

    for (int y = 1; y < resolutieY; y++)
    {
        for (int x = 1; x < resolutieX; x++)
        {

            colorArray[x, y] = array[x, y] <= 0.0 ? Color.DarkBlue :
                array[x, y] <= 0.1 ? Color.Blue :
                array[x, y] <= 0.2 ? Color.Beige :
                array[x, y] <= 0.22 ? Color.LightGreen :
                array[x, y] <= 0.40 ? Color.Green :
                array[x, y] <= 0.75 ? Color.DarkGreen :
                array[x, y] <= 0.8 ? Color.LightSlateGray :
                array[x, y] <= 0.9 ? Color.Gray :
                array[x, y] <= 1.0 ? Color.DarkSlateGray :
                Color.DarkSlateGray;

            //   colorArray[]
            // afbeelding.SetPixel(x, y, color);


        }
    }
    for (int y = 1; y < resolutieY; y++)
    {
        for (int x = 1; x < resolutieX; x++)
        {
            afbeelding.SetPixel(x, y, colorArray[x, y]);
        }
    }

    pictureBox1.Image = afbeelding;
}

2 个答案:

答案 0 :(得分:2)

哦,可爱的分形...... :) 当您使用从-1到1的2d向量时,您必须将其重新计算为0..255。你的功能是

  

f(x)= 255 *(x + 1)/ 2

然后你要做的就是用f(x)

创建一个2D颜色矢量
  

foreach(2dVector中的int值)       {       2dColorVector.add(new Color.fromArgb(255,f(x),f(x),f(x));       }

是伪代码,但我认为你可以清楚地理解它:)

答案 1 :(得分:0)

您可以通过将原色(RGB)设置为相等的值来获得灰度图像。

实现此目的的一种方法是创建一个函数来计算您拥有的颜色的RGB分量的平均值,然后将每个分量设置为平均值。

示例 - 平均方法

Color ToGrayscale(Color c)
{
    int avg = (c.R + c.G + c.B)/3;
    return Color.FromArgb(avg, avg, avg);
}

然后为每个输出像素应用该函数:

for (int y = 1; y < resolutieY; y++)
{
    for (int x = 1; x < resolutieX; x++)
    {
        afbeelding.SetPixel(x, y, ToGrayscale(colorArray[x, y]));
    }
}

<强>光度

更复杂的灰度级版本是Luminosity方法。它还对这些值进行平均,但这是一个将人类感知考虑在内的加权平均值。

公式为:0.2126 *红色+ 0.7152 *绿色+ 0.0722 *蓝色。

您可以看到公式如何对人眼最敏感的颜色进行加权。

要查看这种替代方法是否适合您的项目,您只需使用亮度公式来计算平均值:

Color ToGrayscaleLuminosity(Color c)
{
    var avg = (int)Math.Round(0.2126 * c.R + 0.7152 * c.G + 0.0722 * c.B);
    return Color.FromArgb(avg, avg, avg);
}