圖像處理基礎:顏色空間及其OpenCV實現

2021-03-02 機器人視覺研究院

顏色是一種連續的現象,它意味著有無數種顏色。但是,人類的眼睛和感知能力是有限的。所以,為了識別這些顏色,我們需要一種媒介或這些顏色的表示,這種顏色的表示被稱為色彩空間。在技術術語中,一個顏色模型或顏色空間是一個特定的3-D坐標系統以及該系統中的一個子空間,其中每一種顏色都由一個單點表示。

有哪些顏色空間的類型?目前主要有五種類型的顏色模型。但是,我將只寫一些常見的(RGB、HSV和HSL)HSL(Hue Saturation Lightness)HSV(Hue Saturation Value)YUV(Luminance, blue–luminance, red–luminance)CMYK(Cyan, Magenta, Yellow, Key)RGB顏色空間:

RGB顏色空間是三維坐標系中紅、綠、藍坐標所表示的著名顏色空間之一。在更專業的術語中,RGB將顏色描述為由三個部分組成的元組。每個部分都可以取0到255之間的值,其中元組(0,0,0)表示黑色,元組(255,255,255)表示白色。元組的第0、第1和第2個部分分別表示紅、綠、藍的分量。


RGB顏色空間的Python實現:

這裡我們導入了必要的庫,cv2用於顏色空間轉換,NumPy用於數組操作,Matplotlib用於顯示圖像,os用於訪問圖像目錄,tqdm用於顯示加載欄。

hsl_img = cv2.cvtColor(X[0],cv2.COLOR_BGR2HLS)  #### CONVERTING BGR COLOR SPACE INTO HSL COLOR SPACE  ####
hsl_img_1 = hsl_img.copy()
hsl_img_2 = hsl_img.copy()
hsl_img_3 = hsl_img.copy()
hsl_img_1[:,:,1] = 0  #### HUE --> ZERO  ####
hsl_img_1[:,:,2] = 0
hsl_img_2[:,:,0] = 0  #### SATURATION --> ZERO ####
hsl_img_2[:,:,2] = 0
hsl_img_3[:,:,0] = 0  #### LIGHTNESS --> ZERO ####
hsl_img_3[:,:,1] = 0

設置兩個空列表Z和X,分別用於存儲帶有各自圖像的標籤,然後指定圖像大小和路徑目錄。在這之後,我定義了兩個函數,用於返回flower類型(assign_lable)和訪問每個圖像、讀取和調整其大小(make_train_data)。

Z,X=[],[]
IMG_SIZE=150
FLOWER_SUNFLOWER_DIR='../input/flowers-recognition/flowers/flowers/sunflower'

def assign_label(img,flower_type):
    return flower_type

def make_train_data(flower_type,DIR):
    for img in tqdm(os.listdir(DIR)):
        label=assign_label(img,flower_type)
        path = os.path.join(DIR,img)
        img = cv2.imread(path,cv2.IMREAD_COLOR)
        img = cv2.resize(img, (IMG_SIZE,IMG_SIZE))#Resizing the image

加載圖像,然後在OpenCV以BGR格式讀取圖像時將BGR顏色空間轉換為RGB顏色空間,但Maplotlib使用RGB格式來顯示圖像。這就是為什麼我們需要轉換顏色空間後,讀取圖像為RGB。

然後對固定圖像進行三份拷貝,並將每份拷貝的任何雙色通道設為零,分別用於訪問紅、綠、藍通道。如果你讓第0個顏色通道都是0那麼你只會得到藍色通道。

make_train_data('Sunflower',FLOWER_SUNFLOWER_DIR)  #####Loading Sunflower Data
fix_img = cv2.cvtColor(X[0],cv2.COLOR_BGR2RGB)    ###########CONVERTING BGR COLOR SPACE INTO RGB COLOR SPACE #########
new_img_1 = fix_img.copy() 
new_img_2 = fix_img.copy()
new_img_3 = fix_img.copy()
new_img_1[:,:,0] = 0 # making R channel zero    ####For BLUE channel#####
new_img_1[:,:,1] = 0 #making G channel zero
new_img_2[:,:,1] = 0####For RED color Channel####
new_img_2[:,:,2] = 0
new_img_3[:,:,0] = 0###For GREEN Channel####
new_img_3[:,:,2] = 0

顯示圖像:

f, axes = plt.subplots(1,3, figsize = (15,15))
list = [new_img_1,new_img_2,new_img_3]
i = 0
for ax in axes:
    ax.imshow(list[i])
    i+=1

HSL顏色空間:

HSL的一般含義是色調、飽和度和明度。你可以將HSL以圓柱體的形式可視化,如圖2(a)所示。圍繞圓柱體的是不同的顏色,比如綠色、黃色、紅色等等(我們真正想要的顏色)。飽和度是指顏色的多少,而明度是指顏色有多暗或多亮。正如你所看到的,圓柱體的頂部全是白色,底部全是黑色。


圖2:HSL顏色空間

HSL顏色空間的Python實現:

使用OpenCV函數**cvtColor()**將BGR顏色空間轉換為HSL顏色空間,在這裡我們需要傳遞圖像,以及從哪個顏色空間到哪個顏色空間我們想要改變圖像。然後再複製並使兩個顏色通道為零,以便分別顯示每個顏色通道。

hsl_img = cv2.cvtColor(X[0],cv2.COLOR_BGR2HLS)  #### CONVERTING BGR COLOR SPACE INTO HSL COLOR SPACE  ####
hsl_img_1 = hsl_img.copy()
hsl_img_2 = hsl_img.copy()
hsl_img_3 = hsl_img.copy()
hsl_img_1[:,:,1] = 0  #### HUE --> ZERO  ####
hsl_img_1[:,:,2] = 0
hsl_img_2[:,:,0] = 0  #### SATURATION --> ZERO ####
hsl_img_2[:,:,2] = 0
hsl_img_3[:,:,0] = 0  #### LIGHTNESS --> ZERO ####
hsl_img_3[:,:,1] = 0

現在顯示三個不同的顏色通道

f, axes = plt.subplots(1,3, figsize = (15,15))
list = [hsl_img_1,hsl_img_2,hsl_img_3]
i = 0
for ax in axes:
    ax.imshow(list[i])
    i+=1

HSV顏色空間:

HSV這個名字來自於顏色模型的三個坐標,即色相、飽和度和值。它也是一個圓柱形的顏色模型,圓柱體的半徑表示飽和度,垂直軸表示值,角度表示色調。對於觀察者,色調是佔主導地位的,飽和度是混合到色調中的白光的數量,value是chrome的強度,value較低顏色變得更加類似於黑色,value越高,顏色變得更加像顏色本身。通過改變這些參數,我們可以生成不同的顏色。

圖3:HSV顏色空間
HSV顏色空間的Python實現:

使用cvtColor()函數將色彩空間轉換為HSV色彩空間。然後再複製並使兩個通道置為零,以便分別顯示每個通道。

hsv_img = cv2.cvtColor(X[0],cv2.COLOR_BGR2HSV)
hsv_img_1 = hsv_img.copy()
hsv_img_2 = hsv_img.copy()
hsv_img_3 = hsv_img.copy()
hsv_img_1[:,:,1] = 0#HUE --> ZERO
hsv_img_1[:,:,2] = 0
hsv_img_2[:,:,0] = 0#SATURATION --> ZERO
hsv_img_2[:,:,2] = 0
hsv_img_3[:,:,0] = 0#VALUE --> ZERO
hsv_img_3[:,:,1] = 0

單獨顯示每個顏色通道:

相關焦點

  • 基於opencv 的圖像處理入門教程
    前言雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • 【數字圖像處理系列五】圖像濾波之空間濾波:圖像平滑降噪和圖像銳化
    快速入門篇【數字圖像處理系列一】基本概念:亮度、對比度、飽和度、銳化、解析度【數字圖像處理系列二】圖像增強:線性、 分段線性、 對數、 反對數、 冪律(伽馬)變換、直方圖均衡【數字圖像處理系列三】圖像數據集增強方式總結和實現【數字圖像處理系列四】在圖像增強:線性、 分段線性、 對數、 反對數、 冪律(伽馬)變換、直方圖均衡【數字圖像處理系列三】一文中我們從圖像灰度變換的角度闡述了圖像增強的各種方式,本文我們將一起學習圖像處理中重點的方式:圖像濾波,圖像濾波分為空間域濾波和頻率域濾波,頻率域濾波我們將在下一節重點說明
  • 「python opencv視覺零基礎」十四、直方圖反向投影
    前文提醒:博主正在參加博客之星評比,成功入選Top200,現在暫居第九歡迎各位點擊了解更多幫我投票,非常感謝~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 基於OpenCV來實現對圖像中目標對象檢測識別 以土地為例
    OpenCV是一款非常強大的圖像處理工具,對於從事圖像處理領域相關工作的人來說這個可以說是必不可少的一項工具,用起來也很方面,下嗎是一段簡單的介紹: OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺和機器學習軟體庫,可以運行在Linux、Windows、Android和Mac OS作業系統上。
  • opencv-python獲取圖像:面向對象與面向過程
    這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)下面讀取一張圖片並顯示
  • 「python opencv視覺零基礎」十、圖片效果毛玻璃
    一、學習目標了解高斯模糊的使用方法了解毛玻璃的圖片效果添加了解如何自己做一個噪聲圖片目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 使用Python OpenCV處理圖像之使用OpenCV獲取並修改圖像的像素值
    使用Python OpenCV處理圖像之圖像文件的打開、顯示和保存操作,我們還使用OpenCV更改了微信頭像在此基礎上了解了OpenCV處理滑鼠鍵盤響應事件的基本方式使用Python OpenCV處理圖像之詳解使用OpenCV處理鍵盤滑鼠事件。
  • 圖像增強、銳化,利用 Python-OpenCV 來實現 4 種方法!
    圖像增強目的使得模糊圖片變得更加清晰、圖片模糊的原因是因為像素灰度差值變化不大,圖片各區域產生視覺效果似乎都是一樣的, 沒有較為突出的地方,看起來不清晰的感覺解決這個問題的最直接簡單辦法,放大像素灰度值差值、使圖像中的細節更加清晰。目前較為常用的幾個方法:伽馬變換、線性變換、分段線性變換、直方圖均衡化,對於圖像對比度增強,都能取得不錯的效果!
  • 乾貨|OpenCV看這篇就夠了,9段代碼詳解圖像變換基本操作
    它提供了上百種計算機視覺、機器學習、圖像處理等相關算法,新版本的OpenCV支持Tensorflow、Caffe等深度學習框架。OpenCV的底層優化處理得很好,能夠支持多核處理,能夠利用硬體實現加速。由於該庫是以BSD許可證進行開源的,因此可以被免費應用在科學研究與商業應用中。
  • 「python opencv視覺零到實戰」八、圖片選區操作
    一、學習目標了解什麼是ROI了解floodFill的使用方法如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 使用Python+OpenCV進行圖像處理(二)
    整個視覺入門系列內容如下:理解顏色模型與在圖像上繪製圖形(圖像處理基本操作)。基本的圖像處理與濾波技術。從特徵檢測到人臉檢測。圖像分割與分水嶺(Watershed)算法(TBU)在邊緣和輪廓檢測中,噪聲對檢測的精度有很大的影響。
  • 使用Python OpenCV處理圖像之詳解直線、圓、矩形及文字的繪製
    我們知道,OpenCV作為一款強大的圖像處理庫,它能對圖像進行一些類似PS上面的處理,如果你足夠精通它,你可能會發掘比PS處理圖像更加豐富的功能……但是,作為Python新手,你不可能跳過一些基礎內容的學習過程。
  • 20行Python代碼實現視頻字符化
    看起來是非常高端,但是實際實現起來確實非常簡單,我們只需要接觸opencv模塊,就能很快的實現視頻字符化。然後調用imshow方法顯示圖像,調用後會出現一個窗口,因為這個窗口只會出現一瞬間,所以我們調用waitKey等待輸入,傳入0表示無限等待。因為opencv是使用c++編寫的,所以我們需要銷毀內存。
  • OpenCV圖像處理--邊緣檢測
    因此,邊緣檢測是對圖像亮度不連續性的一種度量。Sobel邊緣檢測Sobel邊緣檢測器也稱為Sobel–Feldman運算符或Sobel過濾器,它的工作原理是通過計算圖像中每個像素的圖像強度梯度。它找到了從亮到暗的最大亮度增加方向以及該方向的變化率。使用該過濾器時,可以分別在X和Y方向上或一起處理圖像。
  • OpenCV(四)邊緣檢測
    在二維乃至更高維空間中,需要考慮透視投影的影響。在我們需要檢測表面紋理和表面形狀時,我們往往需要更細緻的檢測,比如基於二階導數的Canny,但是很多時候簡單的基於一階導數的算子想過可能更好。不同的算子由於其具體算法不同,實際效果也存在比較大的差距。具體情況還需要具體處理。
  • 基於OpenCv 和 Python 的手指識別及追蹤
    使用閾值處理和濾波技術來進行背景消除以獲得最佳結果。我在手指識別時遇到的挑戰之一是將手與背景區分開並識別手指的尖端。我將向您展示我用於手指跟蹤的技術,我在此項目中使用了該技術。如果想要查看手指識別和跟蹤的實際操作,請觀看我上傳的視頻。
  • OpenCV+深度學習預訓練模型,簡單搞定圖像識別 | 教程
    這篇文章就展示了如何用ImageNet上預訓練的深度學習模型來識別圖像。OpenCV 3.3中的深度學習自OpenCV 3.1版以來,dnn模塊一直是opencv_contrib庫的一部分,在3.3版中,它被提到了主倉庫中。用OpenCV 3.3,可以很好地利用深度學習預訓練模型,將它們作為分類器。
  • OpenCV中的快速直線檢測
    本文範例運行環境FastLineDetectors運行必要條件FastLineDetectors屬於opencv-contrib中的模塊,需要安裝opencv-contrib-python。在python的opencv相關的安裝包中,opencv-python 包含主要模塊,opencv-contrib-python 包含主要模塊以及一些擴展模塊。但這兩個模塊並不兼容,如果已經安裝過opencv-python,需要先卸載,再安裝opencv-contrib-python。