本系列代码托管于:https://github.com/chintsan-code/opencv4-tutorials

本篇使用的项目为:pixel_operator

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char** argv) {
	Mat src = imread("../sample/lena512color.bmp");
	if (src.empty())
	{
		cout << "could not load image..." << endl;
		return -1;
	}
	imshow("src", src);
	Mat dst1 = src + Scalar(50, 50, 50);
	imshow("add", dst1);
	Mat dst2 = src - Scalar(50, 50, 50);
	imshow("sub", dst2);
	Mat dst3;
	multiply(src, Scalar(2, 2, 2), dst3);
	imshow("mul", dst3);
	Mat dst4 = src / Scalar(2, 2, 2);
	imshow("div", dst4);

	//另一种方式实现加法
	Mat dst5 = Mat::zeros(src.size(), src.type());
	for (int row = 0; row < src.rows; row++)
	{
		for (int col = 0; col < src.cols; col++)
		{
			Vec3b p1 = src.at<Vec3b>(row, col);  // BGR
			dst5.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(p1[0] + 50);
			dst5.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(p1[1] + 50);
			dst5.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(p1[2] + 50);
		}
	}
	imshow("add2", dst5);

	waitKey(0);
	destroyAllWindows();
	return 0;
}

cv::multiply:计算两个图像按像素的乘积

void cv::multiply(cv::InputArray src1, cv::InputArray src2, cv::OutputArray dst, double scale = 1, int dtype = -1);
  • src1、src2:输入图像
  • dst:输出图像
  • scale:比例因子
  • dtype:输出图像的深度

cv::saturate_cast:防止溢出

例如saturate_cast<uchar>就是防止计算结果超出uchar数据范围,即大于255就输出255,小于0就输出0

cv::Mat::size():获取图像尺寸

cv::Mat::MatSize cv::Mat::size()

cv::Mat::type() :获取图像类型

int cv::Mat::type()

例如CV_8UC1、CV_8UC3等