เราจะใช้คำสั่ง cv2.add() และ cv2.multiply() ซึ่งคำสั่งทั้งสองจะ clamp หรือ saturate พิกเซล (ถ้าค่าต่ำกว่า 0 ให้เป็น 0 และ ถ้าค่าสูงกว่า 255 ให้เป็น 255) โดยอัตโนมัติครับ
โค้ดประมาณนี้ครับ
import cv2 #read image as gray img = cv2.imread("lena.jpg",cv2.CV_LOAD_IMAGE_GRAYSCALE) #increase brightness bri = cv2.add(img,100) #increase contrast con = cv2.multiply(img,1.5) cv2.imshow("Original",img) cv2.imshow("Brightness",bri) cv2.imshow("Contrast",con) cv2.waitKey() cv2.destroyAllWindows()
ในกรณีที่เป็นรูปสี ที่มีหลาย channel ผมลองโค้ดเดิมแล้วผลลัพธ์ไม่ถูกต้องครับ มันบวกหรือคูณแค่ channel เดียว เลยพยามเปลี่ยนโค้ดให้เป็นเมตริกซ์บวกหรือคูณกัน (ซึ่งอาจจะมีวิธีที่ดีกว่า) ดังนี้ครับ
import cv2 import numpy as np img = cv2.imread("lena.jpg") #brightness a = 100*np.ones_like(img) bri = cv2.add(img,a) #contrast b = np.zeros_like(img) con = cv2.scaleAdd(img,1.5,b) #1.5*img + 0 cv2.imshow("Original",img) cv2.imshow("Brightness",bri) cv2.imshow("Contrast",con) cv2.waitKey() cv2.destroyAllWindows()
ผลลัพธ์
อย่างไรก็ตาม เราสามารถใช้เทคนิคของ NumPy Array มาทำงานนี้ได้ ดังตัวอย่างต่อไปนี้ครับ ซึ่งใช้ได้กับทั้งรูปสีเทาและสีปกติ
import cv2 import numpy as np img = cv2.imread("lena.jpg") #increase brightness bri = img+100.0 #clip in range 0-255 bri = np.clip(bri,0,255) #convert to uint8 bri = np.uint8(bri) #increase contrast con = img*1.5 con = np.clip(con,0,255) con = np.uint8(con) cv2.imshow("Original",img) cv2.imshow("Brightness",bri) cv2.imshow("Contrast",con) cv2.waitKey() cv2.destroyAllWindows()
สังเกตว่า bri = img+100.0 ตัวเลขที่เอาไปบวกมีทศนิยมด้วย เพื่อเปลี่ยนให้ค่า Array จาก uint8 เป็น float เนื่องจาก ถ้าใช้แค่ bri = img+100 ค่าพิกเซลที่เกิน 255 จะถูกทอนค่าลง เช่น 256 ก็จะกลายเป็น 1 (256%255) ทำให้ได้ค่าที่ไม่ถูกต้องครับ
No comments:
Post a Comment