1. 程式人生 > >影象增強的方法

影象增強的方法

最近在做基於影象的文字和公式識別專案,在想是不是去噪及灰度化之後用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