OpenCV中,使用三种方式获得图像的像素

方式一:通过指针获取图像的像素

  1. 获得图像的行数
  2. 使用ptr()函数,获得图像的行指针
  3. 获取图像的列数,这里需要注意一下,如果是多通道的图像,图像的列数需要乘以该图片的通道数
  4. 需要获得图像的列函数
  5. 对图像进行处理
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

void colorReduce(Mat & inputImage, Mat & outputImage, int div);

int main(int argc, char ** argv) {
	Mat srcImage = imread("1.jpg");
	if (srcImage.empty()) {
		printf("could not load this picture!\n");
		return -1;
	}
	imshow("源代码", srcImage);
	Mat dstImage;
	dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());
	colorReduce(srcImage, dstImage, 32);
	waitKey(0);
	return 0;

}

void colorReduce(Mat & inputImage, Mat & outputImage, int div) {
	方法一:通过指针获取图像的像素
	//outputImage = inputImage.clone();
	//int rowNumbers = outputImage.rows;
	//int colNumbers = outputImage.cols * outputImage.channels();
	//for (size_t rows = 0; rows < rowNumbers; rows++) {
	//	uchar * data = outputImage.ptr<uchar>(rows);
	//	for (size_t cols = 0; cols < colNumbers; cols++) {
	//		data[cols] = data[cols] / div * div + div / 2;
	//	}
	//}
	//imshow("效果图", outputImage);

	方法二:通过动态地址获取图像的像素
	//outputImage = inputImage.clone();
	//int rowNumbers = outputImage.rows;
	//int colNumbers = outputImage.cols;
	//for (size_t rows = 0; rows < rowNumbers; rows++) {
	//	for (size_t cols = 0; cols < colNumbers; cols++) {
	//		outputImage.at<Vec3b>(rows, cols)[0] = inputImage.at<Vec3b>(rows, cols)[0] / div * div + div / 2;
	//		outputImage.at<Vec3b>(rows, cols)[1] = inputImage.at<Vec3b>(rows, cols)[1] / div * div + div / 2;
	//		outputImage.at<Vec3b>(rows, cols)[2] = inputImage.at<Vec3b>(rows, cols)[2] / div * div + div / 2;
	//	}
	//}

	//方法三:通过迭代器获取图像的像素
	outputImage = inputImage.clone();
	Mat_<Vec3b> ::iterator it = outputImage.begin<Vec3b>();
	Mat_<Vec3b> ::iterator itend = outputImage.end<Vec3b>();
	for (; it != itend; it++) {
		(*it)[0] = (*it)[0] / div * div + div / 2;
		(*it)[1] = (*it)[1] / div * div + div / 2;
		(*it)[2] = (*it)[2] / div * div + div / 2;
		
	}
	imshow("目标图像", outputImage);
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值