圖像RGB空間轉(zhuǎn)換為HSV空間。H參數(shù)表示色彩信息,即所處的光譜顏色的位置。該參數(shù)用一角度量來表示,紅、綠、藍(lán)分別相隔120度。互補(bǔ)色分別相差180度。 純度S為一比例值,范圍從0到1,它表示成所選顏色的純度和該顏色最大的純度之間的比率。S=0時(shí),只有灰度。 V表示色彩的明亮程度,范圍從0到1。有一點(diǎn)要注意:它和光強(qiáng)度之間并沒有直接的聯(lián)系。
1: max=max(R,G,B) 2: min=min(R,G,B) 3: if R = max, H = (G-B)/(max-min) 4: if G = max, H = 2 + (B-R)/(max-min) 5: if B = max, H = 4 + (R-G)/(max-min) 6: 7: H = H * 60 8: if H < 0, H = H + 360 9: 10: V=max(R,G,B) 11: S=(max-min)/max代碼為:
//轉(zhuǎn)換為HSVvoid Rgb2Hsv(Mat &image, Mat &hsv){ float maxV = 0,minV = 0; float V = 0, S = 0, H = 0; float v = 0, s = 0, h = 0; float R = 0, G = 0, B = 0; float delta = 0, tmp = 0; for (int i = 0; i < image.rows; i++) { for (int j = 0; j < image.cols; j++) { R = image.at<Vec3b>(i, j)[0]; G = image.at<Vec3b>(i, j)[1]; B = image.at<Vec3b>(i, j)[2]; R = R / 255.0; B = B / 255.0; G = G / 255.0; tmp = min(R, G); minV = min(tmp, B); tmp = max(R, G); maxV = max(tmp, B); V = maxV; // v delta = maxV - minV; if (maxV != 0) S = delta / maxV; // s else { S = 0; } if (R == maxV) H = (G - B) / delta; else if (G == maxV) H = 2 + (B - R) / delta; else H = 4 + (R - G) / delta; H *= 60; if (H < 0) H += 360; h = H / 2; s = S * 255.0; v = V * 255.0; hsv.at<Vec3b>(i, j).val[0] = h; hsv.at<Vec3b>(i, j).val[1] = s; hsv.at<Vec3b>(i, j).val[2] = v; } }}
新聞熱點(diǎn)
疑難解答