OpenCV 3中图像操作像素的两种方法

2024-08-22 10:18

本文主要是介绍OpenCV 3中图像操作像素的两种方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目前只会两种操作像素点的方法,不过感觉只要能操作就行了。

环境:Ununtu14.04  Clion OpenCV3.2

1.指针

使用Mat类中获取指针的函数,获得图像中某行的指针,进而找到列的地址,即可操作对应地址的像素点,如下代码所示

uchar *row_ptr = image1.ptr < uchar > (y);
uchar *data_ptr = &row_ptr[x * image1.channels()];

row_ptr获取了第y行图像的起始地址,接着data_ptr获取第x列的地址,如果是单通道图像,使用*data_ptr = ...;即可对该点像素进行赋值。

2.直接使用at()方法。

若图像为单通道图像,直接使用image.at<uchar>(y, x) = ...;即可对第y行,x列的对应点进行操作。

3.实践

#include <iostream>
#include <chrono>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>using namespace std;int main() {cv::Mat image;// IMREAD_UNCHANGED            = -1// IMREAD_GRAYSCALE            = 0image = cv::imread("../test.jpg", -1);// 判断图像文件是否正确读取if (image.data == nullptr)    //数据不存在,可能是文件不存在{cout << "文件不存在." << endl;return 0;}// 文件顺利读取, 首先输出一些基本信息cout << "图像宽为" << image.cols << ",高为" << image.rows << ",通道数为"<< image.channels() << endl;// 用cv::imshow显示图像cv::imshow("test", image);// 暂停程序,等待一个按键输入cv::waitKey(0);// 遍历图像, 注意以下遍历方式亦可使用于随机像素访问// 使用 std::chrono 来给算法计时chrono::steady_clock::time_point t1 = chrono::steady_clock::now();for (size_t y = 0; y < image.rows; y++) {for (size_t x = 0; x < image.cols; x++) {uchar *row_ptr = image.ptr < uchar > (y);uchar *data_ptr = &row_ptr[x * image.channels()];for (int c = 0; c != image.channels(); c++) {uchar data = data_ptr[c];}}}chrono::steady_clock::time_point t2 = chrono::steady_clock::now();chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);cout << "遍历图像用时:" << time_used.count() << " 秒。" << endl;// 使用clone函数来拷贝数据cv::Mat image1 = image.clone();cv::Mat image2 = image.clone();for (size_t y = image1.rows / 2 - 5; y <= image1.rows / 2 + 5; y++) {for (size_t x = 0; x < image1.cols; x++) {uchar *row_ptr = image1.ptr < uchar > (y);uchar *data_ptr = &row_ptr[x * image1.channels()];if (image1.channels() == 1)*data_ptr = 240;if (image1.channels() == 3) {data_ptr[0] = 0;data_ptr[1] = 160;data_ptr[2] = 0;}}}for (size_t y = image2.rows / 2 - 5; y <= image2.rows / 2 + 5; y++) {for (size_t x = 0; x < image2.cols; x++) {if (image2.channels() == 1)image2.at<uchar>(y, x) = 180;if (image2.channels() == 3) {cv::Vec3b pixel;pixel[0] = 0;pixel[1] = 160;pixel[2] = 0;image2.at<cv::Vec3b>(y, x) = pixel;}}}cv::imshow("image1", image1);cv::imshow("image2", image2);cv::waitKey(0);// 关于 cv::Mat 的拷贝// 直接赋值并不会拷贝数据cv::Mat image_another = image;// 修改 image_another 会导致 image 发生变化// 将左上角50*50的块置零image_another(cv::Rect(0, 0, 50, 50)).setTo(0);cv::imshow("image_another", image);cv::waitKey(0);// 使用clone函数来拷贝数据cv::Mat image_clone = image.clone();image_clone(cv::Rect(0, 0, 50, 50)).setTo(255);cv::imshow("image_clone", image_clone);cv::waitKey(0);return 0;
}

最终效果为


这篇关于OpenCV 3中图像操作像素的两种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095991

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo