Mat的创建与赋值
//拷贝
Mat m1, m2;
m1 = image.clone();
image.copyTo(m2);
//创建空白图像
Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);
遍历像素
int w = image.cols;//宽度
int h = image.rows;//高度
int dims = image.channels();//通道数
for (int row = 0; row < h; row++) {
uchar* current_row = image.ptr<uchar>(row);
for (int col = 0; col < w; col++) {
if (dims == 1) {
//单通道,即灰度图
//int pv = image.at<uchar>(row, col);//获取像素值
//image.at<uchar>(row, col) = 255 - pv;
int pv = *current_row;
*current_row++ = 255 - pv;
}
else if (dims == 3) {
//彩色图
Vec3b bgr = image.at<uchar>(row, col);
//image.at<Vec3b>(row, col)[0] = 255 - bgr[0];
//image.at<Vec3b>(row, col)[1] = 255 - bgr[1];
//image.at<Vec3b>(row, col)[2] = 255 - bgr[2];
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
*current_row++ = 255 - *current_row;
}
}
图像像素的算术操作
saturate_cast<uchar>(xxxxxxx)
xxxxxxx为算术表达式
这个函数的功能是,将计算结果限定在0-255内,若结果小于0,则得0,若结果大于255,则为255,若在0-255之间,则输出正确的值
void Demo::operators_demo(Mat &image) {
Mat dst;
dst = image + Scalar(100,100,100);
imshow("算术操作", dst);
//公式(x1,x2为两个操作图片,x3为输出图片)
//add(x1, x2, x3);
//subtract(x1, x2, x3);
//divide(x1, x2, x3);
//multiply(x1, x2, x3);
//乘法
Mat m = Mat::zeros(image.size(), image.type());
m = Scalar(2,2,2);
multiply(image, m, dst);
imshow("mul", dst);
}