我希望對某些人來說這是一個有趣的問題。根據底層圖像的亮度設置隨機位置上的像素
我想在圖像上的隨機位置上創建一些像素,但隨機化應該取決於亮度,所以創建像素的可能性應該在圖像的明亮部分較高,在較暗部分較低(但仍有可能)。
讓我們這個形象的比方:
我想創建一個功能SetRandomizedPixel這將讓該位圖,它設置在一個隨機位置的像素。在位置1上創建像素的可能性應該很高,在位置2中等和位置3低。
我與C#和位圖/圖形的工作,但是這不應該的問題。
我唯一需要的是一個建議如何開始,因爲我找不出一個好的方法來存檔這個。
也許讀取所有圖像像素的亮度和位置,並按亮度對列表進行排序 - 但是,如何隨機選擇哪個更喜歡亮區?
UPDATE:在圖像上答案工作
下面的代碼的結果是這樣的:
但是,如果我們仔細看的也有很多像素的左側:
這是代碼(C#/ MVC3):
public ActionResult RandomTest()
{
const int points = 500;
Bitmap bitmap = new Bitmap(Server.MapPath("~/Files/random-test.jpg"));
Random random = new Random();
int imageWidth = bitmap.Width;
int imageHeight = bitmap.Height;
float[][] weightedPixels = ConvertImageToGrayScale(bitmap);
float totalValue = weightedPixels.Sum(i => i.Sum());
for (var y = 0; y < imageHeight - 1; y++)
{
for (var x = 0; x < imageWidth - 1; x++)
{
weightedPixels[y][x] /= totalValue;
}
}
for (var i = 0; i < points; i++)
{
double randomNumber = random.NextDouble();
double currentSum = 0;
for (var y = 0; y < imageHeight - 1; y++)
{
for (var x = 0; x < imageWidth - 1; x++)
{
currentSum += weightedPixels[y][x];
if (currentSum >= randomNumber)
{
bitmap.SetPixel(x, y, Color.Red);
break;
}
}
}
}
// output
var stream = new MemoryStream();
bitmap.Save(stream, ImageFormat.Png);
return File(stream.ToArray(), "image/png");
}
public float[][] ConvertImageToGrayScale(Bitmap bm)
{
var b = new Bitmap(bm);
var data = new List<float[]>();
for (var i = 0; i < b.Width; i++)
{
var row = new List<float>();
for (int x = 0; x < b.Height; x++)
{
var oc = b.GetPixel(i, x);
var grayScale = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
row.Add(grayScale);
}
data.Add(row.ToArray());
}
return data.ToArray();
}
+1,但是你應該處理明顯的除零以得到完全黑色的圖像 – Niki
是真的。雖然如果在這種情況下真正的意圖是仍然有一些像素選擇,那麼最好的辦法是實際增加一個小的偏移量到灰度矩陣,以確保沒有零元素。這樣每個像素都有被挑選的機會。這將是對代碼的小調整。 – troutinator
非常感謝你,我在C#中構建了你的代碼,它工作正常,但有一點問題仍然存在。你能看看我更新的答案嗎? – Marc