python opencv 直方图均衡化,opencv直方图均衡化函数

  python opencv 直方图均衡化,opencv直方图均衡化函数

  在本教程中,您将学习使用OpenCV实现直方图均衡化和自适应直方图均衡化(CLAHE)。

  直方图均衡化是一种基本的图像处理技术,它通过更新图像直方图的像素强度分布来调整图像的全局对比度。通过这样做,具有低对比度的区域可以在输出图像中获得更高的对比度。

  本质上,直方图均衡化的工作原理是:

  1.计算图像像素强度的直方图。2.均匀分布最频繁出现的像素值(即直方图中计数最大的像素值)。3.给出累积分布函数(CDF)的线性趋势。应用直方图均衡化的结果是获得具有更高全局对比度的图像。

  我们可以进一步改进直方图均衡化,并采用一种称为对比度受限自适应直方图均衡化(CLAHE)的算法来获得更高质量的输出图像。

  除了摄影师使用直方图均衡化来校正曝光不足/曝光过度的图像之外,直方图均衡化在医疗领域中的应用最为广泛。

  您通常会看到直方图均衡化应用于X射线扫描和CT扫描,以提高X射线胶片的对比度。这可以帮助医生和放射科医生更好地解读扫描结果,做出准确的诊断。

  在本教程结束时,您将能够使用OpenCV成功地将基本直方图均衡化和自适应直方图均衡化应用于图像。

  1.OpenCV直方图均衡化和自适应直方图均衡化(CLAHE)在本教程的第一部分,我们将讨论什么是直方图均衡化,以及如何使用OpenCV应用它。

  代码地址:

  链接:https://pan.baidu.com/s/19V6s7Ten6K9FfBpJTbZhAQ提取代码:123a我们将实现两个Python脚本:

  Simple_equalization.py:使用OpenCV的cv2.equalizeHist()函数执行基本的直方图均衡。Adaptive_equalization.py:使用OpenCV的cv2.createCLAHE()方法进行自适应直方图均衡。2.什么是直方图均衡化?直方图均衡化是一种基本的图像处理技术,可以提高图像的整体对比度。

  首先,应用直方图均衡化来计算输入灰度/单通道图像中像素强度的直方图:

  左图:我们的原始输入灰度图像。右图:计算灰度图像的直线平方图。左图:我们的原始输入灰度图像。右图:计算灰度图像的直方图。左图:我们的原始输入灰度图像。右图:计算灰度图像的直方图。

  请注意,我们的直方图有许多峰值,这表明许多像素被分类到这些各自的虚拟小猫中。使用直方图均衡化,我们的目标是将这些像素分散成一只没有太多像素的虚拟小猫。

  从数学上来说,这意味着我们试图将线性趋势应用于累积分布函数(CDF):

  正方形图形均衡目标使输出图像线性C D F直方图均衡目标使输出图像线性CDF直方图均衡目标使输出图像线性CDF

  左图:应输入正方形图形均衡化前的原始图像。右图:应使用方形图均衡后的输出图像。左图:应用直方图均衡化之前的原始输入图像。右图:应用直方图均衡化后的输出图像。左图:应用直方图均衡化之前的原始输入图像。右图:应用直方图均衡化后的输出图像。

  请注意输入图像的对比度是如何显著提高的,但代价是输入图像中的噪声对比度也得到了提高。

  这就提出了一个问题:是否有可能在不增加噪声的同时提高图像对比度?

  答案是“是”,你只需要应用自适应直方图均衡化。

  通过自适应直方图均衡化,我们将输入图像分成M N个网格。然后,我们均衡网格中的每个单元,以获得更高质量的输出图像:

  左图:基本的方形图是平衡的。右:自适应直方图均衡左:基本直方图均衡。右:自适应直方图均衡左:基本直方图均衡。右图:自适应直方图均衡化

  缺点是自适应直方图均衡的计算复杂度较高(但考虑到现代硬件,这两种实现还是挺快的)。

  3.如何使用OpenCV进行直方图均衡化?OpenCV通过以下两个函数包括基本直方图均衡和自适应直方图均衡:

  2.cv2 . equalizehistcv 2 . CREATE CLAHE CV2 . equalizehist()函数的应用非常简单,只需将图像转换成灰度,然后调用CV2即可。均衡器:

  灰色=cv2。cvtcolor(图像,cv2。color _ bgr2gray)均衡=cv2。实现自适应直方图均衡的均衡历史(灰度)要求:

  1.将输入图像转换为灰度/从中提取单个通道。2.使用cv2.createCLAHE. 3实例化CLAHE算法。打电话给。对CLAHE对象应用apply()方法以应用直方图均衡化。这比听起来容易得多,而且只需要几行代码:

  Gray=cv2.cvtcolor (image,cv2 . color _ bgr 2 gray)clahe=cv2.createCLAHE(clip limit=2.0,tilegridsize=(8,8)) equalized=clahe.apply (gray)注意我们为cv2 . create clahe提供了两个。

  ClipLimit:这是对比度限制的阈值tileGridSize:将输入图像分成M N个块,然后对每个局部块进行直方图均衡化。4.项目结构在使用OpenCV实现直方图均衡化之前,我们先来回顾一下我们的项目目录结构。

  5.代码实现5.1使用OpenCV实现标准直方图均衡化#用法# python simple _ equalization . py-image images/moon . png #导入必要的库导入argparseimport cv2 #构造一个参数解析器并解析参数AP=arg parse . argument parser()AP . add _ argument(-I ,-image ,type=str,required=true,Help= path to the input image )args=vars(AP . parse _ args())#从磁盘加载输入图像并转换为灰度打印([info]加载输入图像)image=cv2 . im read(args[ image ])gray=cv2 . CVT color(image,2。color _ bgr2gray) # print ([info]执行直方图均衡.)equalized=cv2 . equalized hist(gray)#显示原始灰度图像和均衡图像cv2.imshow (input ,gray)cv2 . im Show( histogram equalization ,equalized) cv2.waitkey (0)

  5.2代码分析首先导入我们需要的Python包,分析我们的命令行参数。这里我们只需要一个参数——image,它是输入图像在磁盘上的路径。我们想在这里应用直方图均衡化。

  解析完命令行参数后,我们可以进入下一步:从磁盘加载图像,并将图像从RGB转换为灰度。使用cv2.equalizeHist执行基本的直方图均衡。我们唯一需要传入的参数是灰度/单通道图像。

  注意:使用OpenCV进行直方图均衡时,必须提供灰度/单通道图像。如果我们试图传递一个多通道图像,OpenCV将抛出一个错误。要对多通道图像执行直方图均衡,您需要(1)将图像划分到其自己的通道中,(2)均衡每个通道,以及(3)合并通道。

  5.3利用OpenCV实现自适应直方图均衡化#用法# Python adaptive _ equalization . py-image images/Boston . png #导入必要的库,导入argparseimport cv2#构造一个参数解析器并解析参数AP=arg parse . argument parser()AP . add _ argument(-I ,-image ,type=str,required=true,help=Path to the input image ,- clip ,type=float,default=2.0,help= Threshold for contrast limiting )AP . add _ argument() help= tile grid size-将图像分成图块x图块单元格)args=vars (ap.parse _ args ()) #从磁盘加载输入图像并将其转换为灰度打印([INFO]加载输入图像. )image=cv2 . im read(args[ image ])gray=cv2 . CVT color(image,2。CVColor _ BGR2Gray) # Apply CLAHE(对比度受限的自适应直方图均衡化)print ([info] applying CLAHE . )clahe=cv2 . create clahe(clip limit=args[ clip ],tileGridSize=(args[tile],Arg[ tile ]))equalized=clahe . apply(gray)#显示clahe cv2.imshow (input ,gray) cv2.imshow (clahe ,equalized) cv2.waitkey (0)

  5.4代码分析自适应直方图均衡化比简单的直方图均衡化开销更大,但可以产生更好的结果。但是不要相信我的话,——。你应该亲自看看结果。

  我们有三个命令行参数,其中一个是必需的,两个是可选的(但在使用CLHE时很有用):

  - image:输入图像在磁盘上的路径,我们要在这里应用直方图均衡化。- clip:对比度极限的阈值。您通常希望将该值保持在2-5的范围内。如果你把这个值设置的太大,那么你实际上做的就是把局部对比度最大化,反过来也会把噪点最大化(这和你想要的正好相反)。尽量保持这个值尽可能低。-Tile:Clahe的网格大小。从概念上讲,我们在这里所做的是将输入图像划分为tile x tile单元,然后对每个单元应用直方图均衡化(使用CLAHE提供的额外功能)。从磁盘加载输入图像,并将其转换为灰度,就像我们对基本直方图均衡化所做的那样。通过cv2.createCLAHE()函数初始化CLHE对象。这里,我们提供clipLimit和tileGridSize,它们是通过命令行参数提供的。

  打电话给。apply()方法将自适应直方图均衡化应用于灰度图像。

  6.直方图均衡化的建议当构建自己的图像处理管道并发现应该应用直方图均衡化时,我建议从使用cv2.equalizeHist的简单直方图均衡化开始但是如果您发现结果很差,但它增加了输入图像的噪声,那么您应该尝试通过cv2.createCLAHE使用自适应直方图均衡化

  请参考目录3359 www . pyimagesearch . com/2021/02/01/opencv-histogram-equalization-and-adaptive-histogram-equalization-clahe/

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: