/*
第一个小程序吧!
个人觉得那么多函数没必要一个一个记,用到什么记什么。
拿这个椒盐效果说说入门的知识点。
Mat chanels() 通道,矩阵中的每一个矩阵元素拥有的值的个数,比如说 3 * 4 矩阵中一共 12 个元素,如果每个元素有三个值,那么就说这个矩阵是 3 通道的,即 channels = 3。
常见的是一张彩色图片有红、绿、蓝三个通道。
图像容器Mat
还是先看Mat的存储形式。Mat和Matlab里的数组格式有点像,但一般是二维向量,如果是灰度图,一般存放<uchar>类型;如果是RGB彩色图,存放<Vec3b>类型。
单通道灰度图数据存放格式:
多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图:
注意通道的顺序反转了:BGR。通常情况内存足够大的话图像的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,这中情况在访问时可以提供很大方便。可以用 isContinuous()函数来判断图像数组是否为连续的。
#include <opencvcv.h>
#include <opencv2corecore.hpp>
#include <opencv2highguihighgui.hpp>
void salt(Mat &A ,int N){ for(int K=1;K<=N;K++){ int i=rand()%A.rows ; int j=rand()%A.cols ; if(A.channels()==1) A.at<uchar>(i,j)=255 ; else{ A.at<Vec3b>(i,j)[0]=255 ; A.at<Vec3b>(i,j)[1]=255 ; A.at<Vec3b>(i,j)[2]=255 ; } } } int main(){ Mat A=imread("lilianjie.jpg") ; if(A.empty()) return -1 ; imshow("old picture",A) ; salt(A,400) ; imshow("new picture", A) ; waitKey(0) ; return 0; }