我正在开展图像处理项目。
我想为图像绘制直方图。我从图像中得到红色,但我不知道如何将其绘制为直方图,所以我需要你的帮助。
这是我的代码:
class MainClass
{
public static void Main(string[] args)
{
Bitmap bmp = new Bitmap("F://DSC_0242.jpg");
int[] histogram_r = new int[255];
int max = 0;
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
histogram_r[bmp.GetPixel(i,j).R]++;
if (max < histogram_r[bmp.GetPixel(i,j).R])
max = histogram_r[bmp.GetPixel(i,j).R];
}
}
Bitmap img = new Bitmap(256, max + 10);
Point[] points = new Point[256];
for (int i = 0; i < histogram_r.Length; i++)
{
points[i] = new Point(i, img.Height-(histogram_r.Length/100));
}
}
}
答案 0 :(得分:6)
首先,您需要声明直方图数组的大小为256而不是255.我在下面的代码中进行了一些通用清理,但与您的问题相关的内容如下...
我使用了Win7中包含的一个示例文件,因此您必须将其更改为您的图片。我也将直方图输出到临时文件夹,所以你也需要做任何事情。
private void Test()
{
Bitmap bmp = new Bitmap(@"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg");
int[] histogram_r = new int[256];
float max = 0;
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
int redValue = bmp.GetPixel(i, j).R;
histogram_r[redValue]++;
if (max < histogram_r[redValue])
max = histogram_r[redValue];
}
}
int histHeight = 128;
Bitmap img = new Bitmap(256, histHeight + 10);
using (Graphics g = Graphics.FromImage(img))
{
for (int i = 0; i < histogram_r.Length; i++)
{
float pct = histogram_r[i] / max; // What percentage of the max is this value?
g.DrawLine(Pens.Black,
new Point(i, img.Height - 5),
new Point(i, img.Height - 5 - (int)(pct * histHeight)) // Use that percentage of the height
);
}
}
img.Save(@"c:\temp\test.jpg");
}
}
}
答案 1 :(得分:0)
很抱歉做出答案,我没有足够的声誉在现有答案中添加评论。
@dazedandconfused的答案正确率为99.9%。当将“ pct”作为单位百分比时,我只会添加一个强制转换为浮点数。
基本上:
float pct = (float)histogram_r[i] / max;
我略过了该方法,只绘制了较大的直方图以获得更好的视图:
public void DrawHistogram(int[] histogram)
{
var histogramHeight = 256;
var bitmap = new Bitmap(1024, histogramHeight);
using (Graphics graphics = Graphics.FromImage(bitmap))
{
for (int i = 0; i < histogram.Length; i++)
{
float unit = (float)histogram[i] / histogram.Max();
graphics.DrawLine(Pens.Black,
new Point(i * 4, histogramHeight - 5),
new Point(i * 4, histogramHeight - 5 - (int)(unit * histogramHeight)));
}
}
bitmap.Save(filename: @"C:\test\result.jpg");
}