OpenCV基础(2)
1.图像像素与通道操作
1.1.像素算术操作
//加法操作
void cv::add(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray(),int dtype=-1);
//减法操作
void cv::subtract(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray(),int dtype=-1);
//乘法操作
void cv::multiply(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray(),int dtype=-1);
//除法操作
void cv::divide(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray(),int dtype=-1);
- src1:输入第一张图片
- src2:输入第二张图片
- dst:输出图片
- mask:掩膜层
- dtype:数据类型
1.2.像素位操作
//位取反操作
void cv::bitwise_not(InputArray src,OutputArray dst,InputArray mask=noArray());
//位与
void cv::bitwise_and(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray());
//位或
void cv::bitwise_or(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray());
//位异或
void cv::bitwise_xor(InputArray src1,InputArray src2,OutputArray dst,InputArray mask=noArray());
1.3.调整图像亮度与对比度
调整图像亮度:
对于RGB图像来说,RGB三个通道的像素值越高,图像亮度越高,越接近白色;反之,RGB三个通道像素值越低,图像亮度越低,越接近黑色。这里我们可以用简单的像素加法和减法操作用于调整RGB图像的亮度
Mat img=Mat::zeros(image.size(),image.type());
img.setTo(Scalar(50,50,50))
Mat lightMat,darkMat;
//亮度增强
add(image,img,lightMat);
//亮度降低
subtract(image,img,darkMat);
调整图像对比度:
图像对比度主要用于描述图像亮度之间的感知差异,对比度越大,图像的每个像素与周围的差异性越大,整个图像的细节越显著,反之亦然。图像乘法或除法操作可分别用于扩大或缩小图像像素之间的差值,从而达到调整图像对比度的目的
Mat img=Mat::zeros(image.size(),CV_32FC3);
img.setTo(Scalar(0.8,0.8,0.8))
Mat lowContrastMat,highContrastMat;
//高对比度
multiply(image,img,lowContrastMat,1.0,CV_8U);
//低对比度
divide(image,img,highContrastMat,1.0,CV_8U);
1.4.图像类型
Mat的数据类型有很多种,而且各种Mat数据类型可以根据需要进行类型转换。imread默认加载的是CV_8UC3类型数据,显示的时候使用imshow即可;但当其数据类型转换为CV_32FC3浮点型数据时,直接通过imshow显示的图像将呈白色,无法正常显示;这是因为imshow对浮点型数据的取值范围时[0~1],所以需要对转换后的图像先除以255,将取值范围[0~255]转换到[0~1],这样图像就可以正常显示了
void cv::Mat::convertTo(
OutputArray m, //输出对象
int rtype, //数据类型
double alpha=1,//缩放系数
double beta=0 //加和
)
1.5.图像通道
//查询图像通道数
int cv::Mat::channels();
//不同通道数目相互切换
void cv::cvtColor(
InputArray src, //输入图像
OutputArray dst, //输出图像
int code, //转换格式
int dstCn=0
)
//常见的转换格式如下:
//COLOR_BGR2GRAY:三通道转换为单通道(彩色图像转换为灰度图像)
//COLOR_GRAY2BGR:单通道转换为三通道(无法把丢失的色彩转换回来)
1.6.通道操作
//通道分离
void cv::split(
const Mat &src,//输入图像
Mat *mvbegin //输出的通道Mat数组,用std::vector<Mat>表示
);
//通道合并
void cv::merge(
InputOutputArrays mv,//输入的多个单通道数据
OutputArray dst //输出Mat对象
);
2.几何变换
2.1.图像翻转
void flip(InputArray src, OutputArray dst, int flipCode)
- src 代表 原始图像矩阵
- dst 代表 变换后的图像矩阵
- flipCode 代表翻转模式,总共三种(0:垂直方向翻转 ;1:水平方向翻转 ;-1:水平、垂直方向同时翻转)
2.2.图像旋转
Mat getRotationMatrix2D(Point2f center,double angle,double scale);
- center:旋转的中心点
- angle:旋转的角度
- scale:图像缩放因子
2.3.图像缩放
void resize(InputArray src,OutputArray dst,Size dsize,double fx=0,double fy=0,int interpolation=INTER_LINEAR)
- src:输入图像
- dst:输出图像
- dsize:目标图像大小
- fx:在X轴上的缩放比例
- fy:在y轴上的缩放比例
- interpolation:插值方式
- INTER_NN:最近邻插值
- INTER_LINEAR:双线性插值
- INTER_AREA:使用像素关系重采样,当图像缩小时,可以避免波纹出现;当图像放大时,类似INTER_NN方法
- INTER_CUBIC:立方插值
注意:dsize与fx和fy不能同时为0