快速对图像的像素进行操作 opencv 实战

本文介绍了如何使用OpenCV对图像像素进行操作,特别是针对灰度图像的灰度值变换。通过指针、data或迭代器方式访问像素,并推荐使用LUT函数以实现高效的像素映射,同时指出OpenCV内置函数的优化能提供更快的速度。
摘要由CSDN通过智能技术生成

OpenCV 如何对图像的像素进行操作

对图像的像素进行操作,我们可以实现空间增强,反色,大部分图像特效系列都是基于像素操作等目的。先来看一下内存空间中图像矩阵,也就是Mat的矩阵数值部分是怎么存储的:

如果图像是一幅灰度图像,他就像这样,从左到右,从上到下,依次是矩阵的每一行每一列,这时候矩阵M(i,j)的值自然就是当前点的灰度值了。

而对于一幅彩色图像,由于它的像素分量channel并不是一个,所以每一列又分为了几个channel。拿常见的RGB图像来说,就像这样:

从这张图上,就可以比较清楚地看出来在内存中矩阵是如何存储多channel图像的了。这里要注意的是在RGB模型中,每一个子列依次为BGR,也就是正好是颠倒的,第一个分量是蓝色,第二个是绿色,第三个是红色。

清楚了图像在内存中的存储方式,我们也就可以来进行像素值的操作了。在这里,我们举这样一个例子。我们对一幅灰度图像的灰度值进行变换:

小于100的灰度值被统一映射为0;100到200之间的灰度值被映射为100;大于200的灰度值被映射为200.

主函数如下:

int main()
{
	string picName="lena.jpg";
	Mat A=imread (picName,CV_LOAD_IMAGE_GRAYSCALE);    //读入灰度图像
	uchar table[256];          //映射表,规定了变换前后灰度值的对应关系 table[gray_value_before]=gray_value_after
	for (int i=0;i<256;i++)
	{
		table[i]=i/100*100;   //这里利用了C++的语言特性i/100只会留下整数部分
	}
	imshow("变换前",A);
	Mat B=ChangeImg (A,table);    //变换函数
	imshow ("变换后",B);
	waitKey ();
	return 0;
}

首先,我们用指针方式对图像的像素点灰度值进行操作:

Mat  ChangeImg(Mat &img,const uchar* table)
{
	CV_Assert(img.depth ()!=sizeof(uchar));  //声明只对深度8bit的图像操作
	int channels=img.channels ();            //获取图像channel
	int nrows=img.rows;                     //矩阵的行数
	int ncols=img.cols*channels;             //矩阵的总列数=列数*channel分量数
	if (img.isContinuous ())               //判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组
	{
		ncols*=nr
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值