opencv将RGB转成YIQ

最近在做运动检测,需要将RGB通道转换成YIQ通道;
在网上查了很多发现实现的都比较差,现给出RGB转YIQ以及YIQ转回RGB程序

这是RGB转为YIQ的原理
在这里插入图片描述
Y代表的是亮度,I、Q是色彩,由于YIQ颜色空间具有能将图像中的亮度分量分离提取出来的优点,所以比较容易在复杂背景下进行运动目标检测

根据变换矩阵,可以比较容易的写出函数—就是一个简单的矩阵相乘

Matx33f rgb2yiq_mat(0.299f, 0.587f, 0.114f,
	0.596f, -0.274f, -0.322f,
	0.211f, -0.523f, 0.312f);

Matx33f yiq2rgb_mat(1.0f, 0.956f, 0.621f,
	1.0f, -0.272f, -0.647f,
	1.0f, -1.106f, 1.703f);
	
Mat rgb2yiq(const Mat& img) {

	Mat img_out(img.size(), img.type());
	img_out = img.clone();
	for (int j = 0; j < img.rows; j++) {
		for (int i = 0; i < img.cols * 3; i += 3) {

			Vec3f pixel(img_out.at<float>(j, i + 2), img_out.at<float>(j, i + 1), img_out.at<float>(j, i));
			pixel = rgb2yiq_mat * pixel;


			for (int k = 0; k < 3; k++) {
				img_out.at<float>(j, i + 2 - k) = pixel[k];
			}
		}
	}
	return img_out;
}

Mat yiq2rgb(const Mat& img) {

	Mat img_out(img.size(), img.type());
	img_out = img.clone();
	for (int j = 0; j < img.rows; j++) {
		for (int i = 0; i < img.cols * 3; i += 3) {

			Vec3f pixel(img_out.at<float>(j, i + 2), img_out.at<float>(j, i + 1), img_out.at<float>(j, i));
			pixel = yiq2rgb_mat * pixel;


			for (int k = 0; k < 3; k++) {
				if (pixel[k] > 255.0) pixel[k] = 255.0;
				else if (pixel[k] < 0.0) pixel[k] = 0.0;

				img_out.at<float>(j, i + 2 - k) = pixel[k];
			}
		}
	}
	return img_out;
}

rgb2yiq的输入与输出不受限制
给出我的rgb2yiq与matlab的rgb2ntsc的结果图—输入全部为三通道归一化的RGB图
在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值