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

相关文章

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调