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

相关文章

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad