Xử lý ảnh với OpenCV - Tut5: Histogram Equalization
Mục tiêu bài viết
Bài viết cung cấp cho người đọc kiến thức cơ bản về kĩ thuật Histogram Equalization (cân bằng Histogram) trong xử lý ảnh
1. Histogram equalization
1.1 Image Histogram
Nếu chưa biết hay chưa hiểu rõ về Histogram, bạn có thể tham khảo tại [3].
Trước khi tìm kĩ thuật Histogram equalization, trước hết, bạn cần phải hiểu khái niệm histogram của ảnh.
Histogram của ảnh, định nghĩa một cách đơn giản, là một cách biểu diễn (bằng hình ảnh) (graphical representation) về phân bố cường độ sáng của ảnh. Trong Histogram của ảnh, trục ngang biểu thị giải giá trị của cường độ sáng (thường là số nguyên từ 0 đến 255) và trục dọc biểu thị cho số pixel có giá trị cường độ sáng ứng với trục ngang. [2]
Ví dụ như hình dưới đây, bạn có thể thấy hình ảnh có 4 pixels có giá trị 0, và tương ứng với nó, histogram có một cột có độ cao là 4 tại intensỉy (cường độ sáng) có giá trị là 0. Tương trị với intensity 50 có 2 pixels, 125 có 1 pixels và 255 có 2 pixels. Các giá trị intensity khác không xuất hiện trên ảnh, đồng nghĩa với không có pixels nào có intensity như vậy; do đó, trên histogram, tại các giá trị intesity đó sẽ không có cột giá trị nào.
1.2 Histogram equalization là gì
Định nghĩa
Histogram equalization là một kĩ thuật để tăng độ tương phản (constrast) cho ảnh bằng cách dãn cường độ của ảnh [2], hay nói cách khác, hiệu chỉnh lại histogram của ảnh [1].
Constrast
Nhìn vào định nghĩa trên, sẽ có bạn thắc mắc độ tương phản (constrast) của ảnh là gì vậy.
Ở hình này, 3 hình đầu tiên là ví dụ của các hình ảnh có độ tương phản thấp và hình cuối cùng là ví dụ về hình ảnh có độ tương phản cao. Bằng mắt thường, ta có thể nhận ra hình cuối cùng là hình đẹp nhất, rõ ràng nhất. Nhìn vào histogram tương ứng của mỗi hình, ta có thể thấy (Hình 1,2,3,4 tương ứng với 4 hình con trong hình trên theo thứ tự từ trên xuống dưới):
- Hình 1: cường độ sáng chỉ tập trung ở vùng tối (0 -> 100)
- Hình 2: cường độ sáng chỉ tập trung ở vùng sáng (12 -> 255)
- Hình 3: cường độ sáng chỉ tập trung ở khoảng giữa (80 -> 150)
- Hình 4: cường độ sáng phân bố dàn trải từ 0 -> 255
Nói một cách dễ hiểu, một hình ảnh có độ tương phản cao là một hình mà
- bằng mắt thường: các vùng sáng tối trên ảnh chênh lệch rõ rệt
- bằng histogram: phân bố cường độ sáng trải đều từ 0 -> 255 như hình 4
Tại sao cần Histogram equalization
Ở ví dụ trên, với mắt thường của con người, có thể thấy hình ảnh có độ tương phản cao có chất lượng tốt hơn so với các hình ảnh có độ tương phản thấp. Điều này không chỉ đúng với con người, mà đối với các thuật toán xử lý ảnh, một hình ảnh có độ tương phản cao sẽ giúp các thuật toán xử lý tốt hơn. Ví dụ, với thuật toán xác định đường viền ảnh, hình ảnh có độ tương phản cao hơn, đồng nghĩa với vùng tối và sáng của ảnh có chênh lệch độ sáng cao hơn, khi áp dụng thuật toán xác định viền (chi tiết xem tại đây), kết quả hiệu giữa hai pixel tại vị trí viền cao hơn, giúp thuật toán trở nên tốt hơn.
Chú ý: Histogram equalization chỉ giúp hình ảnh phân tách rõ ràng hơn, nhưng không đảm bảo hình ảnh không bị mất dữ liệu so với hình gốc.
Làm thế nào để thực hiện histogram equalization
Trong bài viết này, do thời gian viết có hạn, nên mình sẽ không đề cập đến chi tiết một thuật toán nào cả. Dưới đây, mình sẽ chỉ trình bày tư duy cơ bản để thực hiện histogram equalization. Từ đấy, khi các bạn tìm hiểu chi tiết một thuật toán có thể nhanh chóng hiểu rõ nó hơn.
Nhìn lại định nghĩa ở trên, Histogram Equalization
- Dùng để tăng độ tương phản của ảnh
- Bằng cách thay đổi phân bố histogram của ảnh
Để thay đổi histogram, cách duy nhất chính là thay đổi intensity của các điểm ảnh. Nói một cách đơn giản, ta đi tạo một bảng màu mới (mapping giữa intensity của ảnh cũ và ảnh mới) sao cho khoảng màu mới rộng hơn khoảng màu cũ.
Chú ý: Các điểm ảnh có cùng intensity trên ảnh cũ -> trên ảnh mới cũng có cùng intensity
Từ equalization mang nghĩa sự chia đều, làm cho bằng nhau. Vậy histogram equalization có nghĩa là làm cho histogram đồng đều, bằng nhau. Cụ thể hơn, chính là làm cho histogram cho hình dáng về gần một đường ngang nhất có thể (làm số pixels của mỗi một intensity gần bằng nhau). Ví dụ, với ảnh 8 bit (0->255) có độ phân giải 20x20, 400 pixels đó của ảnh chỉ tập trung trong khoảng từ 120->150, histogram equalization sẽ tìm cách phân đều 400 pixels đó sao cho cường độ sáng nhỏ nhất là 0 và lớn nhất là 255
Một trong những thuật toán đơn giản nhất là sử dụng dựa trên cdf(cummulative distribution function) của histogram ảnh để tính ra bảng mapping cường độ sáng. Bạn có thể tham khảo ví dụ tại slide này
2. Implement
Với OpenCV trong python, bạn có thể thực hiện Histogram equalization chỉ bằng một câu lệnh cv2.equalizeHist
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('test.jpg', 0)
img_equal_hist = cv2.equalizeHist(img)
f, axes = plt.subplots(2,2, figsize=(30,20))
axes[0, 0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
axes[0, 0].set_title('origin')
axes[0, 1].imshow(cv2.cvtColor(img_equal_hist, cv2.COLOR_BGR2RGB))
axes[0, 1].set_title('hist equal')
axes[1, 0].hist(img.flatten(), 256, [0,256])
axes[1, 1].hist(img_equal_hist.flatten(), 256, [0,256])
plt.show()
plt.close()
Tổng kết
Bài viết vừa trình bày kiến thức cơ bản về Histogram Equalization. Hi vọng qua bài viết này các bạn đã hiểu rõ hơn về Histogram cũng như phương pháp Histogram Equalization. Hẹn gặp lại các bạn ở bài viết kế tiếp.
HMD.
References
[1] https://en.wikipedia.org/wiki/Histogram_equalization
[2] https://docs.opencv.org/2.4.13.7/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.html
[3] https://blog.vietnamlab.vn/2019/01/04/data-analysis-101-histogram/