目录
一、彩色图灰度化
1、主要函数cvtColor()介绍
2、代码
3、效果
二、通道分离
1、向量介绍
2、总代码
3、效果
三、单通道(灰度图)反差处理
1、单通道向量访问
2、代码
3、效果
四、多通道(彩色图)反差处理(彩色图的反差处理)
1、多通道向量访问
2、代码
3、效果
总代码
一、彩色图灰度化
1、主要函数cvtColor()介绍
彩图灰度化要用到cv2.cvtColor() 颜色转换函数
cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
. InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类
. OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类
. int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片。
(注:这里用的是COLOR_RGB2GRAY(彩图转灰度图)(用的opencv3,所以用右边的参数))
. int dstCn = 0: 目标图像通道数,如果取值为0,则由src和code决定
2、代码
//原图转灰度图
#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat img;img = imread("Resource/test.jpg"); //读取if (img.empty()){printf("could not load the picture...");}// 将彩色图转换为灰度图,常采用以下方法:Mat gray_img;cvtColor(img, gray_img, COLOR_RGB2GRAY); //颜色转换函数// 原图 新图 RGB转GRAYnamedWindow("原图:", WINDOW_AUTOSIZE);imshow("原图:", img);namedWindow("灰度图片:", WINDOW_AUTOSIZE);imshow("灰度图片:", gray_img);waitKey(0);return 0;
}
3、效果
二、通道分离
1、向量介绍
通道分离需要借助矩阵向量,向量特点是可以无限延伸,一个向量存放一组通道数据。
这里的向量可以理解为数学意义上的列向量,构造一个_cn*1的列向量,数据类型为_Tp,格式如下: Vec <Typename _Tp,int _cn>
注:OpenCV中对RGB图像数据的存储顺序是BGR,而且Scalar+的顺序也是B+G+R搜索结果。
(是BGR不是RGB)
2、总代码
//通道分离
//通道分离需要用到向量(3个通道分别存入3个向量)
#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;Mat img, Img;
vector<Mat> planes; //创建向量(存放各通道内元素)//图像初始化
void Image_Init()
{img = imread("Resource/rgb.jpg"); //读取if (img.empty()){printf("could not load the picture...");exit(0);}
}//改变图像大小(便于观看)
void Resize()
{resize(img, Img, Size(img.cols / 2, img.rows / 2));// 原图 新图 (宽, 高)
}//通道分离
void Split()
{//将原图通道分离split(Img, planes); //分离通道(3个通道分别存入3个向量)//cout << planes[0];//一个向量存放一组通道数据:比如planes[0]存放所有R,planes[1]存放所有G,planes[2]存放所有B
}//显示图像
void Show()
{//显示imshow("原图:", Img);imshow("蓝色通道:", planes[0]); //蓝Bimshow("绿色通道:", planes[1]); //绿Gimshow("红色通道:", planes[2]); //红R
}int main()
{Image_Init(); //图像初始化Resize(); //改变图像大小(便于观看)Split(); //通道分离Show(); //显示图像waitKey(0);return 0;
}
3、效果
三、单通道(灰度图)反差处理
1、单通道向量访问
灰度图是单通道,可以以它作为对象进行操作。
访问Mat对象中的值,最直接的方式是使用Mat的成员函数at,如对于单通道且数据类型为CV_32F的对象m,访问它的第i行第j列的值,格式为:m.at<float>(i,j)。
grayImg.at<float>(i, j); //访问grayImg图片的i行j列元素
2、代码
//单通道访问(灰度图片是单通道)
void OneChannel()
{cvtColor(img, grayImg, COLOR_RGB2GRAY); //彩图转灰度图imshow("灰度图片:", grayImg);//单通道反差处理for (int i = 0; i < grayImg.rows; i++){for (int j = 0; j < grayImg.cols; j++){//对grayImg的i行j列元素做反差处理grayImg.at<uchar>(i, j) = 255 - (int)grayImg.at<uchar>(i, j); }}imshow("反差灰度图片:", grayImg);
}
3、效果
四、多通道(彩色图)反差处理(彩色图的反差处理)
1、多通道向量访问
彩色图是多通道,可以以它作为对象进行操作。
访问Mat对象中的值,最直接的方式是使用Mat的成员函数at,如对于单通道且数据类型为CV_32F的对象m,访问它的第i行第j列的值,格式为:m.at<float>(i,j)。
OpenCV向量类:
typedef Vec<uchar, 3> Vec3b;
typedef Vec<int, 2> Vec2i;
typedef Vec<float, 4> Vec4f;
typedef Vec<double, 3> Vec3d;
2、代码
//多通道处理(彩图是多通道)
void MultiChannels()
{for (int i = 0; i < img.rows; i++){//处理方式1:逐向量处理for (int j = 0; j < img.cols; j++){img.at<Vec3b>(i, j)[0] = 255 - img.at<Vec3b>(i, j)[0]; //i行j列0向量(R通道)img.at<Vec3b>(i, j)[1] = 255 - img.at<Vec3b>(i, j)[1]; //i行j列1向量(G通道)img.at<Vec3b>(i, j)[2] = 255 - img.at<Vec3b>(i, j)[2]; //i行j列2向量(B通道)}//处理方式2:逐元素处理/*for (int j = 0; j < img.cols*img.channels(); j++){img.at<uchar>(i, j) = 255 - img.at<uchar>(i, j);}*/}imshow("彩色图片反差处理:", img);
}
3、效果
总代码
//单通道和多通道处理
//单通道处理灰度图,多通道处理彩图
#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;Mat img, grayImg;//单通道处理(灰度图片是单通道)
void OneChannel()
{cvtColor(img, grayImg, COLOR_RGB2GRAY); //彩图转灰度图imshow("灰度图片:", grayImg);//单通道反差处理for (int i = 0; i < grayImg.rows; i++){for (int j = 0; j < grayImg.cols; j++){//对grayImg的i行j列元素做反差处理grayImg.at<uchar>(i, j) = 255 - (int)grayImg.at<uchar>(i, j); }}imshow("灰度图片反差处理:", grayImg);
}//多通道处理(彩图是多通道)
void MultiChannels()
{for (int i = 0; i < img.rows; i++){//处理方式1:逐向量处理for (int j = 0; j < img.cols; j++){img.at<Vec3b>(i, j)[0] = 255 - img.at<Vec3b>(i, j)[0]; //i行j列0向量(R通道)img.at<Vec3b>(i, j)[1] = 255 - img.at<Vec3b>(i, j)[1]; //i行j列1向量(G通道)img.at<Vec3b>(i, j)[2] = 255 - img.at<Vec3b>(i, j)[2]; //i行j列2向量(B通道)}//处理方式2:逐元素处理/*for (int j = 0; j < img.cols*img.channels(); j++){img.at<uchar>(i, j) = 255 - img.at<uchar>(i, j);}*/}imshow("彩色图片反差处理:", img);
}int main()
{img = imread("Resource/test.jpg"); //读取if (img.empty()){printf("could not load the picture...");}imshow("原图:", img);//OneChannel(); //单通道处理(灰度图)MultiChannels(); //多通道处理(彩图)waitKey(0);return 0;
}
如果有错误,欢迎斧正,Thanks♪(・ω・)ノ