opencv深入学习(4)—opencv2Mat各个元素的方位方法
2012-08-17 17:36
411 查看
内容来自《OpenCV 2 Computer Vision Application Programming Cookbook》
OpenCV2 访问图像的各个像素有各种方法
我们来用各种方法来实现减少图像的颜色数量
color = color/div*div +div/2;
若div为8,则原来RGB每个通道的256种颜色减少为32种。
若div为64,则原来RGB每个通道的256种颜色减少为4种,此时三通道所有能表示的颜色有4×4×4 = 64 种
首先,我们来看一个函数
C++:
uchar* Mat::ptr(int
i=0)i 是行号,返回的是该行数据的指针。在OpenCV中,一张3通道图像的一个像素点是按BGR的顺序存储的。先来看看第一种访问方案
第二种方案:
先来看如下函数:
C++: bool
Mat::isContinuous() const
C++: Mat
Mat::reshape(int
cn, int rows=0) const
出于性能方面的考虑,在图像每一行的最后可能会填充一些像素,这样图像的数据就不是连续的了
我们可以用函数isContinuous()来判断图像的数据是否连续
reshape函数的作用如下:
Changes the shape and/or the number of channels of a 2D matrix without copying the data.
这样,我们就提出了对第一种方法的改进
第三种方案:先来看看下面的函数C++: template<typename T> T&
Mat::at(int
i, int j)其作用是Returns a reference to the specified array element.
第四种方案是使用迭代器会使用到如下函数:C++: template<typename _Tp>
MatIterator_<_Tp> Mat::begin()C++: MatIterator_<_Tp>
Mat::end()
OpenCV2 访问图像的各个像素有各种方法
我们来用各种方法来实现减少图像的颜色数量
color = color/div*div +div/2;
若div为8,则原来RGB每个通道的256种颜色减少为32种。
若div为64,则原来RGB每个通道的256种颜色减少为4种,此时三通道所有能表示的颜色有4×4×4 = 64 种
首先,我们来看一个函数
C++:
uchar* Mat::ptr(int
i=0)i 是行号,返回的是该行数据的指针。在OpenCV中,一张3通道图像的一个像素点是按BGR的顺序存储的。先来看看第一种访问方案
void colorReduce1(cv::Mat& image, cv::Mat& result, int div=64){ int nrow = image.rows; int ncol = image.cols * image.channels(); for(int i=0; i<nrow; i++){ uchar* data = image.ptr<uchar>(i); uchar* data_out = result.ptr<uchar>(i); for(int j=0; j<ncol; j++){ data_out[j] = data[j]/div*div +div/2; } } }
第二种方案:
先来看如下函数:
C++: bool
Mat::isContinuous() const
C++: Mat
Mat::reshape(int
cn, int rows=0) const
出于性能方面的考虑,在图像每一行的最后可能会填充一些像素,这样图像的数据就不是连续的了
我们可以用函数isContinuous()来判断图像的数据是否连续
reshape函数的作用如下:
Changes the shape and/or the number of channels of a 2D matrix without copying the data.
这样,我们就提出了对第一种方法的改进
void colorReduce2(cv::Mat& image, cv::Mat& result, int div){ if(image.isContinuous()){ image.reshape(1,image.cols*image.rows); } int nrow = image.rows; int ncol = image.cols * image.channels(); for(int i=0; i<nrow; i++){ uchar* data = image.ptr<uchar>(i); uchar* data_out = result.ptr<uchar>(i); for(int j=0; j<ncol; j++){ data_out[j] = data[j]/div*div +div/2; } } }
第三种方案:先来看看下面的函数C++: template<typename T> T&
Mat::at(int
i, int j)其作用是Returns a reference to the specified array element.
void colorReduce3(cv::Mat& image, cv::Mat& result, int div){ int nrow = image.rows; int ncol = image.cols * image.channels(); for(int i=0; i<nrow; i++){ for(int j=0; j<ncol; j++){ image.at<cv::Vec3b>(j,i)[0]= image.at<cv::Vec3b>(j,i)[0]/div*div + div/2; image.at<cv::Vec3b>(j,i)[1]= image.at<cv::Vec3b>(j,i)[1]/div*div + div/2; image.at<cv::Vec3b>(j,i)[2]= image.at<cv::Vec3b>(j,i)[2]/div*div + div/2; } } }
第四种方案是使用迭代器会使用到如下函数:C++: template<typename _Tp>
MatIterator_<_Tp> Mat::begin()C++: MatIterator_<_Tp>
Mat::end()
void colorReduce4(cv::Mat& image, cv::Mat& result, int div){ cv::Mat_<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>(); cv::Mat_<cv::Vec3b>::iterator itend = image.end<cv::Vec3b>(); cv::Mat_<cv::Vec3b>::iterator itout = result.begin<cv::Vec3b>(); for(; it!=itend; ++it,++itout){ (*itout)[0] = (*it)[0]/div*div + div/2; (*itout)[1] = (*it)[1]/div*div + div/2; (*itout)[2] = (*it)[2]/div*div + div/2; } }
相关文章推荐
- OpenCV深入学习(4)--Mat元素的获取方法
- opencv深入学习(3)-- Mat格式的几个参数以及几种元素存取方法的讨论
- 深入学习PHP数组删除元素方法
- OpenCV深入学习(7)--Mat的元素分布图示详解
- Selenium + Webdriver 学习(四) 元素定位方法
- OpenCV深入学习(3)--opencv中测量运行时间的函数
- 深入理解元素视图的3个方法
- OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并
- opencv学习(十)颜色缩减 // 查表 // 计时 // 访问像素的三个方法(指针/STL迭代器(待详细了解)/动态地址)//历遍图像的14种方法
- Java基础学习总结(78)——Java main方法深入研究学习
- opencv深入学习(1)--Mat主要成员变量
- .NET深入学习笔记(2):C#中判断空字符串的4种方法性能比较与分析
- Python深入学习笔记1-特殊方法与多范式
- 基础学习笔记之opencv(2):haartraining前将统一图片尺寸方法
- 深入学习JavaScript: apply 方法 详解(转)——非常好
- 深入学习checkbox类型的input元素
- OpenCV中特征检测,提取与匹配使用方法学习
- 深入学习JavaScript: apply 方法 详解(转)——非常好
- 学习lofter 让图片适应各个分辨率的方法
- OpenCV对图像或矩阵元素遍历的四种方法