本文是《编写高效的C#图像处理程序——我的实验》的后续实验。
昨天,在wuya的提醒下,仔细检查了下测试代码。发现存在2个问题:
(1)实验对EmguCV和OpenCV不公平,因为,其它测试都是进行处理图像这一个过程,而EmguCV和OpenCV在处理图像之间,需要将Bitmap转换为其内部图像格式IplImage这一过程。因此,今天的测试将这个转换过程提前,不计入执行时间。
(2)翻看OpenCV的实现代码,发现,它执行的是以下算法:
代码
这一算法有什么特点呢?
第一,它不进行浮点计算。它首先将浮点数乘于一个Scale(2的N次幂),转换为整数,计算后再经过 >> 计算,消去这个Scale
第二,对于大图像,它使用的是查表方式而不是乘法方式来计算灰度的。
鉴于此,我改进了C#的实现代码,对小图像,依然采用浮点计算:
*to = (Byte)(p->Red * rCoeff + p->Green * gCoeff + p->Blue * bCoeff);
对大图像,则使用查表计算:
代码
这样,保证对比的是同一算法。今天的实验,主要比较下面五种图像灰度化方法:
(1)EmguCV实现:
代码
(2)OpenCV/PInvoke实现:
代码
(3)BitmapData实现:
代码
(4)我自己的实现,Argb32Image,采用浮点计算:
代码
(5)我自己的实现,Rgb24Image,对小图像采用浮点计算,对大图像采用查表计算:
代码
测试代码如下:
代码
本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2010/03/09/1681476.html如需转载请自行联系原作者
xiaotie
集异璧实验室(GEBLAB)