Opencv计算机视觉编程攻略-第二节 图像像素操作
第二节 图像像素操作
- 1.访问像素值
- 2.用指针扫描图像
- 3.扫描图像并访问相邻像素
- 4.实现简单的图像运算
- 5.图像重映射
1.访问像素值
以椒盐噪声为例展示像素值访问的几种方法
void salt(cv::Mat image, int n) {// C++11 random number generatorstd::default_random_engine generator;std::uniform_int_distribution<int> randomRow(0, image.rows - 1);std::uniform_int_distribution<int> randomCol(0, image.cols - 1);// use image with a Mat_ template 使用模板操作做转换后可直接访问cv::Mat_<uchar> img(image);int i,j;for (int k=0; k<n; k++) {// random image coordinatei= randomCol(generator);j= randomRow(generator);// 自适应通道数if (image.type() == CV_8UC1) { // gray-level image// single-channel 8-bit imageimage.at<uchar>(j,i)= 255; } else if (image.type() == CV_8UC3) { // color image// 3-channel imageimage.at<cv::Vec3b>(j,i)[0]= 255; image.at<cv::Vec3b>(j,i)[1]= 255; image.at<cv::Vec3b>(j,i)[2]= 255; // 直接使用位置访问 下列为单通道赋值img(j,i)= 255; // or simply:// image.at<cv::Vec3b>(j, i) = cv::Vec3b(255, 255, 255);}}
}
2.用指针扫描图像
以处理图像像素为例展示指针扫描图像,使用指针并结合位运算的速度远高于逐个计算,double duration = (cv::getTickCount() - start) / cv::getTickFrequency()使用该语句实现算法是耗时分析:
void colorReduceIO(const cv::Mat &image, // input imagecv::Mat &result, // output imageint div = 64) {int nl = image.rows; // number of linesint nc = image.cols; // number of columnsint nchannels = image.channels(); // number of channels// allocate output image if necessaryresult.create(image.rows, image.cols, image.type());//1.指针扫描处理for (int j = 0; j<nl; j++) {// get the addresses of input and output row j// 每一行的开头地址const uchar* data_in = image.ptr<uchar>(j);uchar* data_out = result.ptr<uchar>(j);// 在opencv中按照BGR-BGR逐个排列for (int i = 0; i<nc*nchannels; i++) {// process each pixel ---------------------data_out[i] = data_in[i] / div*div + div / 2;// end of pixel processing ----------------} // end of line}//2.图像实现运算符重载int n= static_cast<int>(log(static_cast<double>(div))/log(2.0) + 0.5);// mask used to round the pixel valueuchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0// perform color reductionimage=(image&cv::Scalar(mask,mask,mask))+cv::Scalar(div/2,div/2,div/2);//3. 整图对象遍历cv::MatIterator_<cv::Vec3b> it= image.begin<cv::Vec3b>();cv::MatIterator_<cv::Vec3b> itend= image.end<cv::Vec3b>();const cv::Vec3b offset(div/2,div/2,div/2);for ( ; it!= itend; ++it) {// process each pixel ---------------------*it= *it/div*div+offset;// end of pixel processing ----------------}
}
3.扫描图像并访问相邻像素
在图像运算中,时长需要访问周边位置的像素,比如边缘提取、边缘锐化,以边缘锐化为例,展示如何访问相邻像素:
void sharpen2D(const cv::Mat &image, cv::Mat &result) {// 1. 直接使用filter2D进行卷积计算cv::Mat kernel(3,3,CV_32F,cv::Scalar(0));// assigns kernel valueskernel.at<float>(1,1)= 5.0;kernel.at<float>(0,1)= -1.0;kernel.at<float>(2,1)= -1.0;kernel.at<float>(1,0)= -1.0;kernel.at<float>(1,2)= -1.0;//filter the imagecv::filter2D(image,result,image.depth(),kernel);//2.通过指针实现高效运算result.create(image.size(), image.type()); // allocate if necessaryint nchannels= image.channels();for (int j= 1; j<image.rows-1; j++) { // for all rows (except first and last)const uchar* previous= image.ptr<const uchar>(j-1); // previous rowconst uchar* current= image.ptr<const uchar>(j); // current rowconst uchar* next= image.ptr<const uchar>(j+1); // next rowuchar* output= result.ptr<uchar>(j); // output rowfor (int i=nchannels; i<(image.cols-1)*nchannels; i++) {// apply sharpening operator*output++= cv::saturate_cast<uchar>(5*current[i]-current[i-nchannels]-current[i+nchannels]-previous[i]-next[i]); }}// Set the unprocess pixels to 0 屏蔽边缘像素result.row(0).setTo(cv::Scalar(0));result.row(result.rows-1).setTo(cv::Scalar(0));result.col(0).setTo(cv::Scalar(0));result.col(result.cols-1).setTo(cv::Scalar(0));
}
4.实现简单的图像运算
Mat进行实现图像的一些简单操作:
cv::addWeighted(image1,0.7,image2,0.9,0.,result);// using overloaded operatorresult= 0.7*image1+0.9*image2;//两种操作等效
5.图像重映射
在日常处理中,诸如投影变换,重采样,等等变换中,需要根据对应像素坐标位置计算目标位置,可通过重映射来快速实现:
void wave(const cv::Mat &image, cv::Mat &result) {// the map functionscv::Mat srcX(image.rows,image.cols,CV_32F); // x-mapcv::Mat srcY(image.rows,image.cols,CV_32F); // y-map// creating the mappingfor (int i=0; i<image.rows; i++) {for (int j=0; j<image.cols; j++) {//使用指针会更加高效 这里没有srcX.at<float>(i,j)= j;srcY.at<float>(i,j)= i+3*sin(j/6.0);// horizontal flipping// srcX.at<float>(i,j)= image.cols-j-1;// srcY.at<float>(i,j)= i;}}// applying the mapping 重映射函数cv::remap(image, // source imageresult, // destination imagesrcX, // x mapsrcY, // y mapcv::INTER_LINEAR); // interpolation method
}
该节相关代码已上传到个人文档,按需下载
链接: 点击下载
相关文章:
Opencv计算机视觉编程攻略-第二节 图像像素操作
第二节 图像像素操作 1.访问像素值2.用指针扫描图像3.扫描图像并访问相邻像素4.实现简单的图像运算5.图像重映射 1.访问像素值 以椒盐噪声为例展示像素值访问的几种方法 void salt(cv::Mat image, int n) {// C11 random number generatorstd::default_random_engine generat…...
华为交换相关
端口模式 (1)access:只能属于单个VLAN,一般用于连接计算机端口 (2)trunk:端口允许多个VLAN通过,可以接收和发送多个VLAN报文,默认情况下只有管理VLAN不携带标签信息 &…...
Chrome Performance 面板完全指南:从卡顿到丝滑的终极调试术
1.写在前面 前端性能调试是优化网页加载速度和运行效率的关键步骤,Chrome DevTools 的 Performance 面板 是核心工具; 2.Performance 面板使用步骤 ★ 基础 打开面板 在 Chrome 中按 F12 → 切换到 Performance 标签页。 开始录制 方式一:点击 ⚫️ 圆…...
idea中快速注释函数
在IntelliJ IDEA中,有多种方法可以快速注释函数。 使用快捷键 你可以使用以下快捷键来快速注释函数[3]: 行注释:使用Ctrl/(Windows系统)或Command/(Mac系统)可以在当前行前添加或删除单行注释…...
深入解析Linux网络、安全与容器技术
1. Netfilter:Linux内核的包处理框架 Netfilter 是Linux内核中用于控制网络数据包的核心机制,负责处理数据包的过滤、修改和转发。其核心功能包括: 包过滤(Packet Filtering):根据规则允许或拒绝数据包通过…...
JDK 24:Java 24 中的新功能
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:历代文学,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计…...
java中的枚举类型和c,c++的有区别吗?c,c++的枚举,结构体,联合体,三种数据有什么区别和联系
Java 枚举类型与 C、C 枚举类型的区别 1. 类型安全 Java:Java 的枚举类型是类型安全的。枚举常量是枚举类型的实例,编译器会严格检查传递的参数是否为该枚举类型的有效常量。例如: java Apply enum Color { RED, GREEN, BLUE } // 编译器会检…...
ubuntu服务器server版安装,ssh远程连接xmanager管理,改ip网络连接。图文教程
ventoy启动服务器版iso镜像,注意看server名称,跟之前desktop版ubuntu不一样。没有gui界面。好,进入命令行界面。语言彻底没汉化了,选英文吧,别的更看不懂。 跟桌面版ubuntu类似,选择是否精简系统࿰…...
什么叫税务黑名单?详解税务黑名单的来源。
一、什么叫税务黑名单? 1、税务黑名单是指由税务部门根据相关法律法规和税收管理策,对违反税收法规、逃避纳税义务或其他严重违法违规行为的个人或企业进行记录和公示的名单。 2、被列入税务黑名单意味着该个人或企业在税务方面存在严重的不诚信行为&a…...
计算机二级:基础操作题
一 sinfoinput() info_listsinfo.split(,) print("姓名,年龄") for strname in info_list:snamestrname[:-2]sagestrname[-2:]print("{},{}".format(sname,sage))二 import random as r r.seed(1) sinput("请输入三个整数n,m,…...
python机器学习——新手入门学习笔记
一,概论 1.什么是机器学习 定义: 机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测。 其实就是通过问题和数据,发现规律,并进行预测,与人脑相似。目的就是从历史数据当中获得规律&#x…...
LabVIEW 与 PLC 通讯的常见方式
在工业自动化和数据采集系统中,PLC(可编程逻辑控制器) 广泛用于控制和监测各种设备,而 LabVIEW 作为强大的图形化编程工具,常用于上位机数据处理和可视化。为了实现 LabVIEW 与 PLC 的高效通讯,常见的方法包…...
深度学习 Deep Learning 第9章 卷积网络 CNN
深度学习 Deep Learning 第9章 卷积网络 章节概述 本章深入探讨了卷积网络的原理、变体及其在深度学习中的应用。卷积网络通过卷积操作实现了参数共享和稀疏连接,显著提高了模型的效率和性能。本章首先介绍了卷积操作的基本形式及其在不同数据维度上的应用&#x…...
Tekton系列之实践篇-从触发到完成的完整执行过程
以下介绍的是基于 Gitee 仓库 的 Tekton 工作流程 操作流程 定义task 克隆代码的task # task-clone.yaml apiVersion: tekton.dev/v1beta1 kind: Task metadata:name: git-clone spec:workspaces:- name: source # 工作目录params:- name: repo-url # 你的 Gitee 仓库地址…...
【简单学习】Prompt Engineering 提示词工程
一、Prompt 1、Prompt 是什么? Prompt 是一种人为构造的输入序列,用于引导 GPT 模型根据先前输入的内容生成相关的输出。简单来说,就是你向模型提供的 “提示词”。 在 ChatGpt 中,我们可以通过设计不同的 prompt,让…...
neo4j删除所有数据
neo4j删除所有数据 一次性删除 MATCH (n) DETACH DELETE n ;分批次删除 先删除关系 MATCH ()-[r]->()WITH r LIMIT 100000DELETE rRETURN count(r)在删除节点 MATCH (n)WITH n LIMIT 100000DELETE nRETURN count(n)验证 查询节点总数 MATCH (n) RETURN count(n) AS node…...
零基础入门网络爬虫第5天:Scrapy框架
4周 Srapy爬虫框架 不是一个简单的函数功能库,而是一个爬虫框架 安装:pip install scrapy 检测:scrapy -h Scrapy爬虫框架结构 爬虫框架 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合爬虫框架是一个半成品,能够帮助…...
ARCGIS PRO DSK 栅格数据(Raster)
ArcGIS Pro 中与栅格相关的功能可以在两个单独程序集中的两个命名空间中找到。 1、ArcGIS.Core.dll 中的 ArcGIS.Core.Data.Raster 命名空间提供了栅格类和成员,用于处理栅格数据集、内存栅格、像素块和光标。 2、ArcGIS.Desktop.Mapping.dll 中的 ArcGIS.Desktop.M…...
C#设计模式快速回顾
知识点来源:人间自有韬哥在,豆包 目录 一、七大原则1. 单一职责原则 (Single Responsibility Principle)2. 开放封闭原则 (Open-Closed Principle)3. 里氏替换原则 (Liskov Substitution Principle)4. 接口隔离原则 (Interface Segregation Principle)5…...
分页查询互动问题(用户端)
文章目录 概要整体架构流程技术细节小结 概要 需求分析以及接口设计 技术细节 1.Controller层 GetMapping("/page")ApiOperation("分页查询问题")public PageDTO<QuestionVO> queryQuestionPage(QuestionPageQuery query){return questionService…...
【全队项目】智能学术海报生成系统PosterGenius(项目介绍)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏:🏀大模型实战训练营_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…...
P5356 [Ynoi Easy Round 2017] 由乃打扑克 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作分两种: add ( l , r , x ) \operatorname{add}(l,r,x) add(l,r,x):对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 执行 …...
【线程安全问题的原因和方法】【java形式】【图片详解】
在本章节中采用实例图片的方式,以一个学习者的姿态进行描述问题解决问题,更加清晰明了,以及过程中会发问的问题都会一一进行呈现 目录 线程安全演示线程不安全情况图片解释: 将上述代码进行修改【从并行转化成穿行的方式】不会出…...
MySQL-----视图与索引
目录 视图 1.视图 2.操作 11.索引 1.定义 2.优缺点: 3.分类 4.索引的设计原则 5.索引的使用 作业 视图 1.视图 ❓如果需要在原表中隐藏部分字段时,怎么办? 视图 📖视图: 是一个没有存储任何数据的表,可以对其CRUD视图…...
【差分隐私相关概念】约束下的列联表边缘分布计算方法
列联表及其边缘分布的详细解释 一、列联表的定义 列联表(Contingency Table) 是一种用于表示 多个分类变量联合分布 的表格。其核心是通过多维数组记录不同属性组合的频次。以下是关键点: 分类属性: 设有 k k k 个分类属性 A …...
解决IDEA中maven找不到依赖项的问题
直接去官网找到对应的依赖项jar包,并且下载到本地,然后安装到本地厂库中。 Maven官网:https://mvnrepository.com/ 一、使用mvn install:install-file命令 Maven提供了install:install-file插件,用于手动将jar包安装到本地仓库…...
pyside6的QGraphicsView体系,当鼠标位于不同的物体,显示不同的右键菜单
代码: # 设置样本图片的QGraphicsView模型 from PySide6.QtCore import Qt, QRectF, QObject from PySide6.QtGui import QPainter, QPen, QColor, QAction, QMouseEvent from PySide6.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsPixmapItem, QGra…...
Python自动化测试 之 DrissionPage 的下载、安装、基本使用详解
Python自动化测试 之 DrissionPage 使用详解 🏡前言:一、☀️DrissionPage的基本概述二、 🗺️环境安装2.1 ✅️️运行环境2.2 ✅️️一键安装 三、🗺️快速入门3.1 页面类🛰️ChromiumPage🛫 SessionPage&…...
Java替换jar包中class文件
在更新java应用版本的运维工作中,由于一些原因,开发没办法给到完整的jar包,这个时候,就可以只将修改后的某个Java类的class文件替换掉原来iar包中的class文件,重新启动服务即可: 1、将jar包和将要替换的cl…...
unix网络编程
unix网络编程 AI出来以后,软件不可能找到工作的,就算找到了也在走下坡路。再过几年,机器人发展起来,连流水线都找不到。人为什么整体不值钱,每个部位却很值钱。你说我初中辍学就去开直播结局会不会比现在好。 更新in…...
