接着上一次的学习笔记进行:OpenCV学习(C++)——像素点的读取
通过比较笨的办法:可以直接通过像素块的加减(这里面我已经知道是彩色图片所以是三通道)
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); multiply(image, m, dst);//乘法 前俩个参数是乘数 最后一个参数是输出 dst = image + Scalar(50, 50, 50);//每一个像素点都加50 imshow("加法 *** 作", dst); dst = image - Scalar(50, 50, 50); imshow("减法 *** 作",dst); dst = image / Scalar(2, 2, 2); imshow("除法 *** 作",dst); int w = image.cols;//获取图像宽度 int h = image.rows;//获取图像高度 int dims = image.channels();//获取通道数 for (int row = 0; row < h; row++) { for (int col = 0; col < w; col++) { Vec3b p1 = image.at直接调用OpenCV的API(row, col);//返回三个值哦 可以把bgr这个结构看成数组 Vec3b p2 = m.at (row, col); dst.at (row, col)[0] = saturate_cast (p1[0] + p2[0]); dst.at (row, col)[1] = saturate_cast (p1[1] + p2[1]); dst.at (row, col)[2] = saturate_cast (p1[2] + p2[2]); } } imshow("加法 *** 作", dst); 其实直接call OpenCV的API就行了 //add(image, m, dst);//加法 subtract(image, m, dst);//减法 divide(image, m, dst);//除法 multiply(image, m, dst);//乘法 前俩个参数是乘数 最后一个参数是输出 //imshow("加法 *** 作", dst); }
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); multiply(image, m, dst);//乘法 前俩个参数是乘数 最后一个参数是输出 //其实直接call OpenCV的API就行了 add(image, m, dst);//加法 //subtract(image, m, dst);//减法 //divide(image, m, dst);//除法 //multiply(image, m, dst);//乘法 前俩个参数是乘数 最后一个参数是输出 imshow("加法 *** 作", dst);saturate_cast函数
简要介绍一下里面的saturate_cast函数:
saturate_cast(p1[0] + p2[0]);对右边括号里的俩个数做一下判定小于0赋值为0 大于255赋值为255
原理大致如下
if(data<0) data=0; else if(data>255) data=255;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)