最近在做基于图像的文字和公式识别项目,在想是不是去噪及灰度化之后用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