将RGB转换为Luv

时间:2019-06-02 09:31:46

标签: c++ opencv image-processing

我正在尝试将rgb图像转换为L u v,我遇到了一些问题。 L分量很好,但是当我显示u和v分量都为黑色(所有像素的值为0)时。

        for (int i = 0; i<height; i++)
            for (int j = 0; j<width; j++)
            {
                Vec3b v3 = src.at<Vec3b>(i, j);
                float b = ((float)v3[0]) / 255;
                float g = ((float)v3[1]) / 255;
                float r = ((float)v3[2]) / 255;

                float x = r * 0.412453 + g * 0.357580 + b * 0.180423;
                float y = r * 0.212671 + g * 0.715160 + b * 0.072169;
                float z = r * 0.019334 + g * 0.119193 + b * 0.950227;

                //L
                if (y > 0.008856) {
                    l_mat.at<uchar>(i, j) = 255 / 100 * (116 * pow(y, 1.0 / 3.0));
                    dst.at<Vec3b>(i, j)[0] = 255 / 100 * (116 * pow(y, 1.0 / 3.0));
                //  printf("%d / " , l_mat.at<uchar>(i, j));
                }
                else { 
                    l_mat.at<uchar>(i, j) = 255 / 100 * (903.3 * y); 
                    dst.at<Vec3b>(i, j)[0] = 255 / 100 * (903.3 * y);
                }

                float u = 4 * x / (x + 15 * y + 3 * z);
                float v = 9 * y / (x + 15 * y + 3 * z);
                //printf("u: %.2f , v:%.2f || ", u, v);

                //U
                u_mat.at<uchar>(i, j) = 255 / 354 * (13 * l_mat.at<uchar>(i, j)*(u - 0.19793943) + 134);
                //printf("%d / ", u_mat.at<uchar>(i, j));
                dst.at<Vec3b>(i, j) = 255 / 354 * (13 * l_mat.at<uchar>(i, j)*(u - 0.19793943) + 134);

                //v
                v_mat.at<uchar>(i, j) = 255 / 262 * (13 * l_mat.at<uchar>(i, j)*(v - 0.46831096)+140);
                dst.at<Vec3b>(i, j) = 255 / 262 * (13 * l_mat.at<uchar>(i, j)*(v - 0.46831096) + 140);
            }

我必须逐像素进行转换,我不能使用cvtcolor。

0 个答案:

没有答案