所以我想我可以像这样将图像转换为灰度:
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
来计算它,但我不太确定如何。看起来这个功能可能是我想要的;我可以将它转换为灰度(如上),然后用灰度矩阵做一些事情来计算这些方向吗?
IIRC,我想要的与边缘检测非常相似。
在计算完这些方向向量之后,我将遍历它们并计算图像的平均方向。
最终目标是我想旋转图像,使其平均方向始终向上;这样,如果我有两个相同的图像,除了一个被旋转(90,180 或 270 度),它们最终会以相同的方式定向(我不担心一个人是否倒置)。
*snip*删除一些垃圾邮件。您可以查看您想要阅读我的其余尝试的修订。