使用访问图像三种办法,指针,迭代器,动态地址计算

使用访问图像三种办法,指针,迭代器,动态地址计算

指针访问

方法一

#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;
#include 
#include 
using namespace cv; //包含cv命名空间
#include 



#include 

//-------------------------【全局函数声明部分】------------------------
// 描述: 全局函数声明
//--
void colorReduce(Mat& inputImage, Mat& outputImage, int div);
//---------------------------【main()函数】--------------------------
// 描述: 控制台应用程序的入口函数,我们的程序从这里开始执行
//----------------
int main()
{
	//【1】创建原始图并显示
	Mat srcImage = imread("1.jpg");
	imshow("原始图像", srcImage);
	//【2】按原始图的参数规格来创建创建效果图
	Mat dstImage;
	dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());//效果图的大小、类型与原图片相同
	//【3】记录起始时间
	double time0 = static_cast<double>(getTickCount());
	//【4】调用颜色空间缩减函数
	colorReduce(srcImage, dstImage, 32);
	//【5】计算运行时间并输出
	time0 = ((double)getTickCount() - time0) / getTickFrequency(); cout << "此方法运行时间为: " << time0 << "秒" << endl; //输出运行时间
	//【6】显示效果图
	imshow("效果图", dstImage);
	waitKey(0);
}
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
	//参数准备
	outputImage = inputImage.clone(); //复制实参到临时变量
	int rowNumber = outputImage.rows; //行数
	int colNumber = outputImage.cols * outputImage.channels(); //列数×通道数=每一行元素的个数
	//双重循环,遍历所有的像素值
	for (int i = 0; i < rowNumber; i++) //行循环
	{
		uchar* data = outputImage.ptr<uchar>(i); //获取第i行的首地址
		for (int j = 0; j < colNumber; j++) //列循环
		{
			// ---------【开始处理每个像素】-------------
			data[j] = data[j] / div * div + div / 2;
			// ----------【处理结束】---------------------
		} //行处理结束
	}
}

使用访问图像三种办法,指针,迭代器,动态地址计算_第1张图片

指针访问方法二

#include 

int main() {
    // 读取图像
    cv::Mat image = cv::imread("path/to/your/image.jpg");

    // 检查图像是否成功加载
    if (image.empty()) {
        std::cerr << "Error: Could not read the image." << std::endl;
        return -1;
    }

    // 获取图像的行数和列数
    int rows = image.rows;
    int cols = image.cols;

    // 访问图像像素(以BGR格式为例)
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            // 获取像素值
            cv::Vec3b& pixel = image.at<cv::Vec3b>(i, j);

            // 修改像素值,例如将蓝色通道置为0
            pixel[0] = 0;  // 蓝色通道
            pixel[1] = pixel[1];  // 绿色通道(保持不变)
            pixel[2] = pixel[2];  // 红色通道(保持不变)
        }
    }

    // 显示修改后的图像
    cv::imshow("Modified Image", image);

    // 等待按键
    cv::waitKey(0);

    return 0;
}

使用访问图像三种办法,指针,迭代器,动态地址计算_第2张图片

使用迭代器调用图片

#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;
#include 
#include 
using namespace cv; //包含cv命名空间
#include 



#include 

//-------------------------【全局函数声明部分】------------------------
// 描述: 全局函数声明
//--
void colorReduce(Mat& inputImage, Mat& outputImage, int div);
//---------------------------【main()函数】--------------------------
// 描述: 控制台应用程序的入口函数,我们的程序从这里开始执行
//----------------
int main()
{
	//【1】创建原始图并显示
	Mat srcImage = imread("1.jpg");
	imshow("原始图像", srcImage);
	//【2】按原始图的参数规格来创建创建效果图
	Mat dstImage;
	dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());//效果图的大小、类型与原图片相同
	//【3】记录起始时间
	double time0 = static_cast<double>(getTickCount());
	//【4】调用颜色空间缩减函数
	colorReduce(srcImage, dstImage, 32);
	//【5】计算运行时间并输出
	time0 = ((double)getTickCount() - time0) / getTickFrequency(); cout << "此方法运行时间为: " << time0 << "秒" << endl; //输出运行时间
	//【6】显示效果图
	imshow("效果图", dstImage);
	waitKey(0);
}

void colorReduce(Mat& inputImage, Mat & outputImage, int div)
{
//参数准备
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;
// ------------------------ 【处理结束】-----------------------
}
}

使用访问图像三种办法,指针,迭代器,动态地址计算_第3张图片

方法二使用迭代器调用图片

