首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

opencv对于图片中每个像素点的处置,有没有什么优化的方式

2013-06-25 
opencv对于图片中每个像素点的处理,有没有什么优化的方式?void CKeyDlg::ThresholdImageByColor(IplImage

opencv对于图片中每个像素点的处理,有没有什么优化的方式?

void CKeyDlg::ThresholdImageByColor(IplImage * pRGBImage,IplImage * pBwImage)
{
        int imgheight  = pRGBImage->height;
int imgwidth   = pRGBImage->width;
int step       = pRGBImage->widthStep/sizeof(uchar);
uchar * data    = (uchar *)pRGBImage->imageData;
uchar * dataDst    = (uchar *)pBwImage->imageData;
int stepDST       = pBwImage->widthStep/sizeof(uchar);

int i,j ;

for (i = 0 ;i < imgheight ; i++)
{
for (j = 0 ; j < imgwidth ; j++)
{
if ( (data + i*step)[j*3 + 2] < 20)//R通道信息
{
(dataDst + i*stepDST)[j] = 255 ; 
}
else
{
(dataDst + i*stepDST)[j] = 0 ; 
}
}
}
}
 
以上代码是依据pRGBImage图像的各个像素点的R通道信息,来决定单通道pBwImage图像各个像素点的是黑还是白。代码中的两个for循环很消耗时间。想问一下,对于OpenCV特殊的图像存储格式,有没有什么优化的访问方式?以节约更多的时间,因为整个程序中有很多处涉及到对于图像像素点的处理,如果这样的操作有其他方法可以替代的话,会节约很多时间。
[解决办法]
用汇编????


[解决办法]
c++接口,用Mat_<Vec3b>::iterator实现试试
[解决办法]

void CKeyDlg::ThresholdImageByColor(IplImage * pRGBImage,IplImage * pBwImage)
{
        int imgheight  = pRGBImage->height;
int imgwidth   = pRGBImage->width;
int step       = pRGBImage->widthStep/sizeof(uchar);
uchar * data    = (uchar *)pRGBImage->imageData;
uchar * dataDst    = (uchar *)pBwImage->imageData;
int stepDST       = pBwImage->widthStep/sizeof(uchar);

int i,j ;

for (i = 0 ;i < imgheight ; i++)
{
         uchar * src = (uchar *)pRGBImage->imageData+i*step+2;
        uchar * dst = (uchar *)pBwImage->imageData+i*stepDST;
          for (j = 0 ; j < imgwidth ; j++)
{
if ( src[0] < 20)//R通道信息
{
dst[0] = 255 ; 
}
else
{
dst[0] = 0 ; 
}
                        src+=3;
                        dst++;


}
}
}


试试这个,应该会快些。
[解决办法]
想再快就上sse2优化
[解决办法]
想再再快就上GPU加速。
[解决办法]
不要再for循环内部用判断,直接建立一个查找表;
unsigned char tab[256] = {0};
for(int i = 0; i < 256; i++)
{
    if(i < 20)
    {
          tab[i] = 0255;
     }else 
     {
          tab[i] = 0;
     }
}
for (i = 0 ;i < imgheight ; i++)
    {
        for (j = 0 ; j < imgwidth ; j++)
        {
            (dataDst + i*stepDST)[j] = tab[(data + i*step)[j*3 + 2]];

        }
    }
opencn内部的二值化就是这么干的,你可以查看源码~
[解决办法]
我个人觉得楼主的问题和opencv的处理方式没有直接关系。不管opencv对mat进行了怎样的包装,其图像数据就是一个连续内存块。就楼主的问题来说,一般的策略是想办法减少指针跳转的次数。如果这个级别已经做到极限,只能在别的方面想办法。

优化要相对具体的机器和编译器来说,还要根据具体的应用情况来说。上面的一些回复,至少在一般的pc机上,我觉得都意义不大,因为现代编译器基本能帮你搞定,人为的修改代码降低可读性可能得不偿失。


[解决办法]
比如
1. 减少指针计算的次数。比如一个矩阵,列数很少,就5个,行数很多,至少在千这个量级上。与其用p + y*w + x这样来计算指针,不如将每一行定义成一个结构体。因为结构体成员的便宜是在编译时完成的,可以减少一次加x的操作。加x这样的操作是运行时的,一般情况编译器是优化不掉的。
2. 尽量让指针的跳转在一个小的范围内。比如如果图片非常大(比如广告图片),可以考虑将图片的内存布局实现为一个tile的矩阵,每个tile是一个矩形区域,比如64x64。这样的好处是减少cache不命中的概率. 当然,这种优化有没有用,与硬件的cache,图片的大小等都有关系,如果图片不是很大,这样改是没多少效果的。

热点排行