本章主要讲了以下内容:
1.访问图像像素:动态地址计算访问、指针访问、迭代器访问
2.两个实例:减色效果、雪花效果。
先上ppt:
代码:具体见注释
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;
void main()
{
///动态地址访问(Mat类的at方法,将图片变成纯蓝)
//Mat img = imread("1.jpg"); //默认三通道彩色读取
//imshow("src", img);
//Mat dst = img.clone();
//int rowNumber = img.rows; //获取行数
//int colNumber = img.cols; //获取列数
//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("dst", dst);
//waitKey(0);
///指针访问(Mat类的ptr方法,将图片变成纯红)
//Mat img = imread("1.jpg");
//imshow("src", img);
//Mat dst = img.clone();
//int rowNumber = img.rows; //获取行数
//int colNumber = img.cols * img.channels(); //获取每一行的元素个数
//for(int i = 0; i<rowNumber; i++)
//{
// uchar* data = dst.ptr<uchar>(i); //获取每一行首地址
// for(int j = 0; j<colNumber; j++)
// {
// switch(j % 3)
// {
// case 0: //蓝色通道
// data[j] = 0;
// break;
// case 1: //绿色通道
// data[j] = 0;
// break;
// case 2: //红色通道
// data[j] = 255;
// break;
// }
// }
//}
//imshow("dst", dst);
//waitKey(0);
///减色算法
//Mat img = imread("1.jpg");
//imshow("src", img);
//Mat dst = img.clone();
//int rowNumber = img.rows; //获取行数
//int colNumber = img.cols * img.channels(); //获取每一行的元素
//for(int i = 0; i<rowNumber; i++)
//{
// uchar* data = dst.ptr<uchar>(i); //获取每一行首地址
// for(int j = 0; j<colNumber; j++)
// {
// switch(j % 3)
// {
// 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 * 64 + 64/2;
// break;
// }
// }
//}
//imshow("dst", dst);
//waitKey(0);
///雪花效果(随机将图像中的2000个像素点置为白)
Mat img = imread("1.jpg");
imshow("src", img);
Mat dst = img.clone();
int rowNumber = img.rows; //获取行数
int colNumber = img.cols; //获取列数
int i, j;
for(int k = 0; k< 2000; k++)
{
i = rand() % rowNumber; //定义随机行i,随机数对rowNumber取余,那i肯定比rowNumber小
j = rand() % colNumber; //定义随机列j,随机数对colNumber取余,那j肯定比colNumber小
dst.at<Vec3b>(i, j)[0] = 255; //蓝色通道
dst.at<Vec3b>(i, j)[1] = 255; //绿色通道
dst.at<Vec3b>(i, j)[2] = 255; //红色通道
}
imshow("dst", dst);
waitKey(0);
}
运行结果:略