繁体   English   中英

如何将双倍更改为灰度图像?

[英]How to changes doubles to a greyscale image?

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

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

我有的:

在此处输入图片说明

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

我想要的是:

在此处输入图片说明

-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;
}

哦,可爱的分形... :)当您使用从-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));}

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

您可以通过将原色(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]));
    }
}

亮度

灰度的一种更复杂的版本是“发光度”方法。 它也将这些值取平均值,但是它是一个加权平均值,它考虑了人类的感知。

公式为: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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM