【OpenCV学习笔记】十、访问图像像素

本章主要讲了以下内容:

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);
}

运行结果:略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值