第五天:opencv-访问图像像素

图像处理通常是对图像像素进行算法分析,所以了解像素的存储方式是尤为重要的。

(1)、图像在内存中的存储方式

图像矩阵的大小取决于所用的颜色模型(或者说通道数),灰度图像矩阵每行每列对应一个元素也就是灰度值,而彩色图像矩阵每行每列对应BGR三种元素的值。

(2)、访问图像像素的方法

a. 动态地址计算访问

eg:

	///动态地址访问
	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);

成员函数at用来读取像素,<Vec3b>表示一个uchar[3]类型的数组,如果是灰度图像用at<uchar>(i,j)=255的形式访问。


b. 指针访问

eg:

	///指针访问
	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] = 255;
					break;
				case 1:  //绿色通道
					data[j] = 0;
					break;
				case 2:  //红色通道
					data[j] = 255;
					break;
			}
		}
	}
	imshow("dst", dst);
	waitKey(0);

Mat类提供了ptr函数可以得到图像任意行的首地址

(3)、实现一个图片减色和雪花的效果

eg:

#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv;

void main()
{
	///减色算法
	//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] = 64 * 64 + 64/2; //一个减色算法
	//				break;
	//			case 1:  //绿色通道
	//				data[j] = 64 * 64 + 64/2;
	//				break;
	//			case 2:  //红色通道
	//				data[j] = 64 * 64 + 64/2;
	//				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;  //获取列数
	int i, j;
	for(int k = 0; k< 2000; k++)
	{
		i = rand() % rowNumber; 
		j = rand() % 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、付费专栏及课程。

余额充值