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

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

指针访问

方法一

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>
using namespace cv; //包含cv命名空间
#include <opencv2/core/core.hpp>#include <opencv2/opencv.hpp>//-------------------------【全局函数声明部分】------------------------
// 描述: 全局函数声明
//--
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;// ----------【处理结束】---------------------} //行处理结束}
}

在这里插入图片描述

指针访问方法二

#include <opencv2/opencv.hpp>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);// 修改像素值,例如将蓝色通道置为0pixel[0] = 0;  // 蓝色通道pixel[1] = pixel[1];  // 绿色通道(保持不变)pixel[2] = pixel[2];  // 红色通道(保持不变)}}// 显示修改后的图像cv::imshow("Modified Image", image);// 等待按键cv::waitKey(0);return 0;
}

在这里插入图片描述

使用迭代器调用图片

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>
using namespace cv; //包含cv命名空间
#include <opencv2/core/core.hpp>#include <opencv2/opencv.hpp>//-------------------------【全局函数声明部分】------------------------
// 描述: 全局函数声明
//--
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;
// ------------------------ 【处理结束】-----------------------
}
}

在这里插入图片描述

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

#include <opencv2/opencv.hpp>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);// 修改像素值,例如将蓝色通道置为0pixel[0] = 0;  // 蓝色通道pixel[1] = pixel[1];  // 绿色通道(保持不变)pixel[2] = pixel[2];  // 红色通道(保持不变)}// 显示修改后的图像cv::imshow("Modified Image", image);// 等待按键cv::waitKey(0);return 0;
}

使用动态地址调用图片

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>
using namespace cv; //包含cv命名空间
#include <opencv2/core/core.hpp>#include <opencv2/opencv.hpp>//-------------------------【全局函数声明部分】------------------------
// 描述: 全局函数声明
//--
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; //红色通道//------ 【处理结束】-} //行处理结束}
}

在这里插入图片描述

方法二动态地址计算


#include <opencv2/opencv.hpp>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();// 修改像素值,例如将蓝色通道置为0rowPtr[offset] = 0;          // 蓝色通道rowPtr[offset + 1] = rowPtr[offset + 1];  // 绿色通道(保持不变)rowPtr[offset + 2] = rowPtr[offset + 2];  // 红色通道(保持不变)}}// 显示修改后的图像cv::imshow("Modified Image", image);// 等待按键cv::waitKey(0);return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/126696.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TDengine OSS 与 qStudio 实现无缝协同,革新数据分析和管理方式

在数字化转型如火如荼的当下&#xff0c;海量爆发的时序数据处理成为转型成功的关键因素之一。为了帮助社区用户更好地进行数据分析和管理&#xff0c;丰富可视化解决方案的多样性&#xff0c;我们将开源的时序数据库&#xff08;Time Series Database&#xff09; TDengine OS…

【Vue基础-数字大屏】自定义主题

一、apache主题模板 链接https://echarts.apache.org/zh/download-theme.html 二、操作步骤 1、在apache主题模板中定制所需要的主题&#xff0c;如下图点击下载&#xff0c;复制其json 2、回到项目代码&#xff0c;在assets目录下新建index.js文件&#xff0c;新建变量&…

【消费战略方法论】消费烙印的策略模型

消费烙印策略模型 消费烙印策略&#xff0c;以消费者认知为导向&#xff0c;以品牌核心价值为中心&#xff0c;建立统一、高效、落地的品牌系统闭环&#xff0c;通过极致烙印方法(定位语言烙印、视觉烙印、产品烙印)让品牌价值烙印深植消费者心智。 消费烙印的对象是消费者&a…

linux 安装 jsoncpp包

报错 CMake Error at CMakeLists.txt:20 (find_package): Could not find a package configuration file provided by “jsoncpp” with any of the following names: jsoncppConfig.cmake jsoncpp-config.cmake 如何安装 jsoncpp sudo aot-get install libjsoncpp-dev

windows系统下利用python对指定文件夹下面的所有文件的创建时间进行修改

windows系统下利用python对指定文件夹下面的所有文件的创建时间进行修改 不知道其他的朋友们有没有这个需求哈&#xff0c;反正咱家是有这个需求 需求1、当前有大量的文件需要更改文件生成的时间&#xff0c;因为不可告知的原因&#xff0c;当前的文件创建时间是不能满足使用的…

杨氏矩阵/杨图x杨表(知识点总结)

思路来源 https://www.cnblogs.com/henrici3106/p/16710990.html 1 到 N 的排列&#xff0c;最长上升子序列&#xff08;LIS&#xff09;长度的期望是多少&#xff1f; - 知乎 杨氏矩阵 - OI Wiki 心得 感觉可能有用的就是一个Hook公式&#xff08;勾长公式&#xff09;吧…

多源蒸馏域适应

方法 D是域判别器&#xff0c;C是分类器。阶段3选择更接近目标的源训练样本用来微调C。阶段4对于每个源域&#xff0c;基于阶段2学到的目标编码器提取图像特征。接着结合每个源分类器的不同预测获得最终预测Result( x T x_T xT​) ∑ i 1 N w i C i ′ ( F i T ( x T ) ) \sum…

快速了解SpringCloud Sleuth --链路追踪 + Zipkin--数据搜集/存储/可视化

&#x1f600;前言 本篇博文是关于SpringCloud Sleuth --链路追踪 Zipkin–数据搜集/存储/可视化的基本介绍和使用&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文…

华为云云耀云服务器L实例评测|部署项目管理工具 Focalboard

华为云云耀云服务器L实例评测&#xff5c;部署项目管理工具 Focalboard 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品优势1.3 产品规格1.4 应用场景 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Focalboard3.1 Focalboard 介绍3.2 Doc…

ssm+vue的培训机构运营管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的培训机构运营管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

【Vue面试题三】、Vue中的v-show 和 v-if 怎么理解 ?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;v-show和v-if有什么区别…

深圳市重点实验室如何办理-华夏泰科

深圳市重点实验室是为了提升科技创新的能力和水平&#xff0c;推动科技成果的转化和应用而设立的一项重要机构。同时深圳市重点实验室是开展高水平基础研究和应用基础研究、聚焦和培养优秀科技人才、开展学术交流的重要基地。认定该资质对于提升品牌影响力和科技创新能力有着重…