RGB與YIQ的轉換

熊仙森發表於2019-01-15


每種顏色相當於一個三維向量,不同的表示法則相當於同一個向量在不同的座標軸下(即不同的基下)的表示。

YIQ簡單介紹

YIQ,是NTSC(National Television Standards Committee)電視系統標準。Y是提供黑白電視及彩色電視的亮度訊號(Luminance),即亮度(Brightness),I代表In-phase,色彩從橙色到青色,Q代表Quadrature-phase,色彩從紫色到黃綠色。

優點

較其他顏色空間,YIQ顏色空間具有能將影象中的亮度分量分離提取出來的優點,並且YIQ顏色空間與RGB顏色空間之間是線性變換的關係,計算量小,聚類特性也比較好,可以適應光照強度不斷變化的場合,因此能夠有效地用於彩色影象處理。可用於在自然條件下采集到的複雜背景下的運動目標的識別


RGB簡單介紹

RGB色彩模式是工業界的一種顏色標準,是通過對紅®、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色,這個標準幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統之一。

在電腦中,RGB的所謂“多少”就是指亮度,並使用整數來表示。通常情況下,RGB各有256級亮度,用數字表示為從0、1、2…直到255。注意雖然數字最高是255,但0也是數值之一,因此共256級。

按照計算,256級的RGB色彩總共能組合出約1678萬種色彩,即256×256×256=16777216。通常也被簡稱為1600萬色或千萬色。也稱為24位色(2的24次方)。

RGB 轉 YIQ

轉換是我們實驗室專案的一個需求,基於論文,利用YIQ對對影象處理上的優勢,Android中JNI連得C++的庫,連得OpenCV,做的操作和轉換。

//程式碼摘自我們的專案,師兄的程式碼,但是這個轉換公式網上應該不少,原理可自查
Mat XXX::Rgb2Ntsc(Mat&frame)
{
    //輸入rgb的mat型圖
    Mat dst = frame.clone();
    frame.convertTo(frame, CV_32FC3);
    dst.convertTo(dst, CV_32FC3);
    //逐行逐列逐畫素點的轉換
    for (int i = 0; i < frame.rows; i++)
    {
        for (int j = 0; j < frame.cols; j++) {
            dst.at<Vec3f>(i, j)[2] = saturate_cast<float>(((0.299*frame.at<Vec3f>(i, j)[2] +
                                                            0.587*frame.at<Vec3f>(i, j)[1] +
                                                            0.114*frame.at<Vec3f>(i, j)[0])) / 255);
            dst.at<Vec3f>(i, j)[1] = saturate_cast<float>(((0.596*frame.at<Vec3f>(i, j)[2] +
                                                            -0.274*frame.at<Vec3f>(i, j)[1] +
                                                            -0.322*frame.at<Vec3f>(i, j)[0])) / 255);
            dst.at<Vec3f>(i, j)[0] = saturate_cast<float>(((0.211*frame.at<Vec3f>(i, j)[2] +
                                                            -0.523*frame.at<Vec3f>(i, j)[1] +
                                                            0.312*frame.at<Vec3f>(i, j)[0])) / 255) * 200;
        }
    }
    return dst;//返回YIQ形式的mat
}

相關文章