美文网首页
测试不同色彩转换矩阵的兼容性问题

测试不同色彩转换矩阵的兼容性问题

作者: 罗引杰 | 来源:发表于2021-07-21 13:08 被阅读0次

先说结论, 不同色彩空间的转换矩阵不能混用, 否则一定会出现负数或者超过1 的情况

测试代码:
constant.h

const float rgb2yuv_2020[] = {
    0.2627, 0.6780, 0.0593,
    -0.1396, -0.3604, 0.5000,
    0.5000, -0.4598, -0.0402
};

const float rgb2yuv_2020_invert[] = {
    1, 0, 1.4746,
    1, -0.1646, -0.5714,
    1, 1.8814, 0
};
//
//"BT601 625 D65"
//Input :
//    r = (0.64, 0.33)
//    g = (0.29, 0.60)
//    b = (0.15, 0.06)
//    w = (0.3127, 0.3290)
//
//    Output :
//    RGB2YUV Matrix :
//0.2220, 0.7067, 0.0713
//- 0.1195, -0.3805, 0.5000
//0.5000, -0.4542, -0.0458
//
//YUV2RGB Matrix :
//1, 0, 1.5560
//1, -0.1875, -0.4888
//1, 1.8573, 0
//
//"BT601 525 D65"
//Input :
//    r = (0.63, 0.34)
//    g = (0.31, 0.595)
//    b = (0.155, 0.070)
//    w = (0.3127, 0.3290)
//
//    Output :
//    RGB2YUV Matrix :
//0.2124, 0.7011, 0.0866
//- 0.1163, -0.3837, 0.5000
//0.5000, -0.4450, -0.0550
//
//YUV2RGB Matrix :
//1, 0, 1.5752
//1, -0.2256, -0.4772
//1, 1.8269, 0


const float rgb2yuv_709[] = {
    0.2126, 0.7152, 0.0722,
    -0.1146, -0.3854, 0.5000,
    0.5000, -0.4542, -0.0458
};

const float rgb2yuv_709_invert[] = {
    1, 0, 1.5747,
    1, -0.1873, -0.4682,
    1, 1.8556, 0
};

const float rgb2yuv_ntsc[] = {
0.2989, 0.5866, 0.1145,
-0.1688, -0.3312, 0.5000,
0.5000, -0.4184, -0.0816
};

const float rgb2yuv_ntsc_invert[] = {
    1, 0, 1.4022,
    1, -0.3456, -0.7145,
    1, 1.7710, 0
};

inline void mul32f_3x3(const float* matrix, float* in, float* out)
{
    out[0] = matrix[0] * in[0] + matrix[1] * in[1] + matrix[2] * in[2];
    out[1] = matrix[3] * in[0] + matrix[4] * in[1] + matrix[5] * in[2];
    out[2] = matrix[6] * in[0] + matrix[7] * in[1] + matrix[8] * in[2];
}

main.cpp

#include "constant.h"
#include <stdio.h>

int check_rgb_to_rgb( const float * rgb2yuv_coeffs, const float* yuv2rgb_coeffs, float* rgb)
{
    float rgbout[3];
    int res = 0;

    const float delta = 0.001f;

    mul32f_3x3(rgb2yuv_coeffs, rgb, rgbout);
    mul32f_3x3(yuv2rgb_coeffs, rgbout, rgb);


    if (rgb[0] < -delta || rgb[1] < -delta || rgb[2] < -delta) {

        res = -1;
    }
    if (rgb[0] > 1 + delta || rgb[1] > 1 + delta || rgb[2] > 1 + delta) {
        res = -2;
    }
    if(res!=0)
        printf("SRC :%.4f %.4f %.4f DST:%.4f %.4f %.4f \n",
            rgb[0], rgb[1], rgb[2], rgbout[0], rgbout[1], rgbout[2]);
    return res;
}

const float* rgb2yuv_coeffs[] = {
    rgb2yuv_709,
    rgb2yuv_2020,
    rgb2yuv_ntsc
};

const float* rgb2yuv_coeffs_invert[] = {
    rgb2yuv_709_invert,
    rgb2yuv_2020_invert,
    rgb2yuv_ntsc_invert
};

bool check(int rgb2yuv_id, int rgb2yuv_id_invert)
{
    for (int i = 0; i < 256; ++i) {
        for (int j = 0; j < 256; ++j) {
            for (int k = 0; k < 256; ++k) {
                float in[] = { i / 255.0f, j / 255.0f, k / 255.0f };

                int is_bad_coeffs = check_rgb_to_rgb(rgb2yuv_coeffs[rgb2yuv_id], rgb2yuv_coeffs_invert[rgb2yuv_id_invert], in);
                if (is_bad_coeffs) {
                    return false;
                }
            }
        }
    }
    return true;
}

int main()
{
    int errflag = 0;

    float nb_colorspace = sizeof(rgb2yuv_coeffs) / sizeof(rgb2yuv_coeffs[0]);

    for (int ci = 0; ci != nb_colorspace; ++ci) {
        for (int co = 0; co != nb_colorspace; ++co) {
            bool res = check(ci, co);
            printf("Check res:%d rgb2yuv:%d yuv2rgb:%d \n", res, ci, co);
        }
    }


}

相关文章

  • 测试不同色彩转换矩阵的兼容性问题

    先说结论, 不同色彩空间的转换矩阵不能混用, 否则一定会出现负数或者超过1 的情况 测试代码:constant.h...

  • 26 测试浏览器兼容性

    测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应...

  • 不同色彩转换

    〇 引子 图像有多种色彩模型,如灰度图、RGB、HSV、YCbCr等等。这些图片文件在计算机中以不同的格式存在,如...

  • css隐藏overflow:scroll出现的滚动条

    没有兼容性问题!没有兼容性问题!没有兼容性问题! 假设,list_container是需要内容滚动的,如果用css...

  • 浏览器兼容性测试

    浏览器兼容性问题又被称为网页或者网站兼容性问题,指不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情...

  • 面试题__8__未知宽高的img如何在容器里水平垂直居中

    方案1: 没有兼容性问题 方案2:有兼容性问题

  • 兼容测试

    兼容性测试 兼容性测试分为软件本身向前或向后兼容、不同版本兼容、数据共享兼容、浏览器兼容、操作系统兼容、分辨率兼容...

  • 如何进行兼容性测试?

    1、兼容性测试含义 兼容性测试是指要测试的软件在不同的硬件平台上、不同的应用软件之间、不同的操作系统中、不同的网络...

  • swiper3在火狐浏览器的兼容问题

    经过反复的测试,初步确认是swiper的兼容性问题,因为使用的是swiper3。

  • 微不足道之第十篇:关于Web测试

    关于web测试需求考虑,由于用户可能使用不同分辨率的屏幕,在前期我们还是要关注下页面的兼容性问题。同时,对于数...

网友评论

      本文标题:测试不同色彩转换矩阵的兼容性问题

      本文链接:https://www.haomeiwen.com/subject/upljmltx.html