opencv(8)---访问图像像素
来源:互联网 发布:php是最好的语言 编辑:程序博客网 时间:2024/05/21 17:01
预备知识
1. 图像在内存中的存储形式
图像矩阵的大小取决于所采用的通道数
1)灰度矩阵的存储方式
2)彩色图像的存储方式
注意:
opencv的通道顺序是BGR,而不是RGB
下面进行验证
代码1 :
Mat mat(200,300,CV_8UC3,Scalar(255,0,0)); imshow("Blue---Scalar(255,0,0)",mat);
运行结果:
代码2:
Mat mat(200,300,CV_8UC3,Scalar(0,255,0)); imshow("Green---Scalar(0,255,0)",mat);
运行结果
2.判断矩阵存储是否连续
isContinuous()
访问图像中像素方法
1 动态地址访问
1 代码
#include "mainwindow.h"#include <QApplication>#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;int main(int argc, char *argv[]){ QApplication a(argc, argv); // MainWindow w; // w.show(); Mat img=imread("D:\\1\\1.png"); if(img.empty()){ cout<<"no Picture readed"<<endl; return 0; } Mat dst=img.clone(); int rowNumber=img.rows;//获取行数 int colNumber=img.cols;//获取列数 cout<<rowNumber<<endl; cout<<colNumber<<endl; for(int i=0;i<rowNumber;i++){ for(int j=0;j<colNumber;j++){ dst.at<Vec3b>(i,j)[0]=255;//蓝色通道 dst.at<Vec3b>(i,j)[1]=0;//绿色通道 dst.at<Vec3b>(i,j)[2]=0;//红色通道 } } imshow("img",img); imshow("dst",dst); waitKey(0); destroyAllWindows(); return a.exec();}
2 运行结果
3 知识点详解
成员函数at用来读取像素
1) 对于彩色三通道图像
对图像像素的赋值方式为:
image.at<Vec3b>(i,j)[channel] = value;
at方法不会进行类型转换,所以需要制定图像元素类型,并且要和矩阵内类型一致
使用Vec3b进行类型转换
其中,
channel
取值为0,1,2 0—-蓝色通道 1—绿色通道 2—红色通道
2) 对于灰度图像
dst.at<uchar>(i,j)=255;//灰度图像
使用uchar进行类型转换
2 指针访问
1)代码
/*指针访问*/ Mat img=imread("D:\\1\\1.png"); if(img.empty()){ cout<<"no Picture readed"<<endl; return 0; } Mat dst=img.clone(); int rowNumber=img.rows;//获取行数 int colNumber=img.cols*img.channels();//每一行的元素个数=列数*通道数 cout<<rowNumber<<endl; cout<<colNumber<<endl; for(int i=0;i<rowNumber;i++){ uchar *data=dst.ptr<uchar>(i);//获取第i行首地址 for(int j=0;j<colNumber;j++){//列循环 switch(j%3){//RGB图像通道区分 case 0: data[j]=255; break; case 1: data[j]=0; break; case 2: data[j]=0; break; default: break; } } } imshow("img",img); imshow("dst",dst); waitKey(0); destroyAllWindows(); return a.exec();
速度
最快
2)运行结果
3)知识点详解
uchar *data=dst.ptr<uchar>(i);
Mat类提供了ptr函数可以得到图像任意行的首地址。
使用uchar进行强制地址转换。
3 迭代器
速度
介于上面两种方式之间
简单应用
减色效果
1. 代码
#include "mainwindow.h"#include <QApplication>#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;int main(int argc, char *argv[]){ QApplication a(argc, argv); /*指针访问*/ Mat img=imread("D:\\1\\1.png"); if(img.empty()){ cout<<"no Picture readed"<<endl; return 0; } Mat dst=img.clone(); int rowNumber=img.rows;//获取行数 int colNumber=img.cols*img.channels();//每一行的元素个数=列数*通道数 cout<<rowNumber<<endl; cout<<colNumber<<endl; for(int i=0;i<rowNumber;i++){ uchar *data=dst.ptr<uchar>(i);//获取第i行首地址 for(int j=0;j<colNumber;j++){//列循环 switch(j%3){//RGB图像通道区分 case 0: data[j]=data[j]/64*64+64/2; break; case 1: data[j]=data[j]/64*64+64/2; break; case 2: data[j]=data[j]/64*54+64/2; break; default: break; } } } imshow("img",img); imshow("dst",dst); waitKey(0); destroyAllWindows(); return a.exec();}
2. 运行结果
雪花效果
1.代码
#include "mainwindow.h"#include <QApplication>#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;int main(int argc, char *argv[]){ QApplication a(argc, argv); /*指针访问*/ Mat img=imread("D:\\1\\1.png"); if(img.empty()){ cout<<"no Picture readed"<<endl; return 0; } Mat dst=img.clone(); int rowNumber=img.rows;//获取行数 int colNumber=img.cols;//每一行的元素个数=列数*通道数 int i,j; for(int k=0;k<200;k++){ i=rand()%rowNumber; j=rand()%colNumber; dst.at<Vec3b>(i,j)[0]=255; dst.at<Vec3b>(i,j)[1]=255; dst.at<Vec3b>(i,j)[2]=255; } imshow("img",img); imshow("dst",dst); waitKey(0); destroyAllWindows(); return a.exec();}
2 运行结果
0 0
- opencv(8)---访问图像像素
- opencv访问图像像素
- opencv访问图像像素
- Opencv访问图像像素
- OpenCV 2 访问图像像素
- OpenCV 访问图像像素点
- OpenCV:访问图像中的像素
- Opencv并行访问图像像素
- OpenCV访问修改图像的像素值
- python OpenCV 图像像素访问 (三)
- OpenCV访问图像像素的方法
- opencv中访问图像像素方式
- 【OpenCV】简单高效地访问图像像素
- 如何使用 opencv 访问图像像素
- opencv技术访问图像中的像素
- 【OpenCV学习笔记】十、访问图像像素
- opencv如何访问图像像素并赋值
- opencv访问图像像素及简单应用
- uoj#34多项式乘法
- shell的数值运算方法
- bzoj2179: FFT快速傅立叶
- Rescue (BFS 优先队列)
- bzoj2194: 快速傅立叶之二
- opencv(8)---访问图像像素
- Aizu 2780 Best Matched Pair
- java I/O 之读取InputStream数据到内存&&内存数据写入到OutputSteam中
- bzoj4259: 残缺的字符串
- 使用bootstrap-select 动态加载数据不显示的问题
- bzoj3527: [Zjoi2014]力
- .NET产品源码保护,.NET防止反编译,c#/vb.net 防反编译
- 指针函数与函数指针
- LEETCODE 15&&16