图像增强的方法

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

猜你喜欢

转载自blog.csdn.net/lwc5411117/article/details/83862689
今日推荐