OpenCV 您所在的位置:网站首页 随机组合函数图像 OpenCV

OpenCV

2023-08-15 15:15| 来源: 网络整理| 查看: 265

图像增强主要解决由于图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度级放大到指定的程度,使得图像中的细节看起来增加清晰。对比度增强有几种常用的方法,如线性变换、分段线性变换、伽马变换、直方图正规化、直方图均衡化、局部自适应直方图均衡化等。

1.灰度直方图

在讲解图像增强的方法之前先来认识一下灰度直方图,灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。接下来使用程序实现直方图:

import cv2 as cv import numpy as np import matplotlib.pyplot as plt def calcGrayHist(I): # 计算灰度直方图 h, w = I.shape[:2] grayHist = np.zeros([256], np.uint64) for i in range(h): for j in range(w): grayHist[I[i][j]] += 1 return grayHist img = cv.imread("../testImages/4/img1.jpg", 0) grayHist = calcGrayHist(img) x = np.arange(256) # 绘制灰度直方图 plt.plot(x, grayHist, 'r', linewidth=2, c='black') plt.xlabel("gray Label") plt.ylabel("number of pixels") plt.show() # cv.imshow("img", img) # cv.waitKey()

Matplotlib本身也提供了计算直方图的函数hist,以下由matplotlib实现直方图的生成:

import cv2 as cv import numpy as np import matplotlib.pyplot as plt img = cv.imread("../testImages/4/img1.jpg", 0) h, w = img.shape[:2] pixelSequence = img.reshape([h * w, ]) numberBins = 256 histogram, bins, patch = plt.hist(pixelSequence, numberBins, facecolor='black', histtype='bar') plt.xlabel("gray label") plt.ylabel("number of pixels") plt.axis([0, 255, 0, np.max(histogram)]) plt.show() cv.imshow("img", img) cv.waitKey()

图像的对比度是通过灰度级范围来度量的,而灰度级范围可通过观察灰度直方图得到,灰度级范围越大代表对比度越高;反之对比度越低,低对比度的图像在视觉上给人的感觉是看起来不够清晰,所以通过算法调整图像的灰度值,从而调整图像的对比度是有必要的。最简单的一种对比度增强的方法是通过灰度值的线性变换实现的。

2.线性变换

假设输入图像为I,宽为W,高为H,输出图像记为O,图像的线性变换可以用以下公式定义:

        O(r,c) = a * I(r,c) + b, 0\leqslant rH,0\leqslant cW

如下图所示,当a=1,b=0时,OI的一个副本;如果a>1,则输出图像O的对比度比I有所增大;如果0可以降低图像对比度。图像的伽马变换实质上是对图像矩阵中的每一个值进行幂运算,Numpy提供的幂函数power实现了该功能,代码实现如下:

img = cv.imread("../testImages/4/img8.jpg", 0) # 图像归一化 fi = img / 255.0 # 伽马变换 gamma = 0.4 out = np.power(fi, gamma) cv.imshow("img", img) cv.imshow("out", out) cv.waitKey()

伽马变换在提升对比度上有比较好的效果,但是需要手动调节\gamma值。下面介绍一种利用图像的直方图自动调节图像对比度的方法。

5.全局直方图均衡化

对于直方图均衡化的实现主要分为四个步骤: 1、计算图像的灰度直方图 2、计算灰度直方图的累加直方图 3、输入灰度级和输出灰度级之间的映射关系 4、根据映射关系循环输出图像的每一个像素的灰度级 其中的映射关系是:q=\frac{\sum_{k=0}^{p}hist_{I}(k)}{H*W}*256-1,其中q为输出的像素,p为输入的像素。可以这么理解,\frac{\sum_{k=0}^{p}hist_{I}(k)}{H*W}这一项相当于是灰度直方图的累加概率直方图(范围在0~1之间),再将此范围放大至0~255之间便得到输出图像的像素。下面使用程序来实现:

