1.运算符运算
首先,我们采用运算符的方式
加法:可能会溢出
减法: 会自动截断为0
乘法:
可能会溢出,提示溢出的错误。
本案例就溢出了,所以没有结果展示除法:如果除数较大,结果最终会被自动截断为0
//函数定义
void operators_demo(Mat& image);
//函数实现
void QuickDemo::operators_demo(Mat& image) {
Mat dst;
dst = image + Scalar(50, 50, 50);
//dst = image - Scalar(50, 50, 50);
//dst = image * Scalar(5, 5, 5);//会溢出
//dst = image / Scalar(5, 5, 5);//会截断为0
imshow("加法操作", dst);
}
解决方案:
截断函数
采用运算符时加法,乘法有溢出隐患,有什么办法解决吗?
这就用到了saturate_cast<uchar>,当使用它时会保证BGR图像的像素值在[0,255]
对于截断的演示,我们用运算符加法演示
截断函数
采用运算符时加法,乘法有溢出隐患,有什么办法解决吗?
这就用到了saturate_cast<uchar>,当使用它时会保证BGR图像的像素值在[0,255]
对于截断的演示,我们用运算符加法演示
void QuickDemo::operators_demo(Mat& image) {
Mat dst = Mat::zeros(image.size(), image.type());
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);
dst.at<Vec3b>(row,col)[0] = saturate_cast<uchar>(p1[0] + p2[0]);
dst.at<Vec3b>(row,col)[1] = saturate_cast<uchar>(p1[1] + p2[1]);
dst.at<Vec3b>(row,col)[2] = saturate_cast<uchar>(p1[2] + p2[2]);
}
}
imshow("加法操作", dst);
}
2.API运算
OpenCV有自带的专用函数,专用函数都有截断处理,以乘法为例。
创建俩个相同大小的矩阵一个用来加,一个用来收,前提类型大小要一样,不然报错
Mat m= Mat::zeros(srcImage.size(), srcImage.type());
不细说了
示例代码:
void QuickDemo::operators_demo(Mat& image) {
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());
m = Scalar(50, 50, 50);
//add(image, m, dst);
//subtract(image, m, dst);
multiply(image, m,dst);
//divide(image, m, dst);
imshow("加法操作", dst);
}