openCV HSV RED


opencv HSV

色彩模型是什麼? 色彩模型 ( Color model ) 是一種以數字來表示色彩的數學模型,例如在 RGB 的色彩模型裡,以 (255,0,0) 表示紅色,但在 HSV 的色彩模型中,紅色則是以 (0,100,100) 來表示,用的色彩模型有:

RGB ( 紅、綠、藍 )

RGB 顏色模型也稱做三原色光模型,是一種「加色」模型,將紅 ( Red )、綠 ( Green )、藍 ( Blue ) 三原色的色光以不同的比例相加,混合產生各種色彩的光線,通常表現方式會使用 (255,255,255) 或十六進位 FFFFFF 來表現
# C1.py
import cv2
Lx=640; Ly=480; F=8; Lx2=int(Lx/F); Ly2=int(Ly/F)
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, Lx)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, Ly)
t=0
while(t < 501 and cap.isOpened()):
    ret, frame = cap.read()
    t+=1
    if ret == False: break
    cv2.imshow('frame',frame)
    #cv2.waitKey(0)
    if cv2.waitKey(1) & 0xFF == ord('q'): break
cap.release()
cv2.destroyAllWindows()

HSV ( 色相、飽和度、明度 )

HSV 是色相、飽和度、明度 ( Hue、Saturation、Value ),又稱 HSB ( Brightness )。 HSV 顏色模型都是一種將 RGB 色彩模型中的點,轉變在圓柱坐標系中的表示法。 HSV 模型把顏色描述在圓柱坐標系內的點,這個圓柱的中心軸取值為自底部的黑色到頂部的白色而在它們中間的是灰色,繞這個軸的角度對應於「色相」,到這個軸的距離對應於「飽和度」,而沿著這個軸的高度對應於「亮度」、「色調」或「明度」 ( 參考:HSL 和 HSV 色彩空間 )。

Reference:

#-------------------hsv_RED1.py
import numpy as np
import cv2
def ptext(img1,s,pos,sz):
    img2=cv2.putText(img=img1,text=s,org=pos,
      fontFace = cv2.FONT_HERSHEY_DUPLEX,
      fontScale=sz,color=(125,246,55),thickness=1)
    return img2
FW=open('red_A.txt','w')
img=np.zeros((200,600,3),dtype=np.uint8)
for j in range(5):
    fl='red_'+str(j)+'.png'
    B=50; G=10+20*j; R=200
    bgr=np.array([B,G,R], dtype=np.uint8)
    img[:,:]=bgr
    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    a=str(j)+' '+str(bgr)+' '+str(hsv[0,0,:])
    img2=ptext(img,a,(30,30),1.0)
    print(a); FW.write(a+'\n')
    cv2.imshow('img2',img2)
    cv2.imwrite(fl,img)
    cv2.waitKey(0)
FW.close()



#-------------------hsv_RED2.py
#使用cv2.inRange函數鎖定特定顏色的區間,獲得顏色的遮罩(面具mask),
#再使用cv2.bitwise_and函數呈現只有mask鎖定區域內(有特定顏色)的圖像
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)
ret,img=cap.read()
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)
lower_red = np.array([170, 50, 50])
upper_red = np.array([180, 255, 255])
mask2 = cv2.inRange(hsv, lower_red, upper_red)
mask = mask1 + mask2
red_only = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('Original Image', img)
cv2.imshow('Red Only', red_only)
cv2.waitKey(0)
cv2.destroyAllWindows()
cap.release()



From HSV to BGR

# ------------------------hsv1.py
import numpy as np
import cv2
def ptext(img1,s,pos,sz):
    img2=cv2.putText(img=img1,text=s,org=pos,
      fontFace = cv2.FONT_HERSHEY_DUPLEX,
      fontScale=sz,color=(0,0,0),thickness=1)
    return img2
hsv=np.zeros((40,600,3),dtype=np.uint8)
for j in range(19):
    HSV=[0+10*j,100,200]
    hsv[:,:]=np.array(HSV)
    BGR=cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
    a=str(j)+' '+str(HSV)+' '+str(BGR[0,0,:])
    img2=ptext(BGR,a,(30,30),1)
    print(a); 
    cv2.imshow('img2',img2)
    if(j==0): imgv=np.copy(img2)
    else: imgv=np.vstack((imgv,img2))
    cv2.imshow('imgv',imgv)
    cv2.waitKey(0)
cv2.imwrite('HSV_100_200.png',imgv)