个人资料,仅供学习使用
修改时间——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课相关推荐

  1. 【个人笔记】OpenCV4 C++ 快速入门 29课

    个人资料,仅供学习使用 修改时间--2022年2月19日 15:02:27 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 29 高斯双边模糊 opencv知识点: 高斯双边模 ...

  2. 【个人笔记】OpenCV4 C++ 快速入门 26课

    个人资料,仅供学习使用 修改时间--2022年2月13日 20:49:07 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 26 直方图均衡化 opencv知识点: 均衡灰度图 ...

  3. 【个人笔记】OpenCV4 C++ 快速入门 25课

    个人资料,仅供学习使用 修改时间--2022年2月13日 20:45:23 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 25 二维直方图 opencv知识点: 计算直方图数 ...

  4. 【个人笔记】OpenCV4 C++ 快速入门 23课

    个人资料,仅供学习使用 修改时间--2022年1月26日 00:49:43 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 23 视频处理与保存 opencv知识点: Vide ...

  5. 【个人笔记】OpenCV4 C++ 快速入门 22课

    个人资料,仅供学习使用 修改时间--2022年1月25日 22:09:17 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 22 视频文件摄像头使用 opencv知识点: VI ...

  6. 【个人笔记】OpenCV4 C++ 快速入门 20课

    个人资料,仅供学习使用 修改时间--2022年1月24日 22:09:02 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 20 图像翻转 opencv知识点: 图像翻转 - ...

  7. 【个人笔记】OpenCV4 C++ 快速入门 19课

    个人资料,仅供学习使用 修改时间--2022年1月24日 20:17:13 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 19 图像放缩与插值 opencv知识点: 图像放缩 ...

  8. 【个人笔记】OpenCV4 C++ 快速入门 17课

    个人资料,仅供学习使用 修改时间--2022年1月23日 17:59:14 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 17 鼠标操作与响应 opencv知识点: 设置指定 ...

  9. 【个人笔记】OpenCV4 C++ 快速入门 14课

    个人资料,仅供学习使用 修改时间--2022年2月13日 09:47:32 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 14 图像几何形状绘制 opencv知识点: 四种几 ...

最新文章

  1. 《繁凡的深度学习笔记》前言、目录大纲 一文让你完全弄懂深度学习所有基础(DL笔记整理系列)
  2. mybatis表关联彻底理解
  3. ustc小道消息20211215
  4. 知乎:学计算机的女生都怎么样了?
  5. 《智能家居》培训第六天------2019-01-10
  6. dart语言和java语言_Java不是文明语言吗?
  7. [小记]Centos7网络配置DNS配置解决、yum出错解决。
  8. 洛谷 P1219 八皇后题解
  9. 李宏毅机器学习——概率分类模型
  10. dyve/django-bootstrap-toolkit
  11. vscode中文vsix_离线安装vscode vsix插件
  12. 平面设计完全手册_工业时代的平面设计
  13. APPLE 知识模块初步设计
  14. [LLVM]LLVM入门 ---llvm 代码结构
  15. k8s——kubeadm工具使用
  16. 大数据破获网售假耐克案
  17. JavaScript面向对象:面向对象案例
  18. 美国在线计算机硕士申请难度,美国计算机硕士申请难度大PK
  19. MATLAB中stem函数的使用
  20. matlab gui excel,matlab在GUI中生成excel文件

热门文章

  1. python︱matplotlib使用(读入、显示、写出、opencv混用、格式转换...)
  2. python operator 模块
  3. firefox ie 鼠标事件 坐标 兼容问题
  4. 在CentOS 6.7部署wordpress博客系统Discuz论坛系统
  5. Cisco IPSec *** 配置详解
  6. Linux 网卡设备驱动程序设计(3)
  7. alarm之后调用sleep会这样
  8. C++day08 学习笔记
  9. IDC 网络数据存储
  10. 10以内逆向运算题_加减法启蒙系列 | 实战篇二(10以内减法)