前提:输入图像的大小和类型必须一致
越界处理:
- 大于255,则会减去255
- 小于0,则等于0
基本计算,加减乘除
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src1 = imread("f:/temp/images/WindowsLogo.jpg"); Mat src2 = imread("f:/temp/images/LinuxLogo.jpg"); //namedWindow("003-windowsSrc", WINDOW_AUTOSIZE); //namedWindow("003-linuxSrc", WINDOW_AUTOSIZE); //imshow("003-windowsSrc", src1); //imshow("003-linuxSrc", src2); /* Mat dst1;// ** add(src1, src2, dst1); imshow("add", dst1); Mat dst2; // 减 subtract(src1, src2, dst2); imshow("subtract", dst2); Mat dst3; // 乘 multiply(src1, src2, dst3); imshow("multiply", dst3); Mat dst4; // 除 divide(src1, src2, dst4); imshow("divide", dst4); */ Mat src = imread("f:/temp/images/butterfly.jpg"); imshow("butterfly.jpg", src); Mat black = Mat::zeros(src.size(), src.type()); black = Scalar(40, 40, 40); Mat dst; // 加或减,改变图像的亮度 //add(src, black, dst); subtract(src, black, dst); //imshow("dst", dst); Mat dst2; black = Scalar(127, 127, 127); // 让两个图像以不同的权重相加,然后加上一个常量的值 // 权重可以给负数 addWeighted(src, 1.2, black, 0.5, 0, dst2); imshow("dst2", dst2); Mat dst3; addWeighted(src1, 1, src2, 0.5, 0, dst3); imshow("src1+src2", dst3); waitKey(0); destroyAllWindows(); return 0; }
基本位操作
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src = imread("f:/images/apple.jpg"); Mat src1 = imread("f:/images/WindowsLogo.jpg"); Mat src2 = imread("f:/images/LinuxLogo.jpg"); imshow("src", src); // 位操作 // 图像取反 Mat m1; bitwise_not(src, m1, Mat()); imshow("bitwise_not", m1); Mat m2; Mat mask = Mat::zeros(src.size(), CV_8UC1); // 参照mask的像素值进行取反 // mask如果全是0的话,则不取反 bitwise_not(src, m2, mask); imshow("bitwise_not---mask", m2); Mat m3; Mat mask2 = Mat::zeros(src.size(), CV_8UC1); int w = src.cols / 2; int h = src.rows / 2; for (int row = 0; row < h; row++) { for (int col = 0; col < w; col++) { mask2.at<uchar>(row, col) = 255; } } imshow("mask2", mask2); bitwise_not(src, m3, mask2); imshow("m3 bitwise_not", m3); // 与操作 Mat m4; bitwise_and(src1, src2, m4); imshow("m4 bitwise_and", m4); // 或操作 Mat m5; bitwise_or(src1, src2, m5); imshow("m5 bitwise_or", m5); // 异或操作 Mat m6; bitwise_xor(src1, src2, m6); imshow("m6 bitwise_xor", m6); // 参数 mask:取ROI区域 // 位运算的最后一个参数都可以给出一个mask waitKey(0); destroyAllWindows(); return 0; }
来源:https://www.cnblogs.com/wbyixx/p/12243973.html