python-OpenCV之对比度增强

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/li_l_il/article/details/83897213

简介

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

基础知识

灰度直方图

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

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<h, o<=c<w

a为系数。a>1时,图像对比度被放大,0<a<1时图像对比度被缩小。常数项b用于调节亮度,b>0时亮度增强,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()
原图
输出图片

直方图正规化

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

解释:
 

展开阅读全文

没有更多推荐了,返回首页