opencv C艹:色彩空间转换,像素最值,二值化,LUT

色彩空间

RGB,RGBA,YUV(亮度,红色分量与亮度信号的插值,蓝色与亮度的插值),HSV(色度,饱和度,亮度)。。。。。

void cv::cvtColor	(	InputArray 	src,
						OutputArray 	dst,
						int 	code,
						int 	dstCn = 0 
						)	

// 数据类型转换
void cv::Mat::convertTo	(	OutputArray 	m,
int 	rtype,
double 	alpha = 1,
double 	beta = 0 
)		const

改变色彩空间,前两个参数用于输入图像,目标图像,第三个参数指明转换的色彩空间,第四个参数默认就行。。需要注意的是该函数变换前后的图像取值范围
8位无符号图像的像素为0 - 255。CV_8U
16 无符号图像的像素为 0-65535. CV_16U
32 位浮点图像的像素为 0-1 ,
因此一定要注意目标图像的像素范围.在线性变换的情况下,范围问题不需要考虑,目标图像的像素不会超出范围。如果在非线性变换的情况下,那么应将输入 RGB 图像归一化到适当的范围以内来获得正确的结果,例如将 8位无符号图像转成 位32浮点图像 需要先将图像像素通过除以 255 缩放0-1 范围内 以防止产生错误结果.

在这里插入图片描述
数据类型转换,参数为输出图像,转换图像的目标类型,alpha ,beta缩放因子,偏置因子。
m(x,y)=saturatecast<rtpye>(α(∗this)(x,y)+β) m(x,y) = saturate_cast<rtpye>(\alpha(*this)(x,y) + \beta)m(x,y)=saturatecast<rtpye>(α(this)(x,y)+β)

转换方式就是线性变换,按照指定的类型输出。

#include <iostream>                       
#include <opencv2/opencv.hpp>
#include <string>
#include <vector>
using namespace std;
using namespace cv;
 
int main(int argc, char *argv[])
{
   
   
	system("color E");
	Mat img = imread("D:\\壁纸\\2k.jpg");
	cout<<img.type()<<endl;
	cout << size(img) << img.type() << endl;
	if (img.empty())
	{
   
   
		cout << "error";
	}
	Mat gray, HSV, YUV, Lab, img32;
	img.convertTo(img32, CV_32F, 1.0 / 255);  // 类型转换,将CV_8U转换成CV_32F
	cvtColor(img32, HSV, COLOR_BGR2HSV);
	cvtColor(img32, YUV, COLOR_BGR2YUV);
	cvtColor(img32, Lab, COLOR_BGR2Lab);
	cvtColor(img32, gray, COLOR_BGR2GRAY);

	imshow("原图", img32);
	imshow("hsv", HSV);
	imshow("YUV", YUV);
	imshow("Lab", Lab);
	imshow("gray", gray);
	waitKey(100);
	return 0;
}

通道的分离和合并

图片的不同分量存放在不同通道里,通道的分离处理,在合并重新生成图像。

void cv::split	(	const Mat & 	src,
					Mat * 	mvbegin   // 分离的通道,为数组的形式,需要知道通道数
)	
void cv::split	(	InputArray 	m,
					OutputArrayOfArrays 	mv // 分离的单通道,向量vector格式,不用知道通道数
)	
void cv::merge	(	const Mat * 	mv, // 数组,尺寸,类型相同
					size_t 	count,   // 输入图像数组的长度,大于0
					OutputArray 	dst 
)	
void cv::merge	(	InputArrayOfArrays 	mv,  // 与split对应
OutputArray 	dst 
)	


#include <iostream>                       
#include <opencv2/opencv.hpp>
#include <string>
#include <vector>
using namespace std;
using namespace cv;
 
int main(int argc, char *argv[])
{
   
   
	system("color E");
	Mat img = imread("D:\\壁纸\\2k.jpg");
	Mat HSV;
	cvtColor(img, HSV, COLOR_RGB2HSV);
	Mat imgs0, imgs1, imgs2;    // 存放数组类型的结果
	Mat imgv0, imgv1, imgv2;    // 存放vector类型的结果
	Mat result0, result1, result2; // 合并结果

	Mat imgs[3];
	split(img, imgs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值