def equalHist(img): # 灰度图像矩阵的高、宽 h, w = img.shape # 第一步:计算灰度直方图 grayHist = calcGrayHist(img) # 第二步:计算累加灰度直方图 zeroCumuMoment = np.zeros([256], np.uint32) for p in range(256): if p == 0: zeroCumuMoment[p] = grayHist[0] else: zeroCumuMoment[p] = zeroCumuMoment[p - 1] + grayHist[p] # 第三步:根据累加灰度直方图得到输入灰度级和输出灰度级之间的映射关系 outPut_q = np.zeros([256], np.uint8) cofficient = 256.0 / (h * w) for p in range(256): q = cofficient * float(zeroCumuMoment[p]) - 1 if q >= 0: outPut_q[p] = math.floor(q) else: outPut_q[p] = 0 # 第四步:得到直方图均衡化后的图像 equalHistImage = np.zeros(img.shape, np.uint8) for i in range(h): for j in range(w): equalHistImage[i][j] = outPut_q[img[i][j]] return equalHistImage img = cv.imread("../testImages/4/img1.jpg", 0) # 使用自己写的函数实现 equa = equalHist(blur) # grayHist(img, equa) # 使用OpenCV提供的直方图均衡化函数实现 # equa = cv.equalizeHist(img) cv.imshow("img", img) cv.imshow("equa", equa) cv.waitKey()

理解了上述代码,对于OpenCV提供的函数 equalizeHist() 就可以轻松掌握了,使用方法很简单,只支持对8位图的处理。虽然全局直方图均衡化方法对提高对比度很有效,但是均衡化处理以后暗区域的噪声可能会被放大,变得清晰可见,而亮区域可能会损失信息。为了解决该问题,提出了自适应直方图均衡化(Aptive Histogram Equalization)方法。

6.限制对比度的自适应直方图均衡化

自适应直方图均衡化首先将图像划分为不重叠的区域块,然后对每一个块分别进行直方图均衡化。显然,在没有噪声影响的情况下,每一个小区域的灰度直方图会被限制在一个小的灰度级范围内;但是如果有噪声,每一个分割的区域块执行直方图均衡化后,噪声会被放大。为了避免出现噪声这种情况,提出了“限制对比度”(Contrast Limiting),如果直方图的bin超过了提前预设好的“限制对比度”,那么会被裁剪,然后将裁剪的部分均匀分布到其他的bin,这样就重构了直方图。下面介绍OpenCV实现的限制对比度的自适应直方图均衡化函数,

img = cv.imread("../testImages/4/img3.jpg", 0) img = cv.resize(img, None, fx=0.5, fy=0.5) # 创建CLAHE对象 clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) # 限制对比度的自适应阈值均衡化 dst = clahe.apply(img) # 使用全局直方图均衡化 equa = cv.equalizeHist(img) # 分别显示原图,CLAHE,HE cv.imshow("img", img) cv.imshow("dst", dst) cv.imshow("equa", equa) cv.waitKey()

OpenCV提供的函数:cv.createCLAHE([, clipLimit[, tileGridSize]])

参数解释clipLimit对比度限制的阈值,默认为40tileGridSize用于直方图均衡的区域块大小。 输入图像将被分成相同大小的矩形块。 tileGridSize定义行和列中的块数。默认为(8,8)

上图显示了对原图(a)进行限制对比度自适应直方图均衡化(CLAHE)和全局直方图均衡化(HE)的效果,会发现,原图中比较亮的区域,经过HE处理后出现了失真的情况,而且出现了明显的噪声,而CLAHE避免了这两种情况。

7.总结

对比度增强只是图像增强方法中的一种手段,对比度拉伸的方法受图像噪声的影响会明显,下一篇介绍去除噪声的方法,去噪之后再使用对比度增强技术效果会更好。

本篇文章讲解了灰度直方图的可视化、线性变换、分段线性变换、直方图正规化、伽马变换、全局直方图均衡化、限制对比度的自适应直方图均衡化,使用到的函数有 minMaxLoc(),normalize(),equalizeHist(),createCLAHE()。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有