だから私は次のように画像をグレースケールに変換できることを理解しました:
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の領域ごとに小さなベクトル矢印を考えてください)。おそらくより良い例は、フォトショップでグレースケールグラデーションを描画し、それらが描画した角度を計算したい場合です。
私はこのMatLabのようなことをしましたが、それは何年も前のことです。これを計算するのに似た行列を使用できると思いますがColorMatrix
、その方法はよくわかりません。この関数は私が望むものかもしれないようです。(上記のように)それをグレースケールに変換してから、これらの方向を計算するためにグレースケールマトリックスで何かを行うことができますか?
IIRC、私が欲しいのはエッジ検出と非常に似ています。
これらの方向ベクトルを計算した後、それらをループして画像の平均方向を計算します。
最終的な目標は、平均的な方向が常に上になるように画像を回転させたいということです。このように、1つが回転(90、180、または270度)されていることを除いて2つの同一の画像がある場合、それらは同じ方向に向けられます(人が逆さまになってしまうかどうかは関係ありません)。
*snip*一部のスパムを削除します。あなたは私の試みの残りを読みたいあなたの改訂を見ることができます。