Hướng dẫn gaussian blur python

Chào mừng các bạn đả quay lại với tutorial lần này. Trong bài hướng dẫn lần này, tôi sẽ giới thiệu một số thao tác đơn giản mà chúng ta có thể thực hiện trên các hình ảnh như làm mờ làm mịn bức ảnh sau khi được lọc màu .

I. Giới thiệu.

Bây giờ chúng ta sẽ tìm hiểu cách để loại bỏ nhiễu từ các bộ lọc, như các ngưỡng đơn giản hoặc thậm chí là một bộ lọc màu cụ thể như trước đây:

Hướng dẫn gaussian blur python

II. Các thao tác về hình ảnh.

Như bạn có thể thấy, chúng ta có rất nhiều chấm đen, nơi chúng ta muốn màu đỏ, và rất nhiều chấm màu khác nằm rải rác. Chúng ta có thể sử dụng các kỹ thuật làm mờ và làm mịn khác nhau để cố gắng khắc phục điều này một chút.

Chúng ta có thể bắt đầu với một số mã quen thuộc:

1. Hướng dẫn.

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

    _, frame = cap.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
    lower_red = np.array([30,150,50])
    upper_red = np.array([255,255,180])
    
    mask = cv2.inRange(hsv, lower_red, upper_red)
    res = cv2.bitwise_and(frame,frame, mask= mask)

Bây giờ, hãy áp dụng một thao tác đơn giản, nơi chúng ta thực hiện một loại trung bình cho mỗi khối pixel. Trong trường hợp của chúng ta, hãy làm một hình vuông 15 x 15, có nghĩa là chúng ta có tổng cộng 225 pixel.

    kernel = np.ones((15,15),np.float32)/225
    smoothed = cv2.filter2D(res,-1,kernel)
    cv2.imshow('Original',frame)
    cv2.imshow('Averaging',smoothed)

    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()
cap.release()

Kết quả:

Hướng dẫn gaussian blur python

Điều này là đơn giản, nhưng kết quả lại mất đi rất nhiều chi tiết. Tiếp theo, hãy thử một số Gaussian Blurring:

blur = cv2.GaussianBlur(res,(15,15),0)
    cv2.imshow('Gaussian Blurring',blur)

Kết quả:

Hướng dẫn gaussian blur python

Ngoài ra còn một tùy chọn khác được gọi là Median Blur:

median = cv2.medianBlur(res,15)
    cv2.imshow('Median Blur',median)

Kết quả:

Hướng dẫn gaussian blur python

Cuối cùng, một tùy chọn khác là làm mờ song phương:

bilateral = cv2.bilateralFilter(res,15,75,75)
    cv2.imshow('bilateral Blur',bilateral)

Tất cả các blurs so sánh:

Hướng dẫn gaussian blur python

2. Kết quả.

Ít nhất trong trường hợp này, tôi có thể sử dụng với Median Blur, nhưng các ánh sáng khác nhau, các ngưỡng / bộ lọc khác nhau và các mục tiêu và mục tiêu khác nhau có thể lựa chọn và hướng bạn nên sử dụng một trong những cách làm khác nhau. Trong hướng dẫn tiếp theo, chúng ta sẽ thảo luận về các biến đổi hình thái học.

III. Tài liệu tham khảo.

http://docs.opencv.org/ https://techmaster.vn/ https://pythonprogramming.net/

Làm mịn ảnh (smoothing) là công việc quen thuộc trong xử lý ảnh. Nó giúp loại bỏ các dữ liệu không cần thiết như hạt nhiễu, làm mượt biên ảnh,…

Có nhiều phương thức khác nhau được OpenCV cung cấp sẵn. Bài này giới thiệu về nguyên lý hoạt động & mục đích ứng dụng ở mỗi trường hợp. Tùy theo từng bài toán khác nhau mà sử dụng phương thức khác nhau, thậm chí phải kết hợp nhiều loại.

Bài viết này dịch từ document của OpenCV kết hợp với kinh nghiệm cá nhân.

Khái niệm

Convolution: là các phép tính toán giữa ảnh và toán tử (kernel)
Kernel: là mảng 2 chiều (ma trận) có kích thước cố định do người dùng chỉ định
Anchor point: là điểm neo nằm bên trong kernel, thường là vị trí trung tâm kernel

