OpenCV教程——图像操作。读写像素值,与/或/非/异或操作,ROI

1.读取像素值

我们可以通过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.图像的“与、或、非、异或”操作

  1. 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
2
Rect r(10,10,100,100);//cv::Rect
Mat dst=img(r);

图像混合

1.线性混合操作

g(x)=(1−α)f0(x)+αf1(x)

其中α

的取值范围为0~1之间。

2.addWeighted

OpenCV中实现图像混合功能的API:

 
1
2
3
4
5
6
7
8
9
void cv::addWeighted(
	inputArray src1,//参数1:输入图像Mat-src1
	double alpha,//参数2:输入图像src1的alpha值
	inputArray src2,//参数3:输入图像Mat-src2
	double beta,//参数4:输入图像src2的beta值
	double gamma,//参数5:gamma值
	OutputArray dst,//参数6:输出混合图像
	int dtype=-1//参数7:位图深度,-1表示和原图一样
	)

⚠️两张图像的大小和类型必须一致才可以。

上述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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员柳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值