Bạn chụp ảnh/scan tài liệu và có thể độ sáng sẽ không đủ, khi đó bạn có thể chỉnh sửa bằng Photoshop. Bài viết này hướng dẫn cách chỉnh sáng tự động cho văn bản scan bằng OpenCV Python.
Lý thuyết
Đối với ảnh khi scan xong thì thường sẽ tối 1 chút nếu chụp bằng điện thoại. Histogram của ảnh có dạng như hình
Sau đó kéo thanh trượt về đúng vị trí max-value như hình dưới để ảnh đúng sáng
Việc này khá đơn giản, đoạn code bên dưới sẽ giúp bạn làm tự động công việc này. Bên dưới là kết quả được thực hiện tự động bởi thuật toán
Source code
Save đoạn code bên dưới thành file auto_brighness.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
import cv2 import numpy as np from matplotlib import pyplot as plt # Automatic brightness and contrast optimization with optional histogram clipping def automatic_brightness_and_contrast(image, clip_hist_percent=1): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Calculate grayscale histogram hist = cv2.calcHist([gray],[0],None,[256],[0,256]) hist_size = len(hist) # Calculate cumulative distribution from the histogram accumulator = [] accumulator.append(float(hist[0])) for index in range(1, hist_size): accumulator.append(accumulator[index -1] + float(hist[index])) # Locate points to clip maximum = accumulator[-1] clip_hist_percent *= (maximum/100.0) clip_hist_percent /= 2.0 # Locate left cut minimum_gray = 0 while accumulator[minimum_gray] < clip_hist_percent: minimum_gray += 1 # Locate right cut maximum_gray = hist_size -1 while accumulator[maximum_gray] >= (maximum - clip_hist_percent): maximum_gray -= 1 # Calculate alpha and beta values alpha = 255 / (maximum_gray - minimum_gray) beta = -minimum_gray * alpha ''' # Calculate new histogram with desired range and show histogram new_hist = cv2.calcHist([gray],[0],None,[256],[minimum_gray,maximum_gray]) plt.plot(hist) plt.plot(new_hist) plt.xlim([0,256]) plt.show() ''' auto_result = cv2.convertScaleAbs(image, alpha=alpha, beta=beta) return (auto_result, alpha, beta) image = cv2.imread('z4195065105621.jpg') auto_result, alpha, beta = automatic_brightness_and_contrast(image) print('alpha', alpha) print('beta', beta) cv2.imwrite("result.jpg", auto_result) |
Link Jupiter notebook: https://github.com/thigiacmaytinh/TGMTpython/tree/main/brightness