Xử lý ảnh - OpenCV biến đổi mức sáng hình ảnh (code Python)
OpenCV - tut 3
Môi trường làm việc với OpenCV
- 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ý (bài viết sử dụng ảnh img_3.jpg)
img_3.jpg
Bạn có thể download ảnh mẫu về.
Thiết kế hàm biến đổi mức sáng
Thông thường người ta cho điều chỉnh mức sáng các pixel trong ảnh theo công thức sau:
\(g(x,y) = a*f(x,y) + b\).
- a, b: hằng số do mình chọn.
- f(x,y): mức sáng của pixel trong ảnh tại điểm có tọa độ (x,y).
- g(x,y): mức sáng của pixel trong ảnh tại điểm có toạ độ (x,y) sau khi biến đổi.
Nói cách khác, \(f\) là ảnh ban đầu, còn \(g\) là ảnh sau biến đổi!
- Ảnh xám thì ta ám dụng công thức trên cho 1 kênh ảnh (vì ảnh xám chỉ có 1 kênh)
- Đối với ảnh màu ta cũng sẽ áp dụng tương tự trên đồng lọat 3 kênh Red, Green, Blue
Ví dụ minh họa: Cho ảnh F (ma trận) 3x3 có các mức sáng (giá trị) sau:
35 6 1
46 24 178
49 65 42
Áp dụng hàm biến đổi \(g(x,y) = 5*f(x,y) + 20\), ta được ảnh G như sau:
195 50 25
250 140 910
265 345 230
Vì mức sáng trong ảnh chỉ nằm trong đoạn [0, 255] vì vậy ảnh G sẽ là:
195 50 25
250 140 255
255 255 230
Ok, lý thuyết vậy đủ rồi. Thực hành với OpenCV thôi!
Chỉnh mức sáng bằng OpenCV code Python
opencv_brightness.py
import sys
import cv2
import numpy as np
def change_brightness(img, alpha, beta):
img_new = np.asarray(alpha*img + beta, dtype=int) # cast pixel values to int
img_new[img_new>255] = 255
img_new[img_new<0] = 0
return img_new
if __name__ == "__main__":
alpha = 1.0
beta = 35
if len(sys.argv) == 3:
alpha = float(sys.argv[1])
beta = int(sys.argv[2])
img = cv2.imread('img_3.jpg') # [height, width, channel]
# change image brightness g(x,y) = alpha*f(x,y) + beta
img_new = change_brightness(img, alpha, beta)
cv2.imwrite('img_3_new.jpg', img_new)
Ảnh kết quả:
- change_brightness(): biến đổi mức sáng và điều chỉnh giá trị mức sáng trong miền giá trị [0, 255].
- Đoạn script trên biến đổi mức sáng của tất cả pixel lên ảnh thêm 35 đơn vị (giá trị càng gần 255 thì càng gần màu trắng), làm ảnh mới trông sáng hơn ảnh gốc.
- Bạn có thể thử chạy lệnh sau để được ảnh trông tối hơn (a = 0.5, b = 10):
python opencv_brightness.py 0.5 10
Kết quả ảnh sau khi biến đổi tối đi:
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