我创建了一个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;
}
答案 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);
}