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
