影象增強的方法
阿新 • • 發佈:2018-11-16
最近在做基於影象的文字和公式識別專案,在想是不是去噪及灰度化之後用NN效果會更好。下面是常用的增強方法,先羅列一下。
reference https://blog.csdn.net/m0_38007695/article/details/82718107
#!/usr/bin/python import cv2 as cv import numpy as np import matplotlib.pyplot as plt import math # draw histogram def calc_gray_hist(img): h, w = img.shape[:2] gray_hist = np.zeros([256], np.uint64) for i in range(h): for j in range(w): gray_hist[img[i][j]] += 1 x = np.arange(256) plt.plot(x, gray_hist, 'r', linewidth=2, c='black') plt.xlabel("gray Label") plt.ylabel("number of pixels") plt.show() cv.imshow('img', img) cv.waitKey() return gray_hist # linear conversion def linear_conv(img): out = 2.0 * img out[out > 255] = 255 out = np.around(out) out = out.astype(np.uint8) cv.imshow('img', img) cv.imshow('out', out) cv.waitKey() return out # blcok conversion def block_conv(img): h, w = img.shape[:2] out = np.zeros(img.shape, np.uint8) for i in range(h): for j in range(w): pix = img[i][j] if pix < 50: out[i][j] = 0.5 * pix elif pix < 150: out[i][j] = 3.6 * pix - 310 else: out[i][j] = 0.238 * pix + 194 out = np.around(out) out = out.astype(np.uint8) cv.imshow('img', img) cv.imshow('out', out) cv.waitKey() return out # histogram normalization conversion def hist_conv(img): in_min, in_max = cv.minMaxLoc(img)[:2] out_min, out_max = 0, 255 a = float(out_max - out_min) / (in_max - in_min) b = out_min - a * in_min out = a * img + b out = out.astype(np.uint8) cv.imshow('img', img) cv.imshow('out', out) cv.waitKey() return out # histogram normalization conversion def norm_conv(img): out = np.zeros(img.shape, np.uint8) cv.normalize(img, out, 255, 0, cv.NORM_MINMAX, cv.CV_8U) cv.imshow('img', img) cv.imshow('out', out) cv.waitKey() return out # gamma conversion def gamma_conv(img): img_norm = img / 255.0 gamma = 0.4 out = np.power(img_norm, gamma) cv.imshow('img', img) cv.imshow('out', out) cv.waitKey() return out # global equalization histogram conversion def global_equal_hist_conv(img): h, w = img.shape gray_hist = calc_gray_hist(img) zero_cumu_moment = np.zeros([256], np.uint32) for p in range(256): if p == 0: zero_cumu_moment[p] = gray_hist[0] else: zero_cumu_moment[p] = zero_cumu_moment[p - 1] + gray_hist[p] output = np.zeros([256], np.uint8) cofficient = 256.0 / (h * w) for p in range(256): q = cofficient * float(zero_cumu_moment[p]) - 1 if q >= 0: output[p] = math.floor(q) else: output[p] = 0 out = np.zeros(img.shape, np.uint8) for i in range(h): for j in range(w): out[i][j] = output[img[i][j]] cv.imshow('img', img) cv.imshow('out', out) cv.waitKey() return out # limited equalization histogram conversion def limit_equal_hist_conv(img): clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) out = clahe.apply(img) equa = cv.equalizeHist(img) cv.imshow('img', img) cv.imshow('out', out) cv.imshow('equa', equa) cv.waitKey() return out if __name__ == '__main__': file_path = 'D:\\GitCode\\tools\\python\\test.jpg' out_path = 'D:\\GitCode\\tools\\python\\output.jpg' # 1. read image img = cv.imread(file_path, cv.IMREAD_COLOR) # 2. preprocess image # 2.1 get gray image gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 2.2 resize image gray_img = cv.resize(gray_img, None, fx=0.5, fy=0.5) # 3. process image # 3.1 linear conversion #out = linear_conv(gray_img) # 3.2 blcok conversion #out = block_conv(gray_img) # 3.3.1 histogram normlization conversion #out = hist_conv(gray_img) # 3.3.2 histogram normlization conversion #out = norm_conv(gray_img) # 3.3.3 histogram normlization conversion #out = norm_conv(img) # 3.4 gamma conversion #out = gamma_conv(gray_img) # 3.5 global equalization histogram conversion #out = global_equal_hist_conv(gray_img) # 3.6 limited equalization histogram conversion out = limit_equal_hist_conv(gray_img) # 4. save result cv.imwrite(out_path, out)
原圖如下:
效果圖如下:
3.1 linear conversion 3.2 blcok conversion
3.3.1 histogram normlization conversion 3.3.2 histogram normlization conversion 3.3.3 histogram normlization conversion(color)
3.4 gamma conversion 3.5 global equalization histogram conversion 3.6 limited equalization histogram conversion