【5】OpenCV中图像算术操作与逻辑操作
图像像素四种算术运算:
加:add(Mat src1,Mat src2,Mat addRes);
减:subtract(Mat src1,Mat src2,Mat subRes);
乘:multiply(Mat src1,Mat src2,Mat mulRes);
除:divide(Mat src1,Mat src2, Mat divRes);
——————————————
四种逻辑运算:
//按位与
//按位或
//按位异或
//按位非
——————————————
外加权值的赋值,调整亮度
——————————————
#include<opencv2/opencv.hpp> #include <iostream> using namespace std; int main() { cv::Mat image_1 = cv::imread("0004.png"); cv::Mat image_2 = cv::imread("0005.png"); cv::namedWindow("image - 1", cv::WINDOW_AUTOSIZE); cv::namedWindow("image - 2", cv::WINDOW_AUTOSIZE); cv::imshow("image - 1", image_1); cv::imshow("image - 2", image_2); cv::waitKey(10); //001加法运算(合并两张图片,注意图片格式大小要一致) /* 特点: 输出图像像素的灰度仅取决于两幅或两幅以上的输入图像的对应像素灰度值。算术运算结果和参与运算像素的邻域内像素的灰度值无关 算术运算不会改变像素的空间位置。 */ cv::Mat Result_1 = cv::Mat(image_1.size(), image_1.type()); add(image_1, image_2,Result_1, cv::Mat(), -1); cv::namedWindow("**********************加法操作结果**********************",cv::WINDOW_AUTOSIZE); imshow("**********************加法操作结果 * *********************", Result_1); cv::waitKey(30); cv::destroyWindow("**********************加法操作结果**********************"); //002减法运算 /* * 减法运算:将同一景物在不同时间拍摄的图像或同一景物在不同坡段的图像相减,常称为差影法。 差值图像提供了图像间的差值信息,能用于指导动态监测,运动目标的检测与跟踪,图像背景的消除及目标识别等。 主要应用举例: 差影法(检测同一场景两幅图像之间的变化) 混合图像的分离 */ cv::Mat Result_2 = cv::Mat(image_1.size(), image_1.type()); subtract(image_1, image_2, Result_2, cv::Mat(), -1); cv::namedWindow("image output", cv::WINDOW_AUTOSIZE); imshow("**********************减法操作结果**********************", Result_2); cv::waitKey(30); cv::destroyWindow("**********************减法操作结果**********************"); //003 乘法操作 /* 图像的乘法运算就是将两幅图像对应的灰度值或彩色分量进行相乘。 乘运算的主要作用是抑制图像的某些区域,掩膜值置为1,否则置为0。乘运算有时也被用来实现卷积或相关的运算。 主要应用: 1.图像的局部显示 2.改变图像的灰度级 */ cv::Mat Result_3 = cv::Mat(image_1.size(), image_1.type()); subtract(image_1, image_2, Result_3, cv::Mat(), -1); cv::namedWindow("*****************乘法操作结果*****************", cv::WINDOW_AUTOSIZE); imshow("image output", Result_3); cv::waitKey(2000); cv::destroyWindow("*****************乘法操作结果*****************"); //004 除操作 cv::Mat bgImg = cv::Mat(image_1.size(), image_1.type()); cv::Mat Result_4 = cv::Mat(image_1.size(), image_1.type()); divide(image_1, bgImg,Result_4, 1.0, -1); cv::namedWindow("*****************除法操作结果*****************", cv::WINDOW_AUTOSIZE); imshow("*****************除法操作结果*****************", Result_4); cv::waitKey(30); cv::destroyWindow("*****************除法操作结果*****************"); //005 权重操作调节亮度 cv::Mat Result_5 = cv::Mat(image_1.size(), image_1.type()); cv::addWeighted(image_1, 2.5, image_2, 0.5, 0,Result_5, -1); cv::namedWindow("*****************权重操作结果*****************", cv::WINDOW_AUTOSIZE); imshow("*****************权重操作结果*****************", Result_5); cv::waitKey(30); cv::destroyWindow("*****************权重操作结果*****************"); //006 逻辑运算 之 逻辑非 cv::Mat Result_6 = cv::Mat(image_1.size(), image_1.type()); cv::bitwise_not(image_1, Result_6, cv::Mat()); cv::namedWindow("*****************逻辑非操作结果*****************", cv::WINDOW_AUTOSIZE); imshow("*****************逻辑非操作结果*****************", Result_6); cv::waitKey(30); cv::destroyWindow("*****************逻辑非操作结果*****************"); }
//按位与 void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray()); //按位或 void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray()); //按位异或 void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray()); //按位非 void bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray());
——————————————
附录:
(关于减法应用)
——————————————
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)