Monday, February 25, 2013

การแยกแต่ละ channel ของรูป

ภาพที่อ่านจาก OpenCV ด้วยคำสั่่ง cv2.imread() จะมีลักษณะตามปกติเป็น
  • NumPy Array
  • มี 1,2,3,4 channels
  • มีค่าพิกเซลเป็น uint8
  • รูปสีจะเป็น BGR
ในการเข้าถึงแต่ละพิกเซล ถ้าเป็นรูปขาวดำ หรือสีเทา (channel=1) เราทำได้โดย
img[row,column]

ถ้าเป็นรูปสี BGR (channel = 3) เราจะใช้
img[row,column,channel]

ซึ่งแตกต่างกับ array 3 มิติเล็กน้อยที่จะใช้ img[channel,row,column]

ถ้าเราต้องการเฉพาะ channel ใดๆ ก็สามารถแยกออกมาได้ เช่น
blue = img[...,0]            #same as img[:,:,0]
ตัวแปร blue ก็จะอ้างถึง channel สีน้ำเงินในรูป
หากเราเปลี่ยนค่าตัวแปร blue รูปต้นฉบับจะเปลี่ยนตาม

หากไม่ต้องการให้รูปต้นฉบับเปลี่ยน ต้องทำสำเนาไป เช่น
blue = img[...,0].copy()

ลองดูตัวอย่างครับ

import cv2
import numpy as np

img = cv2.imread('lena.jpg')

blue = img[...,0].copy()
green = img[...,1].copy()
red = img[...,2].copy()

cv2.imshow("Blue",blue)
cv2.imshow("Red",red)
cv2.imshow("Green",green)
cv2.waitKey()
cv2.destroyAllWindows()

หากต้องการให้เห็นแต่ละสีในสีนั้นๆ

ก็ปรับโค้ดเล็กน้อยครับ
import cv2
import numpy as np

img = cv2.imread('lena.jpg')

blue = np.zeros_like(img)
blue[...,0] = img[...,0].copy()
green = np.zeros_like(img)
green[...,1] = img[...,1].copy()
red = np.zeros_like(img)
red[...,2] = img[...,2].copy()

cv2.imshow("Blue",blue)
cv2.imshow("Red",red)
cv2.imshow("Green",green)
cv2.waitKey()
cv2.destroyAllWindows()

หรือ
import cv2
import numpy as np

img = cv2.imread('lena.jpg')

blue = img.copy()
blue[...,1:3] = 0
green = img.copy()
green[...,0:3:2] = 0
red = img.copy()
red[...,0:2] = 0

cv2.imshow("Blue",blue)
cv2.imshow("Red",red)
cv2.imshow("Green",green)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV ก็มีคำสั่งสำเร็จรูปสำหรับการแยก channel คือ คำสั่ง split() ลองดูตัวอย่างการใช้งานครับ
import cv2
import numpy as np

img = cv2.imread("lena.jpg")
out = cv2.split(img)

cv2.imshow("Blue",out[0])
cv2.imshow("Green",out[1])
cv2.imshow("Red",out[2])
cv2.waitKey()
cv2.destroyAllWindows()

ก็จะได้ผลลัพธ์เหมือนตัวอย่างแรกครับ

No comments:

Post a Comment