方法一:ptr指针的访问
由于读取的是彩色图片,则有三个通道bgr,用ptr指针的方法是把一个像素点的三个通道拆成了三个数组,则在行数不变的 情况下,列数变为了像素点列数的三倍
*data是data数组的首地址,img.ptr<vec3b>(i)是第i行的首地址<vec3b>是彩色图像的类型<uchar>是灰度图的类型,那么data数组的各个元素以三为周期对应了各个像素点
j%3则取余对应了相应的bgr通道
方法二 at动态地址访问
at动态地址访问,at操作来实现对特定点(i,j)像素值的读取与操作(写入),vec3b指的是unchar类型三通道(其实图像可以有4通道,最后一个是阿尔法通道),并暂存于对应像素点为数组名的[0],[1],[2]数组中
两种方法的彩色转素描
这两种方法的思路都是先把彩色图转化为灰度图,根据图像边缘像素值的突变把灰度值(255白-0黑)二值化(0和255)
效果图
三:Mat矩阵类的加减运算与逻辑运算
Mat img1,img2;
Mat dst=img1+img2;
这种Mat类的加减实质上是两个Mat类相应位置像素的加减
//add(img1,img2,dst);//直接把两个图像相应点的像素值相加输出
//addWeighted(img1,0.1,img2,1,0,dst);//二四两个参数是对应图像的权重,及对应图像像素值*权重,再把两个相加,可以通过权重来改变图片显示的对比度
absdiff(img1,img2,dst);
这种方法与图像相减类似,但是若是上面的图像相减操作,若为负则对应的像素值为0,而这种方法若为负,则像素值为绝对值
这种方法可以用于缺陷检测等两个相似图像寻找不同点
图像的与或操作是把10进制的像素值变成二进制然后进行与或操作后转化为十进制