【opencv2】:图像元素的遍历

多说无益,先贴代码,再看解析:

函数的功能是实现图像颜色的缩减。

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

void colorReduce(Mat &src,Mat &dst, int div = 64);
//注意:这里的div是个默认参数,其初始化只能在函数声明中进行,函数定义里不能给div初始化
int main(){
	
	Mat source = imread("1.jpg",1);
	Mat reduceColor(source.size(), source.channels());

	colorReduce(source, reduceColor);
	imshow("source", source);
	imshow("reducecolor", reduceColor);
	waitKey(0);
}
void colorReduce(Mat &src, Mat &dst,int div){
	src.copyTo(dst);	
	int nline = dst.rows;
	int nchannel = dst.cols*dst.channels();//在opencv中颜色是按照BGR的顺序存储,故每行的通道数为前面的式子
	for (int j = 0; j < n1ine; j++)
	{
		uchar* data = dst.ptr<uchar>(j); //获取每行的头地址
		for (int i = 0; i < nchannel; i++)
		{
			data[i] = data[i]/div*div + div/2;//颜色缩减方法
		}
	}
}
在获取每行的地址方面,其实方法比较多。上面是采用 uchar *  data = image.ptr<uchar>(j) 的方式获取图片每一行的首地址,后面采用指针的运算来分别访问到每一行中的每一个元素。

在获取地址方面还可以采用如下方法:

uchar *data = image.data;   //获取整幅图像的首地址

data+ = image.step     //此表达式的意思即data = data + image.step;

                                    //image.step表示的是图像的行宽(即每行所含的像素点个数)

实际上对于Mat类型,opencv提供了成员函数at(int x , int y )用来访问到具体某个位置的像素点,例:

image,at<uchar>(i,j) = 255;//将(i,j)位置的像素点的灰度值赋值为255;

image.at<uchar>(i,j)[channel] = 255;//将(i,j)位置的像素点的某个通道的值赋为255;


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值