OpenCV学习笔记三(2016年12月4日)像素值的读写
1、at()函数遍历图像像素
函数at()对矩阵中某个像素进行读取或者对某个像素进行复制操作。但是效率并不高。
例如:uchar value = grayim.at<uchar>(i,j); //读出第i行第j列像素值
grayim.at<uchar>(i,j) = 128; //将第i行第j列像素值设置为128
//建立单通道的grayim以及3通道的colorim,遍历图像中所有的像素并赋值 #include <iostream> #include "opencv2/opencv.hpp" using namespace std; using namespace cv; int main(int argc, char* argv[]){ Mat grayim(600, 800, CV_8UC1); Mat colorim(600, 800, CV_8UC3); //遍历所有像素,并设置像素值 for( int i = 0; i < grayim.rows; ++i){
for( int j = 0; j < grayim.cols; ++j ){ grayim.at<uchar>(i,j) = (i+j)%255; }} //遍历所有像素,并设置像素值 for( int i = 0; i < colorim.rows; ++i){ for( int j = 0; j < colorim.cols; ++j ){ Vec3b pixel; pixel[0] = i%255; //Blue pixel[1] = j%255; //Green pixel[2] = 0; //Red colorim.at<Vec3b>(i,j) = pixel; } }
//显示结果 imshow("grayim", grayim); imshow("colorim", colorim); waitKey(0); return 0;}
2、迭代器(iterator)遍历图像的所有像素
#include <iostream> #include "opencv2/opencv.hpp" using namespace std; using namespace cv; int main(int argc, char* argv[]){ Mat grayim(600, 800, CV_8UC1); Mat colorim(600, 800, CV_8UC3); //遍历所有像素,并设置像素值 MatIterator_<uchar> grayit, grayend; for(grayit = grayim.begin<uchar>(),grayend=grayim.end<uchar>(); grayit != grayend; ++grayit){ *grayit = rand()%255; } //遍历所有像素,并设置像素值 MatIterator_<Vec3b> colorit, colorend; for(colorit = colorim.begin<Vec3b>(),colorend=colorim.end<Vec3b>(); colorit!= colorend; ++colorit){ (*colorit)[0] = rand()%255; //Blue (*colorit)[1] = rand()%255; //Green (*colorit)[2] = rand()%255; //Red } //显示结果 imshow("grayim", grayim); imshow("colorim", colorim); waitKey(0); return 0; }
3、使用数据指针遍历图像像素
#include <iostream> #include "opencv2/opencv.hpp" using namespace std; using namespace cv; int main(int argc, char* argv[]){ Mat grayim(600, 800, CV_8UC1); Mat colorim(600, 800, CV_8UC3); //遍历所有像素,并设置像素值 for( int i = 0; i < grayim.rows; ++i){ //获取第 i 行首像素指针 uchar * p = grayim.ptr<uchar>(i); //对第 i 行的每个像素(byte)操作 for( int j = 0; j < grayim.cols; ++j ){ p[j] = (i+j)%255; } } //遍历所有像素,并设置像素值 for( int i = 0; i < colorim.rows; ++i){ //获取第 i 行首像素指针 Vec3b * p = colorim.ptr<Vec3b>(i); for( int j = 0; j < colorim.cols; ++j ){ p[j][0] = i%255; //Blue p[j][1] = j%255; //Green p[j][2] = 0; //Red } } //显示结果 imshow("grayim", grayim); imshow("colorim", colorim); waitKey(0); return 0; }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: OPENCV2 访问图像像素值的三种方法
- 下一篇: ThinkPHP 页面请求和AJAX