OpenCV CLAHE 中的剪辑限制究竟意味着什么?

2023-12-20

我读过很多文章说clip limit是CDF斜率的极限。但是在OpenCV中,该参数可以设置为0~999...,我不知道这个参数的最大值,PDF的总和不等于1吗?斜率怎么会大于1呢? 剪辑限制的另一种说法是,这是对每个灰度级计数的限制,因此例如,如果我将图块设置为 (8,8),则该图块中的任何灰度级都不可能超过 64 像素,但如果我设置限制超过64,结果仍在变化。 请赐教我任何观点。


因此,clip limit的实现方式如下:

  1. 概率密度函数 (PDF) 是针对每个可能的像素强度计算的,假设我们有一个 8 位图像,因此 PDF 是一个索引为 0 到 255 的数组。PDF 是通过计算图像中的像素数来计算的例如,PDF(intensity = 0) = 26 表示图像中有 26 个像素的强度为 0。
  2. 一旦计算出 PDF,代码就会循环遍历 PDF 中的每个元素,并确定 PDF 的该元素是否大于 ClipLimit。因此,举例来说,clipLimit 为 4,我们从 PDF(0) = 26 开始,它大于 4。因此,代码通过以下方式“剪辑”强度为 0 的像素计数:clipped = clipped + pdf[i] - clipLimit;,其中 Clipped 从 0 开始。然后 Clipped = 0 + 26 - 4 = 22。代码继续对 PDF(intensity = 1)、PDF(intensity = 2)、...、PDF(intensity = 255) 执行此操作。最后,PDF 中没有任何单个元素大于 ClipLimit,并且超出的像素数已存储在变量 Clipped 中。 (就像 fmw42 所说的)。
  3. 然后,剪裁的像素数量在 PDF 数组中均匀地重新分布。例如,假设 Clipped = 128,则 PDF 的几乎所有其他元素都会获得 +1 像素计数。因此,如果裁剪后 PDF(0) = 4, PDF(1) = 2, PDF(2) = 0,则重新分配后将是 PDF(0) = 4+1, PDF(1) = 2, PDF (2) = 0+1。请注意,重新分配后,之前处于最大值(clipLimit)的一些像素会稍微向上推到超过clipLimit。

From 维基百科 https://en.wikipedia.org/wiki/Adaptive_histogram_equalization,clipLimit通常设置在3到4之间。当像上面那样实现clip limit时,直方图中任意元素的最大值受到限制,因此,直方图中任意两个相邻元素之间的最大斜率(即强度变化)直方图是有限的。

  • 一个不切实际但有用的练习是想象一下尺寸为 1920 x 1080 像素的图像中的所有像素的强度为 1,因此 PDF 的开头为 PDF(0) = 0, PDF(1) = 2073600, PDF 的其余元素均为 0。则 CDF 的斜率 = (2073600-0)/(1-0) = 2073600。
  • 然而,现在想象一下,对于同一张图像,我们将 ClipLimit 设置为 4,并且整个图像只有一个直方图。裁剪后的 PDF 为:PDF(0) = 0、PDF(1) = 4、PDF(2) = 0,依此类推。裁剪后的最大斜率是 (4-0)/(1-0) = 4,远小于 2073600。重新分布后,每个直方图箱大约多获得 8100 个像素,因此 PDF 将类似于 PDF(0) = 8100、PDF(1) = 8104、PDF(2) = 8100,依此类推。现在,剪裁和重新分布后 CDF 的最大斜率是 (8104-8100)/(1-0) = 4。

至于你的问题,PDF的总和确实是1。但是,这里的数组PDF存储的是计数,即PDF的分子。因此,对于尺寸为 1920 x 1080 的图像,如果实际的 PDF 为

  • 概率(强度 = 0)= 4/(1920x1080) = 4/2073600
  • P(强度 = 1) = 2/2073600
  • P(强度 = 2) = 0/2073600 ,那么这些分数的总和确实为 1。像 OpenCV 源代码中那样实现的概率密度函数将在数组 PDF 中显示为:
  • PDF(0) = 4
  • PDF(1) = 2
  • PDF(2) = 0 ,并且如果没有分母,这些元素之和就不等于 1。

