【个人笔记】OpenCV4 C++ 快速入门 05课
个人资料,仅供学习使用
修改时间——2022年2月10日 08:33:18
学习课程:OpenCV4 C++ 快速入门视频30讲
视频老师:贾志刚
05 图像像素的算术操作
opencv知识点:
- 图像像素算术操作 - 运算符
- 值的截断 - saturate_cast<>
- 图像像素算术操作 - 专用函数
本课所解决的问题:
- 如何改变图像的亮度?
- 如何进行图像像素的算术操作?
- 如何对可能溢出的值进行截断?
1.改变图像亮度
对于改变图像的亮度,我们可以采用图像像素的算术操作实现
本文采用如下两种方法演示
- 四种运算运算符
- 四种专用函数
2.四种运算符和截断
运算符
首先,我们采用运算符的方式
//函数定义
void operators_demo(Mat& image);
//函数实现
void QuickDemo::operators_demo(Mat& image) {Mat dst;dst = image + Scalar(50, 50, 50);//dst = image - Scalar(50, 50, 50);//dst = image * Scalar(5, 5, 5);//会溢出//dst = image / Scalar(5, 5, 5);//会截断为0imshow("加法操作", dst);}
加法
可能会溢出
dst = image + Scalar(50, 50, 50);
减法
会自动截断为0
dst = image - Scalar(50, 50, 50);
乘法
可能会溢出,提示溢出的错误。
本案例就溢出了,所以没有结果展示
除法
如果除数较大,结果最终会被自动截断为0
dst = image / Scalar(5, 5, 5);
截断
采用运算符时加法,乘法有溢出隐患,有什么办法解决吗?
这就用到了saturate_cast<uchar>
,当使用它时会保证BGR图像的像素值在[0,255]
对于截断的演示,我们用运算符加法演示
void QuickDemo::operators_demo(Mat& image) {Mat dst = Mat::zeros(image.size(), image.type());Mat m = Mat::zeros(image.size(), image.type());m = Scalar(50, 50, 50);int h = image.rows;int w = image.cols;int dims = image.channels();for (int row = 0; row < h; row++) {for (int col = 0; col < w; col++) {Vec3b p1 = image.at<Vec3b>(row, col);Vec3b p2 = m.at<Vec3b>(row, col);dst.at<Vec3b>(row,col)[0] = saturate_cast<uchar>(p1[0] + p2[0]);dst.at<Vec3b>(row,col)[1] = saturate_cast<uchar>(p1[1] + p2[1]);dst.at<Vec3b>(row,col)[2] = saturate_cast<uchar>(p1[2] + p2[2]);}}imshow("加法操作", dst);}
3.专用函数
有没有更简单的方式呢?
OpenCV有自带的专用函数,专用函数都有截断处理
void QuickDemo::operators_demo(Mat& image) {Mat dst = Mat::zeros(image.size(), image.type());Mat m = Mat::zeros(image.size(), image.type());m = Scalar(50, 50, 50);add(image, m, dst);//subtract(image, m, dst);//multiply(image, m,dst);//divide(image, m, dst);imshow("加法操作", dst);}
因为上面已经演示了三种,这里只进行刚才失败的一种——乘法的演示
乘法
multiply(image, m,dst);
本课所用API查阅
Scalar
add
subtract
multiply
divide
saturate_cast<>
有11种重载,对应11种不同的的数据类型
uchar a = saturate_cast<uchar>(-100); // a = 0 (UCHAR_MIN)
short b = saturate_cast<short>(33333.33333); // b = 32767 (SHRT_MAX)
【个人笔记】OpenCV4 C++ 快速入门 05课相关推荐
- 【个人笔记】OpenCV4 C++ 快速入门 29课
个人资料,仅供学习使用 修改时间--2022年2月19日 15:02:27 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 29 高斯双边模糊 opencv知识点: 高斯双边模 ...
- 【个人笔记】OpenCV4 C++ 快速入门 26课
个人资料,仅供学习使用 修改时间--2022年2月13日 20:49:07 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 26 直方图均衡化 opencv知识点: 均衡灰度图 ...
- 【个人笔记】OpenCV4 C++ 快速入门 25课
个人资料,仅供学习使用 修改时间--2022年2月13日 20:45:23 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 25 二维直方图 opencv知识点: 计算直方图数 ...
- 【个人笔记】OpenCV4 C++ 快速入门 23课
个人资料,仅供学习使用 修改时间--2022年1月26日 00:49:43 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 23 视频处理与保存 opencv知识点: Vide ...
- 【个人笔记】OpenCV4 C++ 快速入门 22课
个人资料,仅供学习使用 修改时间--2022年1月25日 22:09:17 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 22 视频文件摄像头使用 opencv知识点: VI ...
- 【个人笔记】OpenCV4 C++ 快速入门 20课
个人资料,仅供学习使用 修改时间--2022年1月24日 22:09:02 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 20 图像翻转 opencv知识点: 图像翻转 - ...
- 【个人笔记】OpenCV4 C++ 快速入门 19课
个人资料,仅供学习使用 修改时间--2022年1月24日 20:17:13 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 19 图像放缩与插值 opencv知识点: 图像放缩 ...
- 【个人笔记】OpenCV4 C++ 快速入门 17课
个人资料,仅供学习使用 修改时间--2022年1月23日 17:59:14 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 17 鼠标操作与响应 opencv知识点: 设置指定 ...
- 【个人笔记】OpenCV4 C++ 快速入门 14课
个人资料,仅供学习使用 修改时间--2022年2月13日 09:47:32 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 14 图像几何形状绘制 opencv知识点: 四种几 ...
最新文章
- 《繁凡的深度学习笔记》前言、目录大纲 一文让你完全弄懂深度学习所有基础(DL笔记整理系列)
- mybatis表关联彻底理解
- ustc小道消息20211215
- 知乎:学计算机的女生都怎么样了?
- 《智能家居》培训第六天------2019-01-10
- dart语言和java语言_Java不是文明语言吗?
- [小记]Centos7网络配置DNS配置解决、yum出错解决。
- 洛谷 P1219 八皇后题解
- 李宏毅机器学习——概率分类模型
- dyve/django-bootstrap-toolkit
- vscode中文vsix_离线安装vscode vsix插件
- 平面设计完全手册_工业时代的平面设计
- APPLE 知识模块初步设计
- [LLVM]LLVM入门 ---llvm 代码结构
- k8s——kubeadm工具使用
- 大数据破获网售假耐克案
- JavaScript面向对象:面向对象案例
- 美国在线计算机硕士申请难度,美国计算机硕士申请难度大PK
- MATLAB中stem函数的使用
- matlab gui excel,matlab在GUI中生成excel文件
热门文章
- python︱matplotlib使用(读入、显示、写出、opencv混用、格式转换...)
- python operator 模块
- firefox ie 鼠标事件 坐标 兼容问题
- 在CentOS 6.7部署wordpress博客系统Discuz论坛系统
- Cisco IPSec *** 配置详解
- Linux 网卡设备驱动程序设计(3)
- alarm之后调用sleep会这样
- C++day08 学习笔记
- IDC 网络数据存储
- 10以内逆向运算题_加减法启蒙系列 | 实战篇二(10以内减法)