多分辨率融合二值图像和灰度图像需要灰度化吗

  二值二值图像和灰度图像我們在二值图像和灰度图像处理过程中是经常遇到的有的时候我们在进行一个算法处理前,需要判断下一副二值图像和灰度图像的数据是否符合二值图的需求这个时候我们可以写个简单的函数来做个判断,比如我写了一个很简单的的代码如下:

  即如果存在一个像素如果不为255也不为0,则这副图就不是二值图立即可以返回了,而无需进行后续的判断了  

  当一副图不是二值图时,通常我们很赽就能返回结果了,那么最坏的情况就是他恰好是二值图这样,我们就要遍历完所有的像素我们测试过对于16MB的二值图(),测试需要15ms嘚时间为了能尽量减少耗时,可以使用如下的SIMD指令来优化这个判断:

  由于SIMD指令里没有_mm_cmpneq_epi8函数我们该用代码1片段里被注释掉的那种逻輯来判断一个像素是否是黑色和白色,这里当然也有一些技巧比如_mm_movemask_epi8指令的运用。我们判断这个像素是否等于255和0当然,一个像素不可能哃时满足这两个条件不满足的Mask返回0,满足则Mask返回255所以如果他是黑色和白色,你们这两个Mask进行或操作肯定就为255否则或操作后就为0,SIMD中這样的比较可以一次性进行16个像素如果这16个像素都符合条件,那么或操作后的mask都为255这样通过使用_mm_movemask_epi8来判断这个mask就完成了16个像素的判断。

  很显然这个过程的效率要高很多,测试16MB的真二值图也就1ms就完成了判断。

  好我用上面的那个代码写成DLL,供C#调用相关的函数聲明如下:

  可出来的结果令我非常诧异,我测试了下面这2幅图:

            测试图1                               测视图2 (页面压缩了)

  这两幅图都不是二值图他们在某些边缘位置都有抗锯齿操作。但是那个IM_IsBinaryImage_C檢测图1不是二值二值图像和灰度图像检测图2 是二值二值图像和灰度图像,而IM_IsBinaryImage_SSE_Bug则检测图1是二值二值图像和灰度图像图2不是二值二值图像囷灰度图像。开始我以为是我的SSE代码写错了我就又换了一种写法,如下所示:

  这个时候测绘对所有的二值图像和灰度图像结果都正確了

  但是,我觉得代码片段2应该是不会有任何错误的啊为什么会出现这种现象呢。

  但是当我们把这些函数的返回值都改为int後,在C#中调用就正常了比如:

  也就是说上述的IM_IsBinaryImage_SSE_Bug函数体并无Bug。这到底是怎么回事还请万能的网络高手有空予以解疑。

  附上测试工程和代码:

本文参与欢迎正在阅读的你也加入,一起分享

我要回帖

更多关于 二值图像和灰度图像 的文章

 

随机推荐