文/七里雪飘(简书作者)
原文链接:http://www.jianshu.com/p/21f730c80a6d
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
图像的格式
-
vec3b的意思
-
-
-
-
像素的遍历(也就是像素的读写)
1. at( )函数
函数at()来实现读去矩阵中的某个像素的赋值操作下面两行代码演示了 at()函数的使用方法。
uchar value = grayim.at<uchar>(i,j);//读出第i行第j列
grayim.at<uchar>(i,j)=128; //将第i 行第j 列像素值设置
如果要对图像进行遍历,可以参考下面的例程。这个例程创分别是单通道的 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; }
需要注意的是,如果要遍历图像,并不推荐使用 at()函数。使用这个函数的优点是代码的可读性高,但是效率并不是很高。
2. 使用迭代器 (本人强烈推荐)
如果你熟悉C++的STL 库,那一定了解迭代器(iterator)的使用。迭代器可以方便地遍历所有元素。Mat 也增加了迭代器的支持,以便于矩阵元素的遍历。下面的例程功能跟上一节的例程类似,但是由于使用了迭代器,而不是使用行数
和列数来遍历,所以这儿没有了 i和j 变量,图像的像素值设置为一个随机数。#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; }
文/七里雪飘(简书作者)
原文链接:http://www.jianshu.com/p/21f730c80a6d
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
-