02 图像色彩空间转换

02 图像色彩空间转换

opencv知识点:

色彩空间转换函数 - cvtColor()
图像保存 - imwrite()
图像显示 - imshow()

本课解决的问题:

如何对图片进行色彩空间转换?
如何保存图像?

1.准备事项

创建头文件quickopencv.h 以及 源文件 quickdemo.cppmain.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);

};

原图:

356ecda6c48f2940a198ad6fb7551c2

灰度:

668ddb7ce7df8753c319ad754315431

HSV:

0b5a9c8c43635fcaa4febb1707dcd6f

补充知识

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色彩空间
posted @ 2023-01-11 15:24  L707  阅读(74)  评论(0编辑  收藏  举报