一、概述

1.1 图像代数运算

图像代数运算是指两幅图像对应像素的加、减、乘、除运算,有其组合的运算成为复合代数运算。

1.2 功能

图像代数运算可以抑制噪声或消除噪声,也可以利用叠加运算合成新的图像。

1.3 基本运算形式

式中, 、分别为两幅输入图像在处的灰度值或彩色值。代数运算中,操作的是像素的灰度值或(彩色分量),像素的位置不变。

1.4 代数运算主程序

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>using namespace std;
using namespace cv;// 函数声明
void ImgAdd(Mat& inputImage_1, Mat& inputImage_2, Mat& outputImage);int main()
{// 载入图像并显示Mat originImage_boy = imread("baby.png", 1);Mat originImage_bf = imread("butterfly.png", 1);imshow("original_boy", originImage_boy);imshow("original_bf", originImage_bf);// 创建效果图Mat resultImage;resultImage.create(originImage_boy.rows, originImage_boy.cols, originImage_boy.type());// 记录时间double timeClock = static_cast<double>(getTickCount());// 两幅图像的加运算ImgAdd(originImage_boy, originImage_bf, resultImage);// 输出时间timeClock = ((double)getTickCount() - timeClock) / getTickCount();cout << "run time:" << timeClock << "seconds" << endl;Mat resultImage_add = resultImage.clone();addWeighted(originImage_boy, 0.5, originImage_bf, 0.5, 0, resultImage_add);imshow("resultImage_add", resultImage_add);imshow("result_add",resultImage);waitKey(0);return 0;
}

二、图像加运算

2.1 加运算基础理论:

加运算即将两幅图像对应像素的灰度值或彩色分量进行相加

2.2 功能

2.2.1 将同一场景的图像相加后再取平均,消除图像的随机噪声。

2.2.1 把多幅图像叠加在一起再进一步处理,做特效。

2.3 具体操作理论

对于灰度图像,相加的结果为对应像素的灰度值相加;对于彩色图像,对应的颜色的分量相加,若结果大于255,则置为255.

2.4 编程实例

通常,相加的两幅图像大小和尺寸应该相同。

方法一、使用迭代器对图像的像素进行操作:

void ImgAdd(Mat& inputImage_1, Mat& inputImage_2, Mat& outputImage)
{outputImage = inputImage_1.clone();Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>(); // outputImage的初始位置Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>(); // outputImage的终止位置Mat_<Vec3b>::iterator it_1 = inputImage_1.begin<Vec3b>(); // inputImage_1初始迭代器Mat_<Vec3b>::iterator it_2 = inputImage_2.begin<Vec3b>(); // inputImage_2的初始迭代器for(; it != itend; it++)  // 遍历并相加求平均{(*it)[0] = ((*it_1)[0] + (*it_2)[0]) / 2;(*it)[1] = ((*it_1)[1] + (*it_2)[1]) / 2;(*it)[2] = ((*it_1)[2] + (*it_2)[2]) / 2;it_1++;it_2++;}
}

方法一结果:

方法二、OpenCV中的addWeighted函数进行线性相加

Mat resultImage_add = resultImage.clone();
addWeighted(originImage_boy, 0.5, originImage_bf, 0.5, 0, resultImage_add);
imshow("resultImage_add", resultImage_add);

三、图像减运算

3.1 图像减运算基础理论

图像减运算就是将两幅图像对应像素的灰度值或彩色分量进行相减,若结果小于0,则为0。

3.2  功能

可以用于运动目标检测。

3.3 编程实例

法一、使用动态地址遍历计算

// 使用动态地址计算图像的减运算
void ImgSubt(Mat& inputImage_1, Mat& inputImage_2, Mat& outputImage)
{outputImage = inputImage_1.clone();int rowsNum = outputImage.rows;int colsNum = outputImage.cols;for (int i = 0; i < rowsNum; i++){for (int j = 0; j < colsNum; j++){outputImage.at<Vec3b>(i,j)[0] = tozero(inputImage_1.at<Vec3b>(i,j)[0] - inputImage_2.at<Vec3b>(i,j)[0]);outputImage.at<Vec3b>(i,j)[1] = tozero(inputImage_1.at<Vec3b>(i,j)[1] - inputImage_2.at<Vec3b>(i,j)[1]);outputImage.at<Vec3b>(i,j)[2] = tozero(inputImage_1.at<Vec3b>(i,j)[2] - inputImage_2.at<Vec3b>(i,j)[2]);}}
}uchar tozero(uchar a)
{if (a < 0)return 0;else return a;
}

