所以我想通了,我可以將圖像轉換爲灰度是這樣的:如何高效地計算灰度圖像中像素的平均「方向」?
public static Bitmap GrayScale(this Image img)
{
var bmp = new Bitmap(img.Width, img.Height);
using(var g = Graphics.FromImage(bmp))
{
var colorMatrix = new ColorMatrix(
new[]
{
new[] {.30f, .30f, .30f, 0, 0},
new[] {.59f, .59f, .59f, 0, 0},
new[] {.11f, .11f, .11f, 0, 0},
new[] {0, 0, 0, 1.0f, 0},
new[] {0, 0, 0, 0, 1.0f}
});
using(var attrs = new ImageAttributes())
{
attrs.SetColorMatrix(colorMatrix);
g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height),
0, 0, img.Width, img.Height, GraphicsUnit.Pixel, attrs);
}
}
return bmp;
}
現在,我要計算像素的平均「方向」。
我的意思是說,我想看看說一個3x3區域,然後如果左側比右側更暗,那麼方向將會在右側,如果底部比如果左下角比右上角暗,那麼方向將會向上,如果左下角比右上角暗,那麼方向將是右上角。 (想想每個3x3區域的小矢量箭頭)。也許一個更好的例子是,如果你在photoshop中繪製灰度漸變,並且你想計算它們繪製的角度。
我已經做了像MatLab這樣的東西,但那是幾年前。我想我可以使用類似於ColorMatrix
的矩陣來計算這個,但我不太確定如何。它看起來像this function可能是我想要的;我可以將它轉換爲灰度(如上),然後用灰度矩陣做些什麼來計算這些方向?
IIRC,我想要的與edge detection非常相似。
在我計算出這些方向向量之後,我只是要循環它們並計算圖像的平均方向。
最終目標是我想旋轉圖像,使它們的平均方向始終向上;這種方式如果我有兩個相同的圖像,除了一個被旋轉(90,180或270度),它們將以同樣的方式結束(我不關心一個人是否顛倒過來)。
*剪斷*刪除一些垃圾郵件。您可以查看您想要閱讀其餘嘗試的修訂。
我想如果你計算每個圖像瓷磚與座標(例如'meshgrid')的相關性,你應該得到你的「方向」。此外,我懷疑平鋪方向的平均值會給出相同的答案,就好像您將整個圖像關聯爲單個平鋪一樣。如果您還有MatLab,我會用它來測試您的算法,然後將最終版本移植到C#中。 – 2012-04-15 23:53:11
@BenVoigt:什麼是網格?如果我知道如何,我會高興地計算整個圖像的方向。我沒有MatLab的副本了......我只用了幾個學期的單元;我不確定我會記得如何使用它。需要不同的思考方式。 – mpen 2012-04-16 00:12:23
所有你想要的聲音都是漸變的。你試過了嗎? – dranxo 2012-04-16 00:42:25