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可能是我想要的;我能将其转换为灰度(如上所述),然后对灰度矩阵进行某些操作以计算这些方向吗?如果我没记错的话,我想要的与edge detection非常相似。
在计算出这些方向向量之后,我将循环遍历它们并计算图像的平均方向。最终目标是旋转图像,使其平均方向始终朝上;这样如果我有两个完全相同的图像,只是一个被旋转了(90度,180度或270度),它们最终会被定向在同一方向上(我不关心人是否倒置)。
*snip* 删除一些垃圾邮件。如果您想阅读我的其他尝试,请查看修订版本。
meshgrid
)的相关性,你应该能够得到你的“方向”。此外,我怀疑平均瓦片方向将会给出与将整个图像作为单个瓦片进行相关的相同答案。如果你仍然有MatLab,我建议你使用它来测试你的算法,然后将最终版本移植到C#。 - Ben Voigt