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