1.读取像素值
我们可以通过mat.ptr<uchar>()
获取图像某一行像素数组的指针。因此如果想要读取点(x=50,y=0)(⚠️即(row=0,col=50))的像素值,可以这样做:mat.ptr<uchar>(0)[50]
。
在本节将介绍另外几种直接读取像素值的方法。
1.1.读取灰度图的像素值
👉方法一:
| |
📌Scalar
是一个由长度为4的数组作为元素构成的结构体。Scalar
最多可以存储四个值,没有提供的值默认是0。例如上述代码中intensity1=[49,0,0,0]。
因为灰度图像是单通道,因此也可以用int
型。例如上述代码中intensity2=49。
👉方法二:
| |
1.2.读取RGB图像的像素值
| |
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.灰度图像
| |
2.2.RGB图像
| |
3.图像的“与、或、非、异或”操作
bitwise_and
是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
- 。
bitwise_or
是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1∣1=1,1∣0=1,0∣1=1,0∣0=0- 。
bitwise_xor
是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,1∧1=0,1∧0=1,0∧1=1,0∧0=0- 。
bitwise_not
是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,∼1=0,∼0=1
- 。
4.图像ROI区域的选择
限定ROI(region of interest)的位置和大小可以用:Rect r(x,y,x_length,y_length)
。例如:
| |
图像混合
1.线性混合操作
g(x)=(1−α)f0(x)+αf1(x)
其中α
的取值范围为0~1之间。
2.addWeighted
OpenCV中实现图像混合功能的API:
| |
⚠️两张图像的大小和类型必须一致才可以。
上述API的功能就相当于:dst(I)=saturate(src1(I)*alpha+src2(I)*beta+gamma)
,gamma用于调节混合图像的亮度值(或像素值)。
3.add、multiply
图像src1和图像src2大小和类型均一样,则两幅图像对应像素点的像素值相加得到混合后的新图像dst:add(src1,src2,dst)
。
图像src1和图像src2大小和类型均一样,则两幅图像对应像素点的像素值相乘得到混合后的新图像dst:multiply(src1,src2,dst)
。