首先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三種顏色的螢光粉發出不同亮度的光線,並通過相加混合產生各種顏色 掃瞄器也是通過吸收原稿經反射...