OpenCV学习1 Mat图像的常见读写方式
2017-12-03 20:30
267 查看
方式一:at函数的读写
对于一幅图像可以使用imread()读取成mat类型Mat Image = imread("lena.bmp");
对三通道的图像进行读写操作
for (int i = 0; i < Image.rows; i++) { for (int j = 0; j < Image.cols; j++) { //Image.at<Vec3b>(i, j)[0] = (i) % 255; //Image.at<Vec3b>(i, j)[1] = (j) % 255; //Image.at<Vec3b>(i, j)[2] = 0; Vec3b pixel; pixel[0] = (i) % 255; pixel[1] = (j) % 255; pixel[2] = 0; Image.at<Vec3b>(i, j) = pixel; } }
能得到以下的图像
三通道图像中 pixel[0]表示的是Blue通道,pixel[1]表示的Green通道,而pixel[2]表示的是Red通道,因此上面程序令红色通道为零了,
所以显示的图像没有红色分量。
如果是图像是一通道那么采用以下代码
if (Image.channels() == 1) { for (int i = 0; i < Image.rows ; ++i) { for (int j = 0; i < Image.cols; ++j) { Image.at<uchar>(i, j) = (i + j) % 255; } } }
方式二:指针方式读写
if(Image.channels() == 1) { for (int i = 0; i < Image.rows; i++) { uchar *p = Image.ptr<uchar>(i); for (int j = 0; j < Image.cols; j++) { p[j] = (i + j) % 255; } } }该段代码用的是指针的方式读写操作一个一通道的图像,得到的图像结果为
方式三:迭代器方式读写
MatIterator_<Vec3b> colorit, colorend; for (colorit = Image.begin<Vec3b>(), colorend = Image.end<Vec3b>(); colorit != colorend; ++colorit) { (*colorit)[0] = rand() % 255; (*colorit)[1] = rand() % 255; (*colorit)[2] = rand() % 255; }
该段代码读写一个三通道的图像,可以看到迭代器方式不用遍历行和列了,利用了随机函数得到的肯定是一个随机像素图像
当然还有查找表方式,利用单位长度 的读取等方式。
相关文章推荐
- 学习笔记之OpenCV(1):Mat图像扫描
- 学习OpenCV2——访问Mat图像的像素值
- OpenCV2学习笔记---指针方式历遍图像
- Opencv2 学习笔记<一>:cv::Mat数据访问方式
- 【学习OpenCV】通过DLL实现图像数据从.dat导入Mat
- 学习OpenCV范例(一)——Mat - 基本图像容器
- opencv2学习笔记(一)-Mat - 基本图像容器
- OpenCV学习:Mat - 基本图像器
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- Opencv学习笔记(1)_MAT图像与HBITMAP互相转换
- opencv学习(2)——图像处理的一些常见操作
- OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作
- C# OpenCV学习笔记二之图像读写的两种方法
- OpenCV图像读写方式
- OpenCV,多种Mat图像元素访问方式的速度对比
- opencv学习记录(3)Mat - 基本图像容器
- 新手学习opencv,Mat和IplImage简单处理图像的效率
- 【Opencv学习(三)】获取Mat图像的ROI区域
- opencv 使用Mat 矩阵进行图像的降采样,像素的访问方式
- opencv Mat 图像数据元素进行排序 、常见Mat数据元素统计计算