OpenCV基础(2)

ops/2024/11/19 18:05:19/

1.图像像素与通道操作

1.1.像素算术操作

//加法操作
void cv::add(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray(),int dtype=-1);//减法操作
void cv::subtract(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray(),int dtype=-1);//乘法操作
void cv::multiply(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray(),int dtype=-1);//除法操作
void cv::divide(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray(),int dtype=-1);
  • src1:输入第一张图片
  • src2:输入第二张图片
  • dst:输出图片
  • mask:掩膜层
  • dtype:数据类型

1.2.像素位操作

//位取反操作
void cv::bitwise_not(InputArray src,OutputArray dst,InputArray mask=noArray());//位与
void cv::bitwise_and(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray());//位或
void cv::bitwise_or(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray());//位异或
void cv::bitwise_xor(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray());

1.3.调整图像亮度与对比度

调整图像亮度:

对于RGB图像来说,RGB三个通道的像素值越高,图像亮度越高,越接近白色;反之,RGB三个通道像素值越低,图像亮度越低,越接近黑色。这里我们可以用简单的像素加法和减法操作用于调整RGB图像的亮度

Mat img=Mat::zeros(image.size(),image.type());
img.setTo(Scalar(50,50,50))
Mat lightMat,darkMat;
//亮度增强
add(image,img,lightMat);
//亮度降低
subtract(image,img,darkMat);

调整图像对比度:

图像对比度主要用于描述图像亮度之间的感知差异,对比度越大,图像的每个像素与周围的差异性越大,整个图像的细节越显著,反之亦然。图像乘法或除法操作可分别用于扩大或缩小图像像素之间的差值,从而达到调整图像对比度的目的

Mat img=Mat::zeros(image.size(),CV_32FC3);
img.setTo(Scalar(0.8,0.8,0.8))
Mat lowContrastMat,highContrastMat;
//高对比度
multiply(image,img,lowContrastMat,1.0,CV_8U);
//低对比度
divide(image,img,highContrastMat,1.0,CV_8U);

1.4.图像类型

Mat的数据类型有很多种,而且各种Mat数据类型可以根据需要进行类型转换。imread默认加载的是CV_8UC3类型数据,显示的时候使用imshow即可;但当其数据类型转换为CV_32FC3浮点型数据时,直接通过imshow显示的图像将呈白色,无法正常显示;这是因为imshow对浮点型数据的取值范围时[0~1],所以需要对转换后的图像先除以255,将取值范围[0~255]转换到[0~1],这样图像就可以正常显示了

void cv::Mat::convertTo(OutputArray m, //输出对象int rtype,     //数据类型double alpha=1,//缩放系数double beta=0  //加和
)    

1.5.图像通道

//查询图像通道数
int cv::Mat::channels();//不同通道数目相互切换
void cv::cvtColor(InputArray src,    //输入图像OutputArray dst,   //输出图像int code,          //转换格式int dstCn=0
)//常见的转换格式如下:
//COLOR_BGR2GRAY:三通道转换为单通道(彩色图像转换为灰度图像)
//COLOR_GRAY2BGR:单通道转换为三通道(无法把丢失的色彩转换回来)

1.6.通道操作

//通道分离
void cv::split(const Mat &src,//输入图像Mat *mvbegin   //输出的通道Mat数组,用std::vector<Mat>表示
);//通道合并
void cv::merge(InputOutputArrays mv,//输入的多个单通道数据OutputArray dst      //输出Mat对象
);

2.几何变换

2.1.图像翻转

void flip(InputArray src, OutputArray dst, int flipCode)

  • src 代表 原始图像矩阵
  • dst 代表 变换后的图像矩阵
  • flipCode 代表翻转模式,总共三种(0:垂直方向翻转 ;1:水平方向翻转 ;-1:水平、垂直方向同时翻转)

2.2.图像旋转

Mat getRotationMatrix2D(Point2f center,double angle,double scale);

  • center:旋转的中心点
  • angle:旋转的角度
  • scale:图像缩放因子

2.3.图像缩放

void resize(InputArray src,OutputArray dst,Size dsize,double fx=0,double fy=0,int interpolation=INTER_LINEAR)

  • src:输入图像
  • dst:输出图像
  • dsize:目标图像大小
  • fx:在X轴上的缩放比例
  • fy:在y轴上的缩放比例
  • interpolation:插值方式
    • INTER_NN:最近邻插值
    • INTER_LINEAR:双线性插值
    • INTER_AREA:使用像素关系重采样,当图像缩小时,可以避免波纹出现;当图像放大时,类似INTER_NN方法
    • INTER_CUBIC:立方插值

注意:dsize与fx和fy不能同时为0


http://www.ppmy.cn/ops/135039.html

相关文章

thinkphp增删查改例子

以下是一个简单的示例&#xff0c;演示如何使用ThinkPHP操作数据库进行增删查改&#xff1a; 增加数据&#xff1a; public function addData(){$data [name > John,age > 25,email > johnexample.com];$result Db::name(user)->insert($data);if($result){ech…

ClickHouse的介绍、安装、数据类型

1、介绍和安装 1.1、简介 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用SQL查询实时生成分析数据报告。 OLAP&…

蓝牙5.0模块助力闹钟升级,开启智能生活第一步

随着智能家居产业的快速发展&#xff0c;智能闹钟作为其中一个重要的品类&#xff0c;逐渐从单一的时间提醒功能演变为集音频播放、语音交互、智能控制等多种功能于一体的智能设备。而在这些功能的实现中&#xff0c;蓝牙音频模组扮演着核心角色。 1、蓝牙音频模组的功能概述 …

Java项目实战II基于Java+Spring Boot+MySQL的共享汽车管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在共享经济…

4.STM32之通信接口《精讲》之USART通信---实验串口发送程序

本节将进行实战&#xff0c;基础了解请查看第1&#xff0c;2&#xff0c;3节&#xff08;Whappy&#xff09; 开始背&#xff01;&#xff01; USART ---》全双工 异步/同步 点对点 C语言基础printf用法&#xff0c;这节将用到printf的重定向&#xff0c;来打印到串口助手上…

Electron教程2-第一个应用

玩转Electron2 前提条件从开源程序electron-tabs入手运行效果图 解读主进程窗口渲染进程自定义标签问题 前提条件 Electron教程1-初学入门 从开源程序electron-tabs入手 下载源码 解压 进入目录 cnpm i npm run demo 运行效果图 解读 app.js 入口文件 electron-tabs.ht…

TypeORM在Node.js中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 TypeORM在Node.js中的应用 TypeORM在Node.js中的应用 TypeORM在Node.js中的应用 引言 TypeORM 概述 定义与特点 发展历程 TypeO…

学习笔记026——Redis基本操作命令

Redis是一个开源的、基于内存的键值对&#xff08;Key-Value&#xff09;数据库。 它以其高性能、丰富的数据类型支持以及多种高级特性&#xff0c;在多个领域得到了广泛的应用。 文章目录 1、连接redis2、ping命令3、切换数据库4、get/set&#xff08;读写键值命令&#xff09…