RGB和CIELAB顏色空間轉換及偏色檢測

2021-09-02 20:33:21 字數 1595 閱讀 6954

首先rgb是不可以直接轉為cielab顏色空間的,rgb需要先轉為ciexyz顏色空間,然後再由ciexyz顏色空間轉為cielab顏色空間。關於這2個顏色空間的互轉,主要參考了這篇文章。

rgb轉lab顏色空間的**如下:

void rgb2lab(mat &rgb, mat &lab) 

//xyz轉lab

int labtab[1024];

for (int i = 0; i < 1024; i++)

const int scalelc = (int)(16 * 2.55 * (1 << shift) + 0.5);

const int scalelt = (int)(116 * 2.55 + 0.5);

const int halfshiftvalue = 524288;

beginxyz = xyz.begin();

mat_::iterator endxyz = xyz.end();

lab.create(rgb.size(), rgb.type());

mat_::iterator beginlab = lab.begin();

for (; beginxyz != endxyz; beginxyz++, beginlab++)

}

這種方法是《基於影象分析的偏色檢測及顏色校正方法》——徐曉昭,蔡軼珩提出來的乙個理論,大概是說:影象的偏色不僅與影象色度的平均值有直接關係,還與影象的色度分布特性有關。如果在 a - b色度座標平面上的二維直方圖中色度分布基本上為單峰值,或者分布較為集中,而色度平均值又較大時,一般都存在偏色,而且色度平均值越大,偏色越嚴重。因此引入等效圓的概念,採用影象平均色度d和色度中心距m的比值,即偏色因子k來衡量影象的偏色程度。其計算方法如下式:

//true代表存在偏色,false代表不存在偏色

bool partialcolorjudge(mat &imglab)

int mn = imglab.rows * imglab.cols;

double da = suma / mn - 128; //歸一化到[-128,127]

double db = sumb / mn - 128; //同上

//求平均色度

double d = sqrt(da * da + db * db);

begin = imglab.begin();

double ma = 0, mb = 0;

//求色度中心距

for (; begin != end; begin++)

ma = ma / mn;

mb = mb / mn;

double m = sqrt(ma * ma + mb * mb);

float k = float(d / m);

if (k >= 1.5)

else

}

RGB顏色空間轉LAB

第一 lab顏色空間簡介 lab是由乙個亮度通道 channel 和兩個顏色通道組成的。在lab顏色空間中,每個顏色用l a b三個數字表示,各個分量的含義是這樣的 第二 為什麼使用lab顏色空間 因為它是一種裝置無關的顏色系統,也是一種基於生理特徵的顏色系統。它所描述的顏色空間就是人眼的視覺感應。...

RGB轉HSI顏色空間

顯示原圖 def rgb2hsi rgb img row np.shape rgb img 0 col np.shape rgb img 1 對原始影象進行複製 hsi img rgb img.copy 對影象進行通道拆分 b,g,r cv2.split rgb img 把通道歸一化到 0,1 b,...

RGB和HSV顏色空間

rgb顏色空間 rgb red,green,blue 顏色空間最常用的用途就是顯示器系統,彩色陰極射線管,彩色光柵圖形的顯示器都使用r g b數值來驅動r g b電子槍發射電子,並分別激發螢光屏上的r g b三種顏色的螢光粉發出不同亮度的光線,並通過相加混合產生各種顏色 掃瞄器也是通過吸收原稿經反射...