Eri*_*sig 4 c# image imagemagick image-processing
我目前正在开发一个必须处理扫描表单的应用程序.我的应用程序的任务之一是确定扫描哪种表单.有3种可能的形式,具有独特的背景颜色,以识别每种形式.可能的3种颜色是红色/粉红色,绿色和蓝色.我遇到的问题是,我的尝试无法区分绿色和蓝色形式.以下是绿色和蓝色示例文件的链接:
http://dl.dropbox.com/u/686228/Image0037.JPG
http://dl.dropbox.com/u/686228/Image0038.JPG
我正在使用C#.net Application和ImageMagick完成我需要执行的一些任务.
目前我正在获得扫描表格的颜色缩减直方图,并尝试确定表格中的颜色.但我的应用程序无法区分绿色和蓝色.
任何建议或者更聪明的方法都会很高兴.
谢谢,
埃里克
我觉得这很有趣,并且深入挖掘它.
获取位图的平均颜色的代码如何计算位图的平均rgb颜色值有一些问题,例如一些无效的转换和红/蓝通道交换.这是一个固定版本:
private System.Drawing.Color CalculateAverageColor(Bitmap bm)
{
int width = bm.Width;
int height = bm.Height;
int red = 0;
int green = 0;
int blue = 0;
int minDiversion = 15; // drop pixels that do not differ by at least minDiversion between color values (white, gray or black)
int dropped = 0; // keep track of dropped pixels
long[] totals = new long[] { 0, 0, 0 };
int bppModifier = bm.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb ? 3 : 4; // cutting corners, will fail on anything else but 32 and 24 bit images
BitmapData srcData = bm.LockBits(new System.Drawing.Rectangle(0, 0, bm.Width, bm.Height), ImageLockMode.ReadOnly, bm.PixelFormat);
int stride = srcData.Stride;
IntPtr Scan0 = srcData.Scan0;
unsafe
{
byte* p = (byte*)(void*)Scan0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
int idx = (y * stride) + x * bppModifier;
red = p[idx + 2];
green = p[idx + 1];
blue = p[idx];
if (Math.Abs(red - green) > minDiversion || Math.Abs(red - blue) > minDiversion || Math.Abs(green - blue) > minDiversion)
{
totals[2] += red;
totals[1] += green;
totals[0] += blue;
}
else
{
dropped++;
}
}
}
}
int count = width * height - dropped;
int avgR = (int)(totals[2] / count);
int avgG = (int)(totals[1] / count);
int avgB = (int)(totals[0] / count);
return System.Drawing.Color.FromArgb(avgR, avgG, avgB);
}
Run Code Online (Sandbox Code Playgroud)
然而,在输入图像上运行此功能时,两者都返回了一些难以区分的灰色,正如Will A在评论中已经预料到的那样,这就是为什么我从计算中删除任何没有差异的颜色的原因R,G和B之间至少15个
有趣的是,所谓的蓝色处方扫描平均G和B的值相等(R:214,G:237,B:237).然而,绿色处方扫描导致G和B的值之间存在很大差异(18)(R:202,G:232,B:214),这可能是您应该研究的内容.例如:
if (color.G - color.B > 15) { form.Type = FormTypes.GreenForm }
Run Code Online (Sandbox Code Playgroud)