图 像 算 术 操 作 和 位 操 作 图像算术操作和位操作 图像算术操作和位操作
1.视频教程:
B站、网易云课堂、腾讯课堂
2.代码地址:
Gitee
Github
3.存储地址:
Google云
百度云:
提取码:
1.加减乘除
输入图像的大小与类型必须一致
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src1 = imread("E:/cats.jpg", IMREAD_COLOR); // IMREAD_COLOR:加载为3通道彩色图像
Mat src2 = Mat::zeros(src1.size(), src1.type());
src2 = Scalar(0, 255, 0);
if (src1.empty() || src2.empty()) {
printf("image is empty!!!");
return -1;
}
imshow("src1",src1);
imshow("src2",src2);
waitKey(0);
destroyAllWindows();
return 0;
}
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src1 = imread("E:/cats.jpg", IMREAD_COLOR); // IMREAD_COLOR:加载为3通道彩色图像
Mat src2 = Mat::zeros(src1.size(), src1.type());
src2 = Scalar(0, 255, 0);
if (src1.empty() || src2.empty()) {
printf("image is empty!!!");
return -1;
}
imshow("src1",src1);
imshow("src2",src2);
Mat add_show;
add(src1, src2, add_show);
imshow("add_show", add_show);
Mat subtract_show;
subtract(src1, src2, subtract_show);
imshow("sub_show", subtract_show);
Mat multiply_show;
multiply(src1, src2, multiply_show);
imshow("multiply_show", multiply_show);
Mat divide_show;
divide(src1, src2, divide_show);
imshow("divide_show", divide_show);
waitKey(0);
destroyAllWindows();
return 0;
}
处理越界
2.亮度调整
通过加法进行亮度变化
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("E:/cats.jpg", IMREAD_COLOR); // IMREAD_COLOR:加载为3通道彩色图像
if (src.empty() ) {
printf("image is empty!!!");
return -1;
}
imshow("src",src);
Mat black = Mat::zeros(src.size(), src.type());
black = Scalar(40, 40, 40);
Mat dst;
add(src, black, dst);
imshow("dst", dst);
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("E:/cats.jpg", IMREAD_COLOR); // IMREAD_COLOR:加载为3通道彩色图像
if (src.empty() ) {
printf("image is empty!!!");
return -1;
}
imshow("src",src);
Mat black = Mat::zeros(src.size(), src.type());
black = Scalar(50, 50, 50);
Mat dst;
subtract(src, black, dst);
imshow("dst", dst);
waitKey(0);
destroyAllWindows();
return 0;
}
3.对比度调整
addWeighted:调整亮度和对比度
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("E:/cats.jpg", IMREAD_COLOR); // IMREAD_COLOR:加载为3通道彩色图像
if (src.empty() ) {
printf("image is empty!!!");
return -1;
}
imshow("src",src);
Mat black = Mat::zeros(src.size(), src.type());
black = Scalar(50, 50, 50);
Mat dst;
// 1.5表示乘以1.5,用来提高对比度,black和0.2用来调整亮度
addWeighted(src, 1.25, black, 0.1, 0.0, dst);
imshow("dst", dst);
waitKey(0);
destroyAllWindows();
return 0;
}
4.与、非、或、异或
1.图像取反、mask
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("E:/cats.jpg", IMREAD_COLOR); // IMREAD_COLOR:加载为3通道彩色图像
if (src.empty() ) {
printf("image is empty!!!");
return -1;
}
imshow("src",src);
// 图像取反
Mat m1;
bitwise_not(src, m1, Mat()); // Mat() ==> Mat mask = Mat::zeros(src.size(),CV_8UC1); 中的mask
imshow("bitwise not", m1);
waitKey(0);
destroyAllWindows();
return 0;
}
当mask中的值>0时,才能进行与、非、或、异或操作,反正就是无效的全0(黑)
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("E:/cats.jpg", IMREAD_COLOR); // IMREAD_COLOR:加载为3通道彩色图像
if (src.empty() ) {
printf("image is empty!!!");
return -1;
}
imshow("src",src);
// 图像取反
Mat m1;
Mat mask = 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++) {
mask.at<uchar>(row,col) = 255;
}
}
imshow("mask", mask);
// bitwise_not(src, m1, Mat());
bitwise_not(src, m1, mask);
imshow("bitwise not", m1);
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("E:/cats.jpg", IMREAD_COLOR); // IMREAD_COLOR:加载为3通道彩色图像
if (src.empty() ) {
printf("image is empty!!!");
return -1;
}
imshow("src",src);
Mat mask = 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++) {
mask.at<uchar>(row,col) = 255;
}
}
imshow("mask", mask);
// 与操作
Mat m1;
bitwise_and(src, src, m1, Mat());
imshow("bitwise and1", m1);
Mat m2;
bitwise_and(src, src, m2, mask);
imshow("bitwise and2", m2);
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("E:/cats.jpg", IMREAD_COLOR); // IMREAD_COLOR:加载为3通道彩色图像
if (src.empty() ) {
printf("image is empty!!!");
return -1;
}
imshow("src",src);
Mat mask = 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++) {
mask.at<uchar>(row,col) = 255;
}
}
imshow("mask", mask);
// 或操作
Mat m1;
bitwise_or(src, src, m1, Mat());
imshow("bitwise or1", m1);
Mat m2;
bitwise_or(src, src, m2, mask);
imshow("bitwise or2", m2);
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("E:/cats.jpg", IMREAD_COLOR); // IMREAD_COLOR:加载为3通道彩色图像
if (src.empty() ) {
printf("image is empty!!!");
return -1;
}
imshow("src",src);
Mat mask = 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++) {
mask.at<uchar>(row,col) = 255;
}
}
imshow("mask", mask);
// 异或操作
Mat m1;
bitwise_xor(src, src, m1, Mat());
imshow("bitwise or1", m1);
Mat m2;
bitwise_xor(src, src, m2, mask);
imshow("bitwise or2", m2);
waitKey(0);
destroyAllWindows();
return 0;
}