Hàm trong xử lý ảnh

Môi trường "hành sự"

  • Linux (bài viết sử dụng Ubuntu 16.04)
  • OpenCV (bài viết sử dụng OpenCV 3.4.1)
  • Python (bài viết sử dụng Python 3.5.5)
  • Ảnh mẫu để xử lý: girl_10.jpg

Bạn có thể download ảnh mẫu về:

girl_10.jpg (Nguồn: Lụm trên mạng)

Hàm trong xử lý ảnh

Gradient của ảnh là gì?

Trước tiên ta phải dịch từ Gradient trong tiếng Anh là gì đã, gradient nghĩa là độ dốc. Trong xử lý ảnh, độ dốc (tức gradient) đang nói đến ở đây chính là độ dốc về mức sáng. Hay nói cách khác chính là sự thay đổi các giá trị pixel trong ảnh.

Vùng ảnh trơn (smooth) thì các pixel trong vùng ảnh đó có giá trị xấp xỉ / gần bằng nhau, vì vậy khi tính toán đạo hàm sẽ gần bằng zero. Đạo hàm bằng 0 thể hiện không có biến thiên về giá trị (mức sáng) (tham khảo bài viết Ý nghĩa Đạo Hàm). Điều này có nghĩa là độ dốc của các pixel trong vùng ảnh trơn gần bằng zero. Đạo hàm dương tại một pixel thể hiện rằng biến thiên mức sáng đang ở chiều hướng đi lên, ngược lại đạo hàm âm tại một pixel cho biết biên thiên mức sáng tại đó đang giảm dần. Nói tóm gọn lại gradient của ảnh chính là đạo hàm ảnh.

Bộ lọc Laplacian và Sobel

Hai bộ lọc phổ biến để tính gradient của ảnh là bộ lọc Laplacian và Sobel.

  • Công thức Laplacian kernel
  • Công thức Sobel kernel

OpenCV cũng đã hiện thực các hàm filter tính gradient cho Sobel và Laplacian, tài liệu:

  • cv2.Laplacian
  • cv2.Sobel

gradient.py

import cv2
import numpy as np

def scale_to_0_255(img):
    min_val = np.min(img)
    max_val = np.max(img)
    new_img = (img - min_val) / (max_val - min_val) # 0-1
    new_img *= 255
    return new_img
    
img = cv2.imread('girl_10.jpg',0)

laplacian = cv2.Laplacian(img, cv2.CV_64F)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobelxy = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3)

print('[Before Scale] laplacian image min-max:', np.min(laplacian), '-', np.max(laplacian))

cv2.imwrite('before_scale-laplacian.jpg', laplacian)
cv2.imwrite('before_scale-sobelx.jpg', sobelx)
cv2.imwrite('before_scale-sobely.jpg', sobely)
cv2.imwrite('before_scale-sobelxy.jpg', sobelxy)

laplacian = scale_to_0_255(laplacian)
sobelx =scale_to_0_255(sobelx)
sobely = scale_to_0_255(sobely)
sobelxy = scale_to_0_255(sobelxy)
print('[After Scale] laplacian image min-max:', np.min(laplacian), '-', np.max(laplacian))

cv2.imwrite('laplacian.jpg', laplacian)
cv2.imwrite('sobelx.jpg', sobelx)
cv2.imwrite('sobely.jpg', sobely)
cv2.imwrite('sobelxy.jpg', sobelxy)

Lưu rằng sau khi áp dụng toán tử convolution, miền giá trị của các pixel có thể vượt ngưỡng 0-255. Do đó, ta cần scale miền giá trị về 0-255 để có thể visualize dưới dạng ảnh. Một số bạn không chú ý có thể bỏ lỡ điều này.

Hàm trong xử lý ảnh

Với đoạn kết trên ta có thể visualize ảnh gradient sau khi áp dụng các bộ lọc. Kernel size cũng có ảnh hưởng đến kết quả ảnh sau khi convolve. Điều chỉnh kích thước của kernel size cần phù hợp với độ phân giải ảnh đầu vào.

Ảnh gradient có tác dụng là nổi rõ cạnh trong ảnh.


Cảm ơn bạn đã theo dõi bài viết. Hãy kết nối với tớ nhé!

  • Minh: https://www.facebook.com/minhng.info
  • Khám phá xử lý ảnh - GVGroup: https://www.facebook.com/groups/ip.gvgroup

Khám phá xử lý ảnh - GVGroup

Danh sách bài viết series OpenCV:

  • Hashtag #OpenCV
  • Tut 1: Xử lý ảnh - OpenCV đọc ghi hình ảnh (code Python và C++)
  • Tut 1.1: Xử lý ảnh - Cấu trúc dữ liệu ảnh trong OpenCV. Pixel là gì?
  • Tut 1.2: Xử lý ảnh - Chuyển đổi ảnh OpenCV sang Pillow và ngược lại
  • Tut 2: Xử lý ảnh - OpenCV resize, crop và padding hình ảnh (code Python và C++)
  • Tut 3: Xử lý ảnh - OpenCV biến đổi mức sáng hình ảnh (code Python)
  • Tut 4: Xử lý ảnh - OpenCV vùng quan tâm (ROI) là gì? (code Python)
  • Tut 4.1: Xử lý ảnh - OpenCV: vẽ văn bản, đường thẳng, mũi tên, hình chữ nhật, hình tròn, ellipse, đa giác
  • Tut 4.2: Xử lý ảnh - Pha trộn ảnh trong OpenCV (blending)
  • Tut 5: Xử lý ảnh - OpenCV ảnh nhị phân
  • Tut 6: Xử lý ảnh - OpenCV cân bằng sáng (histogram equalization)
  • Tut 7: Xử lý ảnh - OpenCV kỹ thuật cửa sổ trượt (sliding window)
  • Tut 8: Xử lý ảnh - Convolution là gì?
  • Tut 9: Xử lý ảnh - Làm mờ ảnh (blur)
  • Tut 10: Xử lý ảnh - Gradient của ảnh là gì?
  • Tut 11: Xử lý ảnh - Phát hiện cạnh Canny (Canny Edge Detection)
  • Tut 12: Xử lý ảnh - Phát hiện đường thẳng bằng Hough Transform (Hough Line)
  • Tut 13: Xử lý ảnh - Hiện thực phát hiện đoạn thẳng dùng Hough Transform (Hough Line)
  • Tut 14: Xử lý ảnh - Giải thuật phân vùng Region Growing trên ảnh màu
  • Tut 15: Xử lý ảnh - Giải thuật Background Subtraction trên ảnh màu
  • Tut 16: Xử lý ảnh - Frame Subtraction để phát hiện chuyển động trong video
  • Tut 17: Xử lý ảnh - HOG - Histograms of Oriented Gradients
  • Tut 18: Xử lý ảnh - HOG - Huấn luyện mô hình phân loại người
  • Tut 19: Xử lý ảnh - HOG - Phát hiện người
  • Tut 20: Xử lý ảnh - Tổng hợp kinh nghiệm xử lý ảnh (End)
  • Tut 21: Xử lý ảnh - Hiện thực trích đặc trưng Local Binary Patterns (LBP)
  • Tut 22: Xử lý ảnh - Trích đặc trưng Gabor filters