所以我想通了,我可以将图像转换为灰度是这样的:如何高效地计算灰度图像中像素的平均“方向”?
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