我有一些列表代表一些图像的像素值,每个图像由0和1组成。我的问题是如何才能获得所有元素数为零的平均值,并将其表示在相同元素编号的新列表中,并为所有其他元素重复该过程? (获取所有元素的平均值,零,一,二和......)。因此,最终列表应与我的所有其他列表的长度相同,而每个元素都是所有其他列表的平均值。
答案 0 :(得分:1)
伪代码:
averageImage = new image(size of source image)
for each image in list:
for each pixel in image:
add pixel to averageImage
averageImage = averageImage / numberOfSourceImages
答案 1 :(得分:1)
我写了这篇文章,但重读了你的问题并意识到它可能不符合你的要求。
尽管如此,它需要任意数量的Bitmap
并平均其颜色。只需输入List<Bitmap>
并致电ToBitmap()
即可。
public class BitmapAverage {
private readonly List<Bitmap> _bmps;
public BitmapAverage(List<Bitmap> bmps) {
_bmps = bmps;
}
private struct ColorAverage {
public int A { get; set; }
public int R { get; set; }
public int G { get; set; }
public int B { get; set; }
}
private Bitmap _averageImages() {
var colors = new ColorAverage[_bmps.First().Width, _bmps.First().Height];
foreach (var bmp in _bmps) {
for (var x = 0; x < bmp.Width; x++) {
for (var y = 0; y < bmp.Height; y++) {
var color = bmp.GetPixel(x, y);
colors[x, y].A += color.A;
colors[x, y].R += color.R;
colors[x, y].G += color.G;
colors[x, y].B += color.B;
}
}
}
return _toBitmap(colors);
}
private Bitmap _toBitmap(ColorAverage[,] colors) {
var bitmapToReturn = new Bitmap(_bmps[0].Width, _bmps[0].Height, _bmps[0].PixelFormat);
for (var x = 0; x < colors.GetLength(0); x++) {
for (var y = 0; y < colors.GetLength(1); y++) {
bitmapToReturn.SetPixel(x, y, Color.FromArgb(colors[x,y].A / _bmps.Count,
colors[x,y].R / _bmps.Count,
colors[x,y].G / _bmps.Count,
colors[x,y].B / _bmps.Count)
);
}
}
return bitmapToReturn;
}
public Bitmap ToBitmap() {
return _averageImages();
}
}
+ + =
此处的完整尺寸图片:http://imgur.com/0oPTMi7,ejMxLaL,OlV9y6A,IDnLdoe#0