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转GRAY

	namedWindow("原图:", 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]);			//蓝B
	imshow("绿色通道:", planes[1]);			//绿G
	imshow("红色通道:", 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♪(・ω・)ノ

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_(*^▽^*)_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值