【发布时间】:2014-02-13 22:07:04
【问题描述】:
我有一张黑白图像,我需要存储背面像素的位置,然后通过将其中一半随机变为白色来添加一些噪点。
谁能告诉我如何仅存储黑色像素的位置并随机将其中一半变为白色?
【问题讨论】:
-
问题到底是什么?你哪部分有问题?要具体。
我有一张黑白图像,我需要存储背面像素的位置,然后通过将其中一半随机变为白色来添加一些噪点。
谁能告诉我如何仅存储黑色像素的位置并随机将其中一半变为白色?
【问题讨论】:
您可以创建一个List<Point> 来存储您的黑色像素。然后只需遍历它并随机更改它们:
List<Point> blackPixels = new List<Point>();
现在在上面的循环中:
else if (color.ToArgb() == Color.Black.ToArgb())
{
blackColor++;
blackPixels.Add(new Point(x,y));
}
当你想添加噪音时,只需执行以下操作:
Random r = new Random();
foreach(Point p in blackPixels)
{
if(r.NextDouble() < 0.5)
{
bmp.SetPixel(p.X,p.Y,Color.White);
}
}
这统计会将大约一半的黑色像素设置为白色,但可能或多或少。如果你真的想要完全一半,那么你可以随机选择一组从 0 到 n 的 n/2 个随机数,不重复,并在blackPixels 中的这些索引处切换像素。或者您甚至可以随机排列 blackPixels 列表,然后更改其中的前 n/2 个。
但是请注意,GetPixel 和 SetPixel 的性能不是很好。如果您的图片很大,请务必查看LockBits 以获得更好的性能。
【讨论】:
NextDouble 而不是Next。 Next 返回一个 int,因此它不太可能小于