1、图像操作
①读取图像
②像素操作
Vec3b对应三通道的顺序是blue、green、red的uchar类型数据
所涉及函数:
cvtColor():函数是一个颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间转换。也可以转换为灰度图。
bitwise_not(src,dst):是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1。
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
Mat src = imread("1.jpg");
if(src.empty()){
cout<<"could not load image"<<endl;
return -1;
}
namedWindow("srcImage",CV_WINDOW_AUTOSIZE);
imshow("srcImage",src);
Mat gray_src;
cvtColor(src,gray_src,CV_BGR2GRAY);//转换为灰度图像
imshow("grayImage",gray_src);
int width = gray_src.cols;
int height = gray_src.rows;
//单通道
for(int row = 0;row < height;row++)
{
for(int col = 0; col < width;col++)
{
int gray = gray_src.at<uchar>(row,col);
gray_src.at<uchar>(row,col) = 255 - gray;
}
}
imshow("invertImage",gray_src);
Mat dst;
dst.create(src.size(),src.type());
width = src.cols;
height = src.rows;
int channel = src.channels();
//等同于bitwise_not(src,dst);
for(int row = 0;row < height;row++)
{
for(int col = 0; col < width;col++)
{
int b = src.at<Vec3b>(row,col)[0];
int g = src.at<Vec3b>(row,col)[1];
int r = src.at<Vec3b>(row,col)[2];
dst.at<Vec3b>(row,col)[0] = 255 -b;
dst.at<Vec3b>(row,col)[1] = 255 -g;
dst.at<Vec3b>(row,col)[2] = 255 -r;
}
}
imshow("invertImageBGR",dst);
waitKey(0);
return 0;
}
2、图像混合
①线性混合操作:
相关API:
addWeighted()
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
Mat src1,src2,dst;
src1 = imread("mogu.jpg");
src2 = imread("rain.jpg");
if(src1.empty()||src2.empty())
{
cout<<"could not load image"<<endl;
return -1;
}
double alpha = 0.5;
if(src1.rows==src2.rows && src1.cols==src2.cols && src1.type()==src2.type()){
addWeighted(src1, alpha, src2, 1.0-alpha, 0.0, dst);
imshow("blend image",dst);
}
else
{
cout<<"could not blend images,the size of images is not same"<<endl;
return -1;
}
waitKey(0);
return 0;
}
3、调整图像对比度与亮度
图像变换可以分为:①像素变换--点操作②邻域操作--区域。调整图像亮度与对比度属于点操作。
参数a:增益,控制图像的对比度;
参数b:偏置,控制图像亮度。
//-----------------------------------【头文件包含部分】---------------------------------------
// 描述:包含程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
//#include <opencv2/opencv.hpp>
#include <iostream>
//-----------------------------------【命名空间声明部分】---------------------------------------
// 描述:包含程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace std;
using namespace cv;
//-----------------------------------【全局函数声明部分】--------------------------------------
// 描述:全局函数声明
//-----------------------------------------------------------------------------------------------
static void ContrastAndBright(int, void *);
//-----------------------------------【全局变量声明部分】-----------------------