代码的实现可以参考OpenCV 源代码 https://github.com/opencv/opencv/blob/master/modules/imgproc/src/clahe.cpp。作为脚注,我对重新分配的实现进行了一些简化,但希望它应该更容易理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV CLAHE 中的剪辑限制究竟意味着什么? 的相关文章

  • 在 Pandas 中按日期获取有效合约

    我在检测 pandas DataFrame 中的活动合约方面遇到了一些困难 假设每一行都是一个协商 对于每一行 我有两列 initial date 和 end date 我想知道的是按日期划分的活跃合约数量 到目前为止我做了一个非常低效的方
  • 在 Numpy 中切片后确定结果数组的形状

    我很难理解在 numpy 中切片后如何确定结果数组的形状 例如 我使用以下简单代码 import numpy as np array np arange 27 reshape 3 3 3 slice1 array 1 2 1 slice2
  • OpenCV InRange 参数

    我在 Android 上使用 OpenCV 来实时查找特定颜色的圆圈 我的第一步是仅保留与我正在寻找的定义颜色相对应的像素 在本例中为红色或绿色 示例图像 https i stack imgur com CIozU jpg 为此 我正在使用
  • Python 3 __getattribute__ 与点访问行为

    我读了一些关于 python 的对象属性查找的内容 这里 https blog ionelmc ro 2015 02 09 understanding python metaclasses object attribute lookup h
  • 如何从 PyCharm 项目中获取我的“exe”[重复]

    这个问题在这里已经有答案了 通过 PyCharm 在 Python 上编写一些项目 我想从中获取一个exe文件 我尝试过 另存为 gt XXX exe 但是 当我尝试执行它时出现错误 此类操作系统不支持该文件 附注 我有win7 x64 它
  • Paramiko - 使用私钥连接 - 不是有效的 OPENSSH 私钥/公钥文件

    我正在尝试找到解决方案 但无法理解我做错了什么 在我的 Linux 服务器上 我运行了以下命令 ssh keygen t rsa 这产生了一个id rsa and id rsa pub file 然后我将它们复制到本地并尝试运行以下代码 s
  • Python - 用逗号分割,跳过括号内的内容

    我需要用逗号分隔字符串 但我对这种情况有一个问题 TEXT EXAMPLE THIS IS A EXAMPLE BUT NOT WORKS FOR ME SECOND THIRD 我想拆分并得到 var 0 TEXT EXAMPLE THI
  • Pandas重置索引未生效[重复]

    这个问题在这里已经有答案了 我不确定我在哪里误入歧途 但我似乎无法重置数据帧上的索引 当我跑步时test head 我得到以下输出 正如您所看到的 数据帧是一个切片 因此索引超出范围 我想做的是重置该数据帧的索引 所以我跑test rese
  • 带图像的简单 GUI [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图在简单的 GUI 上显示一些卡
  • sudo pip install python-Levenshtein 失败,错误代码 1

    我正在尝试在 Linux 上安装 python Levenshtein 库 但每当我尝试通过以下方式安装它时 sudo pip install python Levenshtein 我收到此错误 命令 usr bin python c 导入
  • 无法打开 Python。错误 0xc000007b

    我最近一直在学习 Python 3 我在我的上网本 32 位 Windows 7 上创建简单的小程序没有任何问题 当我将它安装在我的上网本上时 我没有遇到任何问题 但现在我已经开始使用它了 我想将它安装在我的台式机上 并且我有一个 我的桌面
  • 如何在 Python 中将彩色输出打印到终端?

    是否有与 Perl 等效的 Python 语言 print color red print
  • 更改 pandas 中多个日期时间列的时区信息

    有没有一种简单的方法可以将数据帧中的所有时间戳列转换为本地 任何时区 不是逐列进行吗 您可以有选择地将转换应用于所有日期时间列 首先 选择它们select dtypes https pandas pydata org pandas docs
  • 具有多个元素的数组的真值是二义性错误吗? Python

    from numpy import from pylab import from math import def TentMap a x if x gt 0 and x lt 0 5 return 2 a x elif x gt 0 5 a
  • 将一个列表的元素除以另一个列表的元素

    我有两个清单 比如说 a 10 20 30 40 50 60 b 30 70 110 正如你所看到的 列表 b 由一个列表的元素总和组成 其中 window 2 b 0 a 0 a 1 10 20 30 etc 如何获得另一个列表 该列表由
  • 导入错误:没有名为 google.auth 的模块

    当我尝试导入时firebase admin in python 2 7我收到错误 导入错误 没有名为 google auth 的模块 这是Docker文件 https github com ammaratef45 Attendance bl
  • Flask WTForms 使用变量自动填充 StringField

    我有一个表格 我想用上一页收到的信息自动填充一些字段 但如果他们想调整它 它需要是可更改的 我正在为我的 SelectField 使用动态创建的列表 但添加 StringField 并不成功 请参阅下面的我的代码 forms py clas
  • Python - 如何查询定义方法的类?

    我的问题有点类似于this one https stackoverflow com questions 5520580 how do you get all classes defined in a module but not impor
  • Python组合目录中的所有csv文件并按日期时间排序

    我有 2 年的每日数据分成每月文件 我想将所有这些数据合并到一个按日期和时间排序的文件中 我正在使用的代码组合了所有文件 但不按顺序 我正在使用的代码 import pandas as pd import glob os import cs
  • Django South - 将 null=True 字段转换为 null=False 字段

    我的问题是 转变的最佳做法是什么null True场变成null False使用 Django South 的字段 具体来说 我正在与ForeignKey 你应该先写一个数据迁移 http south aeracode org docs t

随机推荐

  • 限制mongodb集合中的文档数量

    我有一个用作缓存的集合 如何将这个集合中的文档数量限制为 5M 注意 可以更新的缓存项将存在于缓存中 我尝试使用 capped 但保存在 capped 集合中的项目无法修改 有没有办法做到这一点 我想避免删除该项目然后插入更新项目 不幸的是
  • “调试器无法继续运行该进程。”

    我一直在搞乱 VS 2010 调试设置 试图进入 NET Framework 工作 好吧 我无法让它工作 我还尝试过 Reflector VS 插件 并且一度可以正常工作 然后我随机开始收到此错误 This only当我在调用的行上有断点时
  • PHP 在 fclose 后无法取消链接文件

    我的脚本完成后 我可以删除该文件 但在它运行时我无法触及它 即使在fclose 这是我尝试使用的代码 Files glob SERVER DOCUMENT ROOT files csv File fopen Files 0 r while
  • 获取变量“@xml_files”不会在...行保持共享

    我有以下 Perl 代码 sub merge xml foreach my repository repo1 repo2 my xml files sub match xml my filename File Find dir if fil
  • jQuery,悬停时图像变化[重复]

    这个问题在这里已经有答案了 好的 我已经通过 PHP 动态生成了图像 因此结果不一定相同 在过去的四个小时里 我浏览了互联网并使用 jQuery 和 或 CSS 尝试了无数的事情 并且我想出了以下可行的方法 a href build php
  • 如何使用 Ninject 注入一些通用的 asp.net http 处理程序?

    我是 Ninject 的新手 我不知道如何注入我的通用 http 处理程序 我有一个 MVC3 项目 我将我的服务注入到控制器中 没有任何问题 这是我在 Ninject App start 类中用于注册服务的内容 private stati
  • 以编程邮件合并方式将数据注入到现有的 Excel 电子表格中?

    我想自动将数据输入到 Excel 电子表格中 用户数据将存在于网站上 当用户请求时 需要将该数据注入到 Excel 电子表格中 复杂之处在于 Excel 电子表格的格式在不同用户之间可能存在很大差异 它将由用户定义 我一直认为这是一个模板问
  • 如何让 IDropTarget 与 Delphi 中的 Drop Handler 配合使用?

    我已将文件扩展名与我的 Delphi 2009 程序相关联 我一直在使用命令行调用方法将文件名传递给我的 Delphi 程序 以便可以打开它 但是 我发现当选择多个文件并一次单击所有文件时 它会在程序的单独实例中打开每个文件 我问过这个 h
  • SqlServer 2005:没有共享记录的死锁问题

    我遇到两个不访问任何公共记录的事务的死锁问题 也没有锁升级 所以我无法解释为什么可能出现僵局 当两个这样的事务同时执行时就会发生死锁 begin transaction update A set value value where id 1
  • 将 JSON 对象和对象列表传递给 ASP.Net 控制器 [重复]

    这个问题在这里已经有答案了 我需要以下方面的帮助 我有这两个模型以及我将在下面使用它们的方法 public class RoleModel public string Name get set public string Descripti
  • 如何在 Java 中同步或锁定变量?

    让我使用这个小而简单的示例 class Sample private String msg null public void newmsg String x msg x public String getmsg String temp ms
  • 网站托管在 IIS 中时无法打开数据库

    当我从 Visual Studio 运行我的网站时 一切正常 现在我正在尝试继续并开始测试多租户部分 因此我必须将我的网站移至 IIS 由于某种原因我无法访问数据库 当我打开需要数据库访问的页面时出现的错误是 无法打开登录请求的数据库 GW
  • 文本列不能存储超过 8000 个字符

    我对此进行了研究 发现textSQL Server 中的列可以存储超过 8000 个字符 但是当我在文本列中运行以下插入时 它只插入 8000 个字符 UPDATE a SET File b Header CHAR 13 CHAR 10 d
  • 将 Leaflet 地图设置为高度:容器的 100%

    请问我们如何将地图 div 设置为其容器的 height 100 我已经在引导模板内容部分中尝试过此操作 但我得到的只是 0px 的高度 甚至 Google Dev 工具也将 map 高度显示为 0px body padding 0 mar
  • 居中 DatePicker 控件

    我正在使用 wpf 工具包中的 datepicker 控件 我需要将日期选择器控件中的内容居中对齐 我怎样才能实现这个目标 尝试VerticalContentAlignment 居中 它不起作用
  • 为什么 jsp:include 参数不可见

    我有完全相同的基本问题关于访问 jsp param 值 https stackoverflow com questions 3698068 jsp include with parameters usage simple question正
  • 获取表中列中的行

    我想从我的表中得到一个特殊的结果 并且我想知道这是可能的 我有一个像这样的表 idA idB val 按此值 idA idB val 1 5 50 1 6 0 1 7 NULL 2 5 100 2 6 12 2 7 0 我想通过这样的格式从
  • 为什么 spring 不使用我的 Converter

    我的 applicationContext xml 中有这个
  • 无法删除错误 CRUD API(NodeJS、MongoDB、Express)

    我在尝试从我正在处理的 API 项目中创建的 mongo 数据库中删除字段时遇到错误 我对 RESTful API 以及 MongoDB 和 Express 都还很陌生 我按照 YouTube 上的教程进行操作 该教程解释了制作这样一个 A
  • OpenCV CLAHE 中的剪辑限制究竟意味着什么?

    我读过很多文章说clip limit是CDF斜率的极限 但是在OpenCV中 该参数可以设置为0 999 我不知道这个参数的最大值 PDF的总和不等于1吗 斜率怎么会大于1呢 剪辑限制的另一种说法是 这是对每个灰度级计数的限制 因此例如 如