如何遍历图像中的每一个像素?
OpenCV的矩阵值是如何存储的?
如何测试我们所实现算法的性能?
查找表是什么?为什么要用它?
没错啦!
LZ最感兴趣的一节哎。
毕竟以后自己做算法的时候,都会要用到
如何遍历图像中的每一个像素?
OpenCV的矩阵值是如何存储的?
如何测试我们所实现算法的性能?
等等,,还有这个呢
查找表是什么?为什么要用它?
查找表??为什么用??
看了你不就知道啦白痴1!!
【4】how_to_scan_images
OpenCV2.3.1\opencv\samples\cpp\tutorial_code\core\how_to_scan_images
做测试用的就是你们最喜欢吃的雪糕。。
三个圈。。~~
首先。。要学会怎么计时。。
没错,又是复制粘贴。
OpenCV提供了两个简便的可用于计时的函数 getTickCount() 和 getTickFrequency() 。第一个函数返回你的CPU自某个事件(如启动电脑)以来走过的时钟周期数,第二个函数返回你的CPU一秒钟所走的时钟周期数。这样,我们就能轻松地以秒为单位对某运算计时:
double t = (double)getTickCount();
// 做点什么 ...
t = ((double)getTickCount() - t)/getTickFrequency();
cout << "Times passed in seconds: " << t << endl;
下面就潜心跟着大师学吧。。没错,复制粘贴
连续存储有助于提升图像扫描速度,我们可以使用 isContinuous() 来去判断矩阵是否是连续存储的. 相关示例会在接下来的内容中提供。
1.高效的方法 Efficient Way
说到性能,经典的C风格运算符[](指针)访问要更胜一筹.
因此,我们推荐的效率最高的查找表赋值方法,还是下面的这种:
Mat& ScanImageAndReduceC(Mat& I, const uchar* const table)
{
// accept only char type matrices
CV_Assert(I.depth() != sizeof(uchar));
int channels = I.channels();
int nRows = I.rows * channels;
int nCols = I.cols;
if (I.isContinuous())
{
nCols *= nRows;
nRows = 1;
}
int i,j;
uchar* p;
for( i = 0; i < nRows; ++i)
{
p = I.ptr<uchar>(i);
for ( j = 0; j < nCols; ++j)
{
p[j] = table[p[j];
}
}
return I;
}
这里,我们获取了每一行开始处的指针,然后遍历至该行末尾。如果矩阵是以连续方式存储的,我们只需请求一次指针、然后一路遍历下去就行。彩色图像的情况有必要加以注意:因为三个通道的原因,我们需要遍历的元素数目也是3倍。
4. 核心函数LUT(The Core Function)
这是最被推荐的用于实现批量图像元素查找和更该操作图像方法。在图像处理中,对于一个给定的值,将其替换成其他的值是一个很常见的操作,OpenCV 提供里一个函数直接实现该操作,并不需要你自己扫描图像,就是:operationsOnArrays:LUT() <lut> ,一个包含于core module的函数.
首先我们建立一个mat型用于查表:
Mat lookUpTable(1, 256, CV_8U);
uchar* p = lookUpTable.data;
for( int i = 0; i < 256; ++i)
p[i] = table[i];
然后我们调用函数 (I 是输入 J 是输出):
LUT(I, lookUpTable, J);
LUT是什么怎么用的还是不明白 = =
请参阅:
OpenCV如何扫描图像、利用查找表和计时
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html#howtoscanimagesopencv