02 图像色彩空间转换
02 图像色彩空间转换
opencv知识点:
色彩空间转换函数 - cvtColor()
图像保存 - imwrite()
图像显示 - imshow()
本课解决的问题:
如何对图片进行色彩空间转换?
如何保存图像?
1.准备事项
创建头文件quickopencv.h
以及 源文件 quickdemo.cpp
,main.cpp
本课程只是为了方便演示,所以采用本种格式。
quickopencv.h
#pragma once
#include<opencv2/opencv.hpp>
using namespace cv;
/*顾名思义:快速的演示。随着课程的推进,里面会有各种demo*/
class QuickDemo {
public:
/*这就是第1个demo,色彩空间转换demo*/
void colorSpace_Demo(Mat& image);
/*
`
`
之后写的demo
·
·
*/
};
2.色彩空间转换+图像保存
接下来我们进行图像的色彩空间转换,并把转换后的图像保存下来。
色彩空间转换 cvtColor
cvtColor
色彩空间转换
共4个参数
第1个参数 输入
第2个参数 输出
第3个参数 色彩空间转换方式
第4个参数 通道数(不输入,则根据输入自动计算)
图像保存 imwrite
imwrite
图像保存
共3个参数
第1个参数 路径+文件名
第2个参数 输入
第3个参数 特定格式编码对(一般用不到)
色彩空间转换有4种常用的方式,本文只演示了两种。
彩色到灰度 - COLOR_BGR2GRAY
对应数值 6
灰度到彩色 - COLOR_GRAY2BGR
对应数值 8
BGR到HSV - COLOR_BGR2HSV
对应数值 40
HSV到BGR - COLOR_HSV2BGR
对应数值 54
3.色彩空间转换程序
main.cpp
#include "opencv2/opencv.hpp"
#include "quickopencv.h"
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("C:/Users/LZQ/Desktop/lena.png"); // B, G, R
if (src.empty()) {
printf("could not load image....\n");
return -1;
}
namedWindow("输入窗口", WINDOW_FREERATIO);
imshow("输入窗口", src);
QuickDemo qd;
qd.colorSpace_Demo(src); //重点
waitKey(0);
destroyAllWindows();
return 0;
}
quickdemo.cpp
#include "quickopencv.h"
#include <opencv2/dnn.hpp>
using namespace cv;
using namespace std;
void QuickDemo::colorSpace_Demo(Mat& image) {
Mat gray, hsv;
cvtColor(image, hsv, COLOR_BGR2HSV); // H 0 ~ 180, S, V
cvtColor(image, gray, COLOR_BGR2GRAY); //灰度
imshow("HSV", hsv); //显示HSV图像
imshow("灰度", gray); //显示灰度图像
// imwrite("D:/hsv.png", hsv); // 保存hsv
// imwrite("D:/gray.png", gray); // 保存灰度
}
quickopencv.h
#pragma once
#include <opencv2/opencv.hpp>
using namespace cv;
class QuickDemo { //快速的演示文件 class类
public:
void colorSpace_Demo(Mat& image);
};
原图:
灰度:
HSV:
补充知识
imshow的两种方式
-
默认支持显8位的图像,即[0,255]
-
支持显示数据类型为浮点数的图像,这时[0,1]会映射到[0,255]
除了这两种,其他的显示多多少少会有问题,当我们用imshow的图像,输入图像最好是8位。
那什么图像是8位的?之后会讲解,不过目前可以知道,用imread读进来的,就是8位的。
RGB和HSV
彩色图像的通道是什么呢?
通常彩色图像有BGR三个通道
B,G,R,即按照**蓝 绿 红**的通道顺序
3个通道都是[0,255],即有256 * 256 * 256种组合
如果加上透明通道A(alpha),透明通道也是[0,255],就有256 * 256 * 256 * 256种组合
HSV通道呢
H(色调)范围[0,180]
S(饱和度)范围[0,255]
V(明度)范围[0,255]
其中HS表示颜色,V表示亮度
所以,不同的通道有不同的作用
比如:有时候有些东西不好处理,它没有一个专门的亮度通道
那我们调整亮度,我们就到HSV色彩空间处理就会更好一点,处理完之后再返回BGR色彩空间