#include 

int main() {
	// 读取图像
	cv::Mat image = cv::imread("1.jpg");

	// 检查图像是否成功加载
	if (image.empty()) {
		std::cerr << "Error: Could not read the image." << std::endl;
		return -1;
	}

	// 使用迭代器访问图像像素(以BGR格式为例)
	for (cv::MatIterator_<cv::Vec3b> it = image.begin<cv::Vec3b>(); it != image.end<cv::Vec3b>(); ++it) {
		// 获取当前像素值
		cv::Vec3b& pixel = (*it);

		// 修改像素值,例如将蓝色通道置为0
		pixel[0] = 0;  // 蓝色通道
		pixel[1] = pixel[1];  // 绿色通道(保持不变)
		pixel[2] = pixel[2];  // 红色通道(保持不变)
	}

	// 显示修改后的图像
	cv::imshow("Modified Image", image);

	// 等待按键
	cv::waitKey(0);

	return 0;
}


使用动态地址调用图片

#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;
#include 
#include 
using namespace cv; //包含cv命名空间
#include 



#include 

//-------------------------【全局函数声明部分】------------------------
// 描述: 全局函数声明
//--
void colorReduce(Mat& inputImage, Mat& outputImage, int div);
//---------------------------【main()函数】--------------------------
// 描述: 控制台应用程序的入口函数,我们的程序从这里开始执行
//----------------
int main()
{
	//【1】创建原始图并显示
	Mat srcImage = imread("1.jpg");
	imshow("原始图像", srcImage);
	//【2】按原始图的参数规格来创建创建效果图
	Mat dstImage;
	dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());//效果图的大小、类型与原图片相同
	//【3】记录起始时间
	double time0 = static_cast<double>(getTickCount());
	//【4】调用颜色空间缩减函数
	colorReduce(srcImage, dstImage, 32);
	//【5】计算运行时间并输出
	time0 = ((double)getTickCount() - time0) / getTickFrequency(); cout << "此方法运行时间为: " << time0 << "秒" << endl; //输出运行时间
	//【6】显示效果图
	imshow("效果图", dstImage);
	waitKey(0);
}
void colorReduce(Mat& inputImage, Mat& outputImage, int div) {
	//参数准备
	outputImage = inputImage.clone(); //复制实参到临时变量
	int rowNumber = outputImage.rows; //行数
	int colNumber = outputImage.cols; //列数
	//存取彩色图像像素
	for (int i = 0; i < rowNumber; i++)
	{
		for (int j = 0; j < colNumber; j++)
		{
			//------------------ 【开始处理每个像素】--------------------
			outputImage.at<Vec3b>(i, j)[0] =
				outputImage.at<Vec3b>(i, j)[0] / div * div + div / 2; //蓝色通道
			outputImage.at<Vec3b>(i, j)[1] = outputImage.at<Vec3b>(i, j)[1] / div * div + div / 2; //绿色通道
			outputImage.at<Vec3b>(i, j)[2] =
				outputImage.at<Vec3b>(i, j)[2] / div * div + div / 2; //红色通道
				//------ 【处理结束】-
		} //行处理结束
	}
}

使用访问图像三种办法,指针,迭代器,动态地址计算_第4张图片

方法二动态地址计算


#include 

int main() {
	// 读取图像
	cv::Mat image = cv::imread("1.jpg");

	// 检查图像是否成功加载
	if (image.empty()) {
		std::cerr << "Error: Could not read the image." << std::endl;
		return -1;
	}

	// 获取图像的行数和列数
	int rows = image.rows;
	int cols = image.cols;

	// 访问图像像素(以BGR格式为例)通过动态地址方式
	for (int i = 0; i < rows; ++i) {
		// 获取当前行的指针
		uchar* rowPtr = image.ptr<uchar>(i);

		for (int j = 0; j < cols; ++j) {
			// 计算像素的偏移量
			int offset = j * image.channels();

			// 修改像素值,例如将蓝色通道置为0
			rowPtr[offset] = 0;          // 蓝色通道
			rowPtr[offset + 1] = rowPtr[offset + 1];  // 绿色通道(保持不变)
			rowPtr[offset + 2] = rowPtr[offset + 2];  // 红色通道(保持不变)
		}
	}

	// 显示修改后的图像
	cv::imshow("Modified Image", image);

	// 等待按键
	cv::waitKey(0);

	return 0;
}

使用访问图像三种办法,指针,迭代器,动态地址计算_第5张图片

你可能感兴趣的:(#,C++视觉处理,opencv,计算机视觉,人工智能)