法一结果图:


法二、OpenCV中的addWeighted函数进行线性相加

Mat resultImage_subt = resultImage.clone();
addWeighted(originImage_boy, 1, originImage_bf, -1, 0, resultImage_subt);
imshow("resultImage_subt", resultImage_subt);

法二、结果

四、图像乘运算

4.1 图像的乘运算

将两幅图像对应的灰度值或彩色分量进行相乘。若相乘的结果大于255,则为255.

4.2 功能

主要作用是抑制图像的某些区域,对于需要保留下来的像素,与之相乘的膜为1,否则为0.(乘运算具有掩膜功能)

4.2 编程实例

使用动态地址遍历计算

// 使用动态地址计算图像的乘运算
void ImgMultiply(Mat& inputImage_1, Mat& inputImage_2, Mat& outputImage)
{outputImage = inputImage_1.clone();int rowsNum = outputImage.rows;int colsNum = outputImage.cols;for (int i = 0; i < rowsNum; i++){for (int j = 0; j < colsNum; j++){outputImage.at<Vec3b>(i,j)[0] = (inputImage_1.at<Vec3b>(i,j)[0] * inputImage_2.at<Vec3b>(i,j)[0]) % 256;outputImage.at<Vec3b>(i,j)[1] = (inputImage_1.at<Vec3b>(i,j)[1] * inputImage_2.at<Vec3b>(i,j)[1]) % 256;outputImage.at<Vec3b>(i,j)[2] = (inputImage_1.at<Vec3b>(i,j)[2] * inputImage_2.at<Vec3b>(i,j)[2]) % 256;}}
}

4.3 实验结果

五、图像除运算

5.1 图像除运算基本原理

图像除运算是将两幅图像对应的元素的灰度值或彩色分量进行相除。若作除数的灰度值为0,则用1代替

5.2 功能

可以改变图像的灰度级,可以用于校正非线性畸变的成像设备

5.3 编程实例

// 使用动态地址计算图像的除运算
void ImgDivide(Mat& inputImage_1, Mat& inputImage_2, Mat& outputImage)
{outputImage = inputImage_1.clone();int rowsNum = outputImage.rows;int colsNum = outputImage.cols;for (int i = 0; i < rowsNum; i++){for (int j = 0; j < colsNum; j++){outputImage.at<Vec3b>(i,j)[0] = (inputImage_1.at<Vec3b>(i,j)[0] * 1.0) / inputImage_2.at<Vec3b>(i,j)[0];outputImage.at<Vec3b>(i,j)[1] = (inputImage_1.at<Vec3b>(i,j)[1] * 1.0) / inputImage_2.at<Vec3b>(i,j)[1];outputImage.at<Vec3b>(i,j)[2] = (inputImage_1.at<Vec3b>(i,j)[2] * 1.0) / inputImage_2.at<Vec3b>(i,j)[2];}}
}

5.4 实验结果

