一、编程环境:
OpenCV | 4.1.0 |
IDE | Visual Studio 2017 Enterprise (15.9.13) |
操作系统 | Windows 10 x64 中文专业版 (1903) |
示例图片 | LinuxLogo.jpg WindowsLogo.jpg |
示例图片下载网址 | https://github.com/opencv/opencv/tree/master/samples/data |
二、图像像素算术运算:
注意:参与算术运算图像的数据类型、通道数目、大小必须相同。
- 加法:(1)直接操作图像像素; (2)调用加法函数:add()
- 减法:subtract()
- 乘法:multiply()
- 除法:divide()
三、程序代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int artc, char** argv) {
Mat src1 = imread("../images/LinuxLogo.jpg");
Mat src2 = imread("../images/WindowsLogo.jpg");
if (src1.empty() || src2.empty()) {
printf("不能加载图像!\n");
return -1;
}
imshow("原图1", src1);
imshow("原图2", src2);
int height = src1.rows;
int width = src1.cols;
int b1 = 0, g1 = 0, r1 = 0;
int b2 = 0, g2 = 0, r2 = 0;
int b = 0, g = 0, r = 0;
Mat result = Mat::zeros(src1.size(), src1.type());
//相加:直接操作像素
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
b1 = src1.at<Vec3b>(row, col)[0];
g1 = src1.at<Vec3b>(row, col)[1];
r1 = src1.at<Vec3b>(row, col)[2];
b2 = src2.at<Vec3b>(row, col)[0];
g2 = src2.at<Vec3b>(row, col)[1];
r2 = src2.at<Vec3b>(row, col)[2];
result.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b1 + b2);
result.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g1 + g2);
result.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r1 + r2);
}
}
imshow("相加(操作像素)", result);
Mat add_result = Mat::zeros(src1.size(), src1.type());
add(src1, src2, add_result);
imshow("相加(add)", add_result);
Mat sub_result = Mat::zeros(src1.size(), src1.type());
subtract(src1, src2, sub_result);
imshow("相减(subtract)", sub_result);
Mat mul_result = Mat::zeros(src1.size(), src1.type());
multiply(src1, src2, mul_result);
imshow("相乘(multiply)", mul_result);
Mat div_result = Mat::zeros(src1.size(), src1.type());
divide(src1, src2, div_result);
imshow("相除(divide)", div_result);
waitKey(0);
return 0;
}