เราลองมาดูการทำ filtering ด้วย average filter เพื่อเบลอรูปกันครับ
import cv2 import numpy as np img = cv2.imread("lena.jpg") ksize = 5 #kernel size #create average kernel kernel = np.ones((ksize,ksize))/(ksize*ksize) ddepth = -1 #depth of output image, -1 is same as input image out = cv2.filter2D(img,-1,kernel) #same as: out = cv2.blur(img,(ksize,ksize)) cv2.imshow("Origin",img) cv2.imshow("Result",out) cv2.waitKey() cv2.destroyAllWindows()
ถ้าต้องการเขียนโค้ดเอง สมมติว่าเป็นรูปสีเทา และคำนวณเฉพาะพิกเซลที่ตำแหน่งของ kernel ยังอยู่ในรูป
import cv2 import numpy as np img = cv2.imread("lena.jpg", cv2.CV_LOAD_IMAGE_GRAYSCALE) ksize = 5 #kernel size, odd value #create average kernel kernel = np.ones((ksize,ksize))/(ksize*ksize) hksize = ksize%2 #half of kernel size row,column = img.shape[:2] out = img.copy() for r in range(row-ksize+1): for c in range(column-ksize+1): temp = kernel*img[r:r+ksize,c:c+ksize] pix = temp.sum() out[r+hksize,c+hksize] = np.uint8(pix) cv2.imshow("Origin",img) cv2.imshow("Result",out) cv2.waitKey() cv2.destroyAllWindows()
ต้องระวังบรรทัด out[r+hksize,c+hksize] = np.uint8(pix) ให้ดีครับ เพราะถ้าไม่ใช่ average filter ในบรรทัดนี้อาจจะต้องทำการ clip/normalize ค่าพิกเซลให้อยู่ในช่วง 0-255 ด้วย
ถ้าเป็นรูปสี BGR ก็ต้องเพิ่มอีก 1 loop สำหรับ channel
hksize = ksize%2 #half of kernel size row,column,channel = img.shape out = img.copy() for k in range(channel): for r in range(row-ksize+1): for c in range(column-ksize+1): temp = kernel*img[r:r+ksize,c:c+ksize,k] pix = temp.sum() out[r+hksize,c+hksize,k] = np.uint8(pix)
วิธีนี้จะใช้เวลาค่อนข้างมากครับ แต่ทำให้เราสามารถประยุกต์ใช้ kernel ตามที่เราต้องการได้
No comments:
Post a Comment