图像处理-Opencv入门(3)-图像的基本运算(1)-代数运算相关推荐

  1. opencv入门基础——图像读取,图像显示,图像保存

    一,图像读取 如上图所示,从文件中导入图像用这个函数 retval=cv.imread(文件名,[,显示控制参数]) 显示控制参数,主要是这几个: cv.IMREAD_UNCHANGED cv.IMR ...

  2. 【图像处理opencv】_图像锐化

    目录 0 程序环境与所学函数 1 卷积 2 均值模糊 3 中值滤波 4 高斯模糊 5 双边滤波 0 程序环境与所学函数 本章程序运行需要导入下面三个库,并定义了一个显示图像的函数 import cv2 ...

  3. 【图像处理opencv】_图像几何变换

    目录 0 程序环境与所学函数 1 裁剪.放大.缩小 2 平移变换 3 错切变换 4 镜像变换 5 旋转变换 6 透视变换 7 最近邻插值.双线性插值 0 程序环境与所学函数 本章程序运行需要导入下面三 ...

  4. 【图像处理opencv】_图像基础

    目录 0 程序环境与所学函数 1 自定义图像 2 三种常见图像相互转换 3 通道分离与合并 4 两图像的加减乘除 5 图像线性变换和非线性变换 ​6 图像融合 0 程序环境与所学函数 本章程序运行需要 ...

  5. OpenCV入门——基本图像操作

    处理灰度图片 读入图像 OpenCV可以读入不同类型的图像 (PNG, JPG, etc).可以上传灰度图片.彩色图片或者带Alpha通道的图片.使用cv2.imread()函数,语法规则见下: re ...

  6. 【OpenCV】(三)opencv入门之图像的基本操作——图像阈值分割(ostu算法)

    所谓图像分割是根据灰度.彩色.空间纹理.几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性和相似性. 现有的图像分割有以下几类: 1.基于阈值分割:通过设定不同的特征 ...

  7. 【图像处理opencv】_图像边缘

    目录 0 程序环境与所学函数 1 Prewitt.Robert 算子 2 sobel .scharr算子 3 Laplacian . LoG算子 4 Canny边缘检测 5 Canny边缘检测底层代码 ...

  8. [深度学习]Part1 Python学习进阶Ch24图像处理OpenCV(24.1~24.13)——【DeepBlue学习笔记】

    本文仅供学习使用 Python高级--Ch24图像处理OpenCV(24.1~24.13) 24. 图像处理OpenCV 24.1 图像读取.显示.保存 24.1.1 图像的基本操作 24.1.2 摄 ...

  9. Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图

    一步一步来吧 上一节:Python+Opencv图像处理新手入门教程(一):介绍,安装与起步 1.什么是图像 对于计算机而言,图像的本质是一个由像素点构成的矩阵. 例如我们用肉眼很容易分辨一辆汽车的后 ...

最新文章

  1. 课程 | 中科院教授带你快速入门机器学习
  2. android dtb文件位置_android MSM8974 上DeviceTree简介
  3. 大数据可视化软件//完美的SCI配图
  4. 三数之和为0(c语言实现)(改进)
  5. 快手于冰:跟最优秀的人一起追求极致
  6. SAP Spartacus页面底部的Component请求
  7. Design Compiler指南——后综合过程
  8. flowable背压 取消_使用Flowable.generate()生成可感知背压的流– RxJava常见问题解答...
  9. Go语言开发设置代理Goproxy,提高Go安装模块速度
  10. mysql多字段分库分表基因码_一文学会常用 MySQL 分库分表方案
  11. MessageDialog MessageDialogPage
  12. onclick控制元素显示与隐藏时,点击第一次无反应的原因
  13. c3p0数据库连接池使用步骤c3p0配置报错处理
  14. 咸鱼Maya笔记—Maya 编辑多边形
  15. win7 安装MySQL 5.7.
  16. 人人商城 邀请人 成功购买会员卡之后返现
  17. android手机存储空间猛增,为什么安卓手机运行内存和储存空间增长速度这么快,什么原因呢?...
  18. EIA/TIA 568国际综合布线标准
  19. 移动4G网络App页面加载时间过长
  20. 全球及中国AR智能隐形眼镜市场发展形势分析及投资策略预测报告2022-2028年

热门文章

  1. JZOJ5952. 【NOIP2018模拟11.5A组】凯旋而归
  2. Linux命令之ps-ef|grep ps-aux|grep nohup
  3. Nginx教程(1)
  4. linux中$符号有什么作用,linux中的“$”符号表示什么
  5. 为什么大家都用美颜SDK进行拍摄?美颜SDK未来的发展方向是什么?
  6. 苹果手机微信语音没声音怎么回事_iphonexs没声音,iphonexs扬声器没声怎么回事?...
  7. Google图书馆现在开幕
  8. 马蜂窝陈罡:用户、内容、商业化3C矩阵,是新一代旅游市场密码
  9. MATLAB求矩阵的100次方,Matlab矩阵幂运算
  10. HM代码-码控(1)-乱七八糟的初始化