为图像添加椒盐噪声的例子

#include <iostream> 
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <random>

using namespace std;

void salt(cv::Mat image, int n) {

  // C++11的随机数生成器
  std::default_random_engine generator;
  std::uniform_int_distribution<int>
                randomRow(0, image.rows - 1);
  std::uniform_int_distribution<int>
                randomCol(0, image.cols - 1);

  int i,j;
  for (int k=0; k<n; k++) {

    // 随机生成图形位置
    i= randomCol(generator);
    j= randomRow(generator);
    if (image.type() == CV_8UC1) { // 灰度图像
      // 单通道8位图像
      image.at<uchar>(j,i)= 255;
    } else if (image.type() == CV_8UC3) { // 彩色图像
      // 3通道图像
      image.at<cv::Vec3b>(j,i)[0]= 255;
      image.at<cv::Vec3b>(j,i)[1]= 255;
      image.at<cv::Vec3b>(j,i)[2]= 255;
    }
  }
}

int main()
{
    // 打开图像
    cv::Mat image= cv::imread("test.jpg",1);
    // 调用函数以添加噪声
    salt(image,3000);
    // 显示结果
    cv::imshow("Image",image);
    cv::waitKey(0);
}

这是OpenCV计算机视觉编程中的一个例子,在这段代码中涉及的知识。

像素的概念
矩阵中的每个元素表示一个像素,灰度图( 单通道8UC1)只用一个数字表示,彩色图(三通道8UC3)需要使用三个数值表示一个像素。

C++随机数生成

单通道灰度图及三通道彩色图的区分
cv::Mat类的type()方法

图像的扫描
矩陈中总共有多少像素?
如何高效的扫描?(减少矩阵的规模:减少颜色数量)


图像(矩阵)有多少行与例
图像本质上就是一个由数值组成的矩阵
cv::Mat类的成员变量cols和rows

矩阵中元素的访问方法
灰度图:image.at<uchar>(行号,列号)= 255;
彩色图:image.at<cv::Vec3b>(行号, 例号) = cv::Vec3b(255, 255, 255);

cv::Mat_模板类
已知矩阵的类型的情况下可以使用cv::Mat_类让代码更精简。
cv::Mat_<uchar> img(image);
img(50,100)= 0;

单通道灰度图像
使用一个数值表示:最小0代表黑色,最大255代表白色

所谓图像视觉编程的含义
就是矩阵的相关算术运算

RGB概念