Xử lý ảnh - OpenCV biến đổi mức sáng hình ảnh (code Python)

  Oct 6, 2018      2m
   

OpenCV - tut 3

Xử lý ảnh - OpenCV biến đổi mức sáng hình ảnh (code Python)

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

Anh girl xinh 3 opencv

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:

.

  • 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, là ảnh ban đầu, còn 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 , 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
    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ả:

img_3_new2.jpg

  • 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:

img_3_new.jpg


Sẽ có series các bài tiếp theo về dùng thư viện OpenCV trong xử lý ảnh, các bạn nhớ like trang Facebook để đón xem thông báo bài viết mới nhé! : https://www.facebook.com/minhng.info

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