python-OpenCV之对比度增强

简介

对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,差异范围越大代表对比越大,差异范围越小代表对比越小。对比度增强技术主要解决图像灰度级范围较小造成的对比度低问题,目的是将图像的灰度级放大到指定的程度,使图像中的细节看起来更加清晰。

基础知识

灰度直方图

概念:灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或占有率。

python实现过程

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np


# 计算灰度直方图
def calcGrayHist(image):
    rows, cols = image.shape
    grayHist = np.zeros([256], np.uint8)
    for r in range(rows):
        for c in range(cols):
            grayHist[image[r][c]] += 1
    return grayHist


if __name__ == "__main__":
    # 读入图片
    image = cv.imread('test.jpg', flags=0)
    # 计算灰度直方图
    grayHist = calcGrayHist(image)

    # 设置x范围
    x_range = range(256)
    # 绘制直方图
    plt.plot(x_range, grayHist, 'r', linewidth=2, c='black')
    # 设置y的范围
    y_maxValue = np.max(grayHist)
    plt.axis([0, 255, 0, y_maxValue])
    # 设置坐标轴标签
    plt.xlabel('gray Level')
    plt.ylabel('number of pixels')
    # 显示直方图
    plt.show()

对比度增强方式

线性变换

解释:

假设输入图片为I,宽为w,高为h,输出图像记为O,图像的线性变换公式为

                                           O(r,c) = a*I(r,c)+b,    0<=r

a为系数。a>1时,图像对比度被放大,00时亮度增强,b<0时对比度降低。

python实现过程

import cv2 as cv
import numpy as np

I = cv.imread('test.jpg', flags=0)
a = 2
O = I * float(a)
O[O > 255] = 255
O = np.round(O)
O = O.astype(np.uint8)

cv.imshow('I', I)
cv.imwrite('I.jpg', I)
cv.imshow('O', O)
cv.imwrite('O.jpg', O)
cv.waitKey()
cv.destroyAllWindows()
python-OpenCV之对比度增强_第1张图片 原图
python-OpenCV之对比度增强_第2张图片 输出图片

直方图正规化

线性变换系数的选择带有一定的盲目性,如果可以自动确定a和b的值,那岂不妙哉。直方图正规化就是我们所需要的这种方法。

解释:
 

你可能感兴趣的:(python-OpenCV之对比度增强)