直接加、减、除:
Mat QuickDemo::operate_Demo(Mat& image) {
Mat dst;
dst = image + Scalar(50, 50, 50);
//imshow("add operation", dst);
return dst;
}
主函数部分:
int main(int argc, char** argv) {
Mat my_image = imread(filepath);
if (my_image.empty()) {
cout << "error!" << endl;
return -1;
}
imshow("input window", my_image);
QuickDemo qd;
Mat image2 = qd.operate_Demo(my_image);
imshow("add operation", image2);
waitKey(0);
destroyAllWindows();
return 0;
}
运行结果:
除加法外,还可以直接使用对应的减法、除法:
dst = image/ Scalar(2, 2, 2);
dst = image - Scalar(50, 50, 50);
但是,当使用乘法时会报错:
dst = image* Scalar(2, 2, 2);//会报错
算术操作函数
此时,有专门的函数来完成乘法操作:
multiply(输入图像矩阵, 与输入图像格式相同的倍数矩阵, 输出图像矩阵)
同理也有加法,减法,除法的函数:
add(输入图像矩阵, 与输入图像格式相同的倍数矩阵, 输出图像矩阵)
subtract(输入图像矩阵, 与输入图像格式相同的倍数矩阵, 输出图像矩阵)
divide(输入图像矩阵, 与输入图像格式相同的倍数矩阵, 输出图像矩阵)
函数如下:
Mat QuickDemo::operate_Demo(Mat& image) {
Mat dst;
Mat m = Mat::zeros(image.size(), image.type());
m = Scalar(2, 2, 2);
multiply(image, m, dst);
//add(image, m, dst);
//subtract(image, m, dst);
//divide(image, m, dst);
return dst;
}
额外说明:
下述代码为具体矩阵加法实现代码,其中saturate_cast函数为限定函数,能把像素值限定在0~255内。
Mat QuickDemo::operate_Demo(Mat& image) {
Mat dst;
Mat m = Mat::zeros(image.size(), image.type());
m = Scalar(50, 50, 50);
int h = image.rows;
int w = image.cols;
int dims = image.channels();
for (int row = 0; row < h; row++) {
for (int col = 0; col < w; col++) {
Vec3b p1 = image.at<Vec3b>(row, col);
Vec3b p2 = m.at<Vec3b>(row, col);
//saturate_cast函数,可以把像素值限定在0~255
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(p1[0] + p2[0]);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(p1[0] + p2[0]);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(p1[0] + p2[0]);
}
}
return dst;
}
总结:
一般加减法、除法操作可以直接通过Scalar完成,也可以通过add,subtract, divide完成,而乘法操作只能通过multiply函数完成。