最近在做运动检测,需要将RGB通道转换成YIQ通道; 在网上查了很多发现实现的都比较差,现给出RGB转YIQ以及YIQ转回RGB程序
根据变换矩阵,可以比较容易的写出函数—就是一个简单的矩阵相乘
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; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214953.html原文链接:https://javaforall.net
