今天开始学习opencv操作,配合4412开发板的双目摄像头进行学习。
图像本质上就是一个由数值组成的矩阵,对于灰度图像(黑白图像),像素是八位无符号数,0表示黑色,255表示白色,对于彩色图像需要用三原色数据来重现不同可见色。在数字成像技术中,常用的主颜色通道是红色、绿色、蓝色,因此每3个8位数值组成矩阵的一个元素。
1.1访问像素值
要访问矩阵中的每个独立元素,只需要指定它的行号和列号,返回对应的元素可以是单个数值,也可以是多通道数值向量。
1.2实现
为了说明直接访问像素值,我们创建一个专门的函数,用他在图像中加入椒盐噪声
创建函数如下:
void salt(Mat image,int n)
{
int i,j;
for(int k=0;k<n;k++){
i=std::rand()%image.cols;
j=std::rand()%image.rows;
if(image.type()==CV_8UC1){
image.at<uchar>(j,i)=255;
}
else if(image.type()==CV_8UC3){
image.at<Vec3b>(j,i)[0]=255;
image.at<Vec3b>(j,i)[1]=255;
image.at<Vec3b>(j,i)[2]=255;
}
}
}
这个函数使用一个循环,执行n次,每次把随机选择的像素值设置成,这里使用了随机数生成像素的行和列,用type方法来区别灰度图像和彩色图像,对灰度图像来说,只用简单8位数值为255,对于彩色图像,要把三个通道的设置成255,才能产生白色像素。
全部代码如下:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void salt(Mat image,int n);
int main(int argv,char** argc)
{
Mat src;
src=imread("D:/test/1.jpg");
salt(src,3000);
imshow("input",src);
waitKey(0);
return 0;
}
void salt(Mat image,int n)
{
int i,j;
for(int k=0;k<n;k++){
i=std::rand()%image.cols;
j=std::rand()%image.rows;
if(image.type()==CV_8UC1){
image.at<uchar>(j,i)=255;
}
else if(image.type()==CV_8UC3){
image.at<Vec3b>(j,i)[0]=255;
image.at<Vec3b>(j,i)[1]=255;
image.at<Vec3b>(j,i)[2]=255;
}
}
}
执行结果如下: