1、修改顏色模式
1.1、相關知識介紹
-
顏色模式:是將某種顏色表現為數字形式的模型,或者說是一種記錄圖像顏色的方式。分為:RGB模式、CMYK模式、HSB模式、Lab顏色模式、位圖模式、灰度模式、索引顏色模式、雙色調模式和多通道模式。
-
RGB模式:利用了紅、綠、藍三原色的原理展現色彩,對機器比較友好,是最傳統的方式,電視機等屏幕就是采用這種方式。
-
HSB模式:也叫做HSV,利用色相、飽和度、明度的原理展現色彩,對人類比較友好。
-
灰度模式: 用單一色調表現圖像,用0到255的不同灰度值來表示圖像, 0表示黑色, 255表示白色。
-
HSV(HSB)模式的范圍
8-bit圖片中
PS中的HSV范圍,H是0-360,S是0-1,V(B)是0-1
opencv中的HSV范圍,H是0-180,S是0-255,V是0-255
轉換方式
把PS中H的值除以2,S乘255,V乘255,可以得到對應的opencv的HSV值
1.2、提取圖片中的粉色
1.2.1、思路
a. 加載圖片c.png
b. 將圖片c.png從RGB模式改成HSV模式
c. 選取粉色區域
這里為什么要轉成HSV模式而不是直接使用RGB模式,有些疑惑,於是我按照RGB模式取了粉色區域,運行后發現並沒有選取出來。所以猜測,轉成HSV后區域是連貫的,可使用inRange選區。
1.2.2、代碼
import cv2
import numpy as np
img = cv2.imread('c.png')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_pink = np.array([160,20,20])
upper_pink = np.array([168,255,255])
mask = cv2.inRange(hsv, lower_pink, upper_pink)
res = cv2.bitwise_and(img, img, mask= mask)
cv2.imshow('frame',img)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2.3、運行結果
1.2.4、知識點
- imread
函數: cv2.imread(filename[, flags]) → retva
描述: 讀取一張圖片, 並返回圖片句柄
參數: filename[要加載的圖片路徑]
flags[加載圖片的data type, 具體參考備注1]
返回: retva[圖片句柄]
備注1: >0[三通道圖片]
=0[灰階圖片]
<0[帶透明通道的圖片]
備注2: 支持的圖片 *.bmp, *.dib, *.jpeg, *.jpg, *.jpe, *.jp2, *.png, *.pbm, *.pgm, *.ppm, *.sr, *.ras, *.tiff, *.tif
- cvrColor
函數: cv2.cvtColor(src, code[, dst[, dstCn]]) → dst
描述: 將圖片從一種顏色模式轉成另一種顏色模式
參數: src[要轉換的源圖片, 可以是uint8、uint16或float等]
dst[轉換后的目標圖片]
code[轉換標識符, 具體見備注1]
返回: dst[轉換后的目標圖片]
備注1:RGB與GRAY轉換的標識有[CV_BGR2GRAY, CV_RGB2GRAY, CV_GRAY2BGR, CV_GRAY2RGB]
RGB與CIE XYZ.Rec的轉換標識有[CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB]
RGB與YCrCb的轉換標識有[CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB]
RGB與HSV的轉換標識有[CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB]
RGB與CIE L*a*b*的轉換標識有[CV_BGR2Lab, CV_RGB2Lab, CV_Lab2BGR, CV_Lab2RGB]
RGB與CIE L*u*v* 的轉換標識有[CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB]
RGB與Bayer的轉換標識有[CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR, CV_BayerBG2RGB, CV_BayerGB2RGB, CV_BayerRG2RGB, CV_BayerGR2RGB]
轉換標識諸如cv2.COLOR_BGR2HSV這類,可以使用以下方式查看所有的標識
>>> import cv2
>>> flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
>>> print flags
- inRange
函數: cv2.inRange(src, lowerb, upperb[, dst]) → dst
描述: 檢查數組srv是否在lowerb數組和upperb數組之間, 將svr中符合條件的值置為255,不符合條件的值置為0
參數: src[要檢查的數組]
lowerb[檢查條件的下界]
upperb[檢查條件的上界]
返回: dst[經過篩選處理后的數組(0和255組成)]
- bitwise_and
函數: cv2.bitwise_and(src1, src2[, dst[, mask]]) → dst
描述: 將src1和src2以mask方式按位合並
參數: src1[要操作的源數組1]
src2[要操作的源數組2]
mask[標識, 標識了哪些位置要按位合並(255合並, 0置為0)]
返回: dst[處理后的數組]
- 如何通過RGB獲取HSV的顏色值
可以參考以下方法
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
>>> print hsv_green
[[[ 60 255 255]]]
附錄
在本篇文章中所有示例所處理的圖片為下圖0.1,圖片名字為a.png。
下圖0.2, 圖片名字為b.png
下圖0.3, 圖片名字為c.png
本文參考文章