Hình bên dưới là 1 kernel, với anchor point là điểm trung tâm

Hướng dẫn gaussian blur python

Các khái niệm này mình không dịch lại tiếng Việt vì không có từ tương đương, nếu có cũng không sát nghĩa với bài gốc.

Cách hoạt động

  1. Cho kernel lặp qua hết các pixel trên ảnh, với anchor đặt tại pixel cần tính
  2. Nhân giá trị của từng pixel với kernel, lấy kết quả gán lại cho pixel đó

Hướng dẫn gaussian blur python

Như vậy kết quả của ảnh sẽ phụ thuộc hoàn toàn vào giá trị của kernel. Và với các điểm ngoài biên như (0,0) thì kernel sẽ bị tràn ra ngoài, phần bị tràn sẽ không tính.

Sử dụng filter2D() để làm mịn ảnh

Hàm filter2D() sử dụng kernel do người dùng chỉ định. Ví dụ bên dưới tạo ra 1 kernel có kích thước 5×5, giá trị của mỗi phần tử là 0.1 (1/10).

importcv2

importnumpy asnp

frommatplotlib importpyplot asplt

img=cv2.imread('opencv_logo.png')

kernel =np.ones((5,5),np.float32)/10

print(kernel)

dst= cv2.filter2D(img,-1,kernel)

plt.subplot(121),plt.imshow(img),plt.title('Original')

plt.xticks([]), plt.yticks([])

plt.subplot(122),plt.imshow(dst),plt.title('Averaging')

plt.xticks([]), plt.yticks([])

plt.show()

Kết quả

Hướng dẫn gaussian blur python

Sử dụng hàm blur()

Hàm này sử dụng kernel với mỗi phần tử có giá trị là 1, còn kích thước kernel do người dùng chỉ định. Hàm blur() sẽ tính giá trị trung bình của các pixel nằm trong kernel.

importcv2

importnumpy asnp

frommatplotlib importpyplot asplt

img=cv2.imread('opencv_logo.png')

blur =cv2.blur(img,(5,5))

plt.subplot(121),plt.imshow(img),plt.title('Original')

plt.xticks([]),plt.yticks([])

plt.subplot(122),plt.imshow(blur),plt.title('blurred')

plt.xticks([]),plt.yticks([])

plt.show()

Hướng dẫn gaussian blur python

Gaussian blur

Để hiểu về công thức toán thì khá phức tạp, hiểu đơn giản là kernel này có giá trị lớn nhất bên trong và nhỏ dần khi ra ngoài biên. Giá trị giảm dần này gọi là độ lệch chuẩn, các bạn sinh viên có thể tìm trong giáo trình toán cao cấp 1,2,3 tùy theo từng trường đại học.

Kernel này phải là số dương và là số lẻ (3,5,7,…)

blur=cv2.GaussianBlur(img,(5,5),0)

Hướng dẫn gaussian blur python

Để giá trị default kết quả tương tự như Blur

Hướng dẫn gaussian blur python

Median blur

Median là giá trị của phần tử nằm giữa trong mảng đã sắp xếp. Ví dụ:
Cho mảng {10, 11, 13, 15, 16, 23, 26} thì 15 nằm giữa, do đó giá trị median của mảng là 15
Cho mảng {10, 11, 13, 15, 16, 23, 26, 52} thì 15 và 16 nằm giữa, do đó giá trị median của mảng là (15+16/2)=15.5

median=cv2.medianBlur(img,5)

Hàm medianBlur() lấy giá trị median của các pixel nằm dưới kernel rồi gán lại cho pixel đó. Hàm này dùng để lọc nhiễu rất tốt, bên dưới là ví dụ về đếm xe máy trên đường.

Hướng dẫn gaussian blur python

Bilateral Filtering

Đây là phương pháp làm mịn mà vẫn giữ lại được biên của ảnh. Phương pháp này phù hợp với làm mịn da mặt của chị em (anh em nào thích mịn thì làm :v ), không biết app Camera 360 có dùng không.

Nhược điểm của phương thức này là xử lý rất chậm.

Hướng dẫn gaussian blur python

blur=cv2.bilateralFilter(img,9,75,75)

Tham khảo: https://docs.opencv.org/3.1.0/d4/d13/tutorial_py_filtering.html