目录
一、彩色图灰度化
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♪(・ω・)ノ