2017-03-01 69 views
0

使用的OpenCV 2(3.1.0)和Python 2.7如果傳遞的圖像或視頻幀cv2.mean()你喜歡轉換cv2.mean()到其他顏色模型(LAB)

(57.679779052734375, 70.36699761284721, 102.41968960232204, 0.0) 
輸出的輸出
  1. 返回的值是否遵循BGR的OpenCV約定(不是 RGB),最後一個值是什麼意思?

  2. 如果我想轉換的值恢復成L 一個 B顏色模型 這樣做有什麼不重新計算平均值的最佳方式?

使用colormath模塊從RGB轉換時,轉換爲LAB和inputI我試圖XYZ到實驗室,但如果我使用手動在線的顏色轉換器輸入(RGB)並不像同色開始是不是我所期待的作爲源圖像的平均/幀

from colormath.color_objects import XYZColor, sRGBColor,LabColor 
    from colormath.color_conversions import convert_color 
    #RGB-Blue RGB-Green RGB-Red 
    #57.6797790527 70.3669976128 102.4196896023 

    #BGR 
    #107 127 133 


    rgb = sRGBColor(133, 127, 107) 
    xyz = convert_color(rgb, XYZColor, target_illuminant='d50') 
    lab = convert_color(xyz,LabColor) 
+0

它獨立計算每個通道的平均值。結果包含每個頻道的一個平均值,以相同的順序(否則沒有意義)。具體渠道代表的是什麼與該功能無關。 |如果結果有4個值,那麼您將它傳遞給4通道圖像 - 具有透明度的東西。您可以通過檢查輸入數組的「形狀」屬性來輕鬆驗證。 –

+0

我是我的情況,它是通過cv2.VideoCapture訪問的視頻的幀,並閱讀() – mobcdi

回答

2

所以OpenCV的都有自己的針對不同的色彩空間值的範圍,而這又取決於類型慣例您使用的圖像。例如,CV_64具有與CV_32和CV_16等不同的轉換等式。

有關示例:(從技術上講,如果你沒有對文檔的一些功課你會從here理解它)

如果[R,G,B] = [220,233,119]和你去this website並將其轉換

Lab值將是

[L,A,b] = [89.31,-20.33,53.44]

現在,在OpenCV中,對於類型CV_32FC3,所述實驗室轉換將是如下:

[R, G, B][220, 233, 119] = CV[L, a, b][2.55 * 89.31, 128 + (-20.33), 128 + 53.44]

注意 - 重要使用約定時檢查圖像的類型。

或者,如果你有動機,你爲什麼不創建與所有通道的圖像具有相同的值,使用Imgproc.cvtcolor它們轉換成任何你想要的色彩空間,然後拿出公式?我就是這麼做的。在改變圖像類型後,文檔解決了這個困惑。

希望它有幫助!

+0

感謝您加入。也許一些額外的背景將有所幫助。我對將幀X或Y轉換爲另一種顏色模型不感興趣。我正在採取個別幀的意思來建立一個數據集,以將視頻表示爲1圖像。我設置高度,但沿着寬度的每個像素代表一個框架,並用其平均值着色。我將使用k-means來聚類LAB顏色,以查看是否只使用顏色就能看到原始視頻的片段。我寧願不創建多個圖像,只是從RGB轉換到實驗室,其中歐幾里德距離可以用於羣集 – mobcdi

+0

如果我理解正確,你有一個視頻,你掃描它逐幀(RGB)計算其平均值並保存它作爲實驗室。然後用這些值,用k-means進行分類。我真的不明白問題所在,看起來很簡單。 –

+0

Yip容易說,但絆腳地做轉換,而不需要創建一個臨時圖像,只是爲了將其轉換爲實驗室 – mobcdi