本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
1.读取像素值
在【OpenCV基础】第三课:掩膜操作中,我们可以通过mat.ptr<uchar>()
获取图像某一行像素数组的指针。因此如果想要读取点(x=50,y=0)(⚠️即(row=0,col=50))的像素值,可以这样做:mat.ptr<uchar>(0)[50]
。
在本节将介绍另外几种直接读取像素值的方法。
1.1.读取灰度图的像素值
👉方法一:
1
2
Scalar intensity1=img.at<uchar>(y,x);
int intensity2=img.at<uchar>(y,x);
📌Scalar
是一个由长度为4的数组作为元素构成的结构体。Scalar
最多可以存储四个值,没有提供的值默认是0。例如上述代码中intensity1=[49,0,0,0]。
因为灰度图像是单通道,因此也可以用int
型。例如上述代码中intensity2=49。
👉方法二:
1
Scalar intensity3=img.at<uchar>(Point(x,y));
1.2.读取RGB图像的像素值
1
2
3
Vec3b pnt1=img.at<Vec3b>(y,x);//例如[39, 41, 51]
Scalar pnt2=img.at<Vec3b>(y,x);//例如[39, 41, 51, 0]
Vec3b pnt3=img.at<uchar>(y,x);//自动转换成灰度值,例如[49,0,0]
Vec3b
的定义为typedef Vec<uchar,3> Vec3b
。
类似的还有,Vec3f
的定义为typedef Vec<float, 3> Vec3f
。
1.2.1.读取各个通道的亮度值
- B
int blue=pnt1.val[0];
int blue=img.at<Vec3b>(y,x)[0];
- G
int green=pnt1.val[1];
int green=img.at<Vec3b>(y,x)[1];
- R
int red=pnt1.val[2];
int red=img.at<Vec3b>(y,x)[2]
2.修改像素值
2.1.灰度图像
1
img.at<uchar>(y,x)=128;
2.2.RGB图像
1
2
3
img.at<Vec3b>(y,x)[0]=128;//blue
img.at<Vec3b>(y,x)[1]=128;//green
img.at<Vec3b>(y,x)[2]=128;//red
3.图像的“与、或、非、异或”操作
bitwise_and
是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,$1\&1=1,1\&0=0,0\&1=0,0\&0=0$。bitwise_or
是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,$1\mid 1=1,1\mid 0=1,0\mid 1=1,0\mid 0=0$。bitwise_xor
是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,$1^\wedge 1=0,1^\wedge 0=1,0^\wedge 1=1,0^\wedge 0=0$。bitwise_not
是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,$\sim 1=0,\sim 0=1$。
4.图像ROI区域的选择
限定ROI(region of interest)的位置和大小可以用:Rect r(x,y,x_length,y_length)
。例如:
1
2
Rect r(10,10,100,100);//cv::Rect
Mat dst=img(r);