700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > OpenCV(三)彩色图灰度化 通道分离 单通道反差处理(灰度图) 多通道反差处理(彩色图)

OpenCV(三)彩色图灰度化 通道分离 单通道反差处理(灰度图) 多通道反差处理(彩色图)

时间:2022-03-03 10:04:25

相关推荐

OpenCV(三)彩色图灰度化 通道分离 单通道反差处理(灰度图) 多通道反差处理(彩色图)

目录

一、彩色图灰度化

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♪(・ω・)ノ

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。