Python/OpenCV 中的对比度拉伸

新手上路,请多包涵

在 Google 中搜索 直方图均衡 Python对比度拉伸 Python 我被定向到来自 OpenCv 中 python 文档的相同链接,它们实际上都与均衡相关而不是拉伸(IMO)。

  1. http://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.html

  2. http://docs.opencv.org/3.2.0/d5/daf/tutorial_py_histogram_equalization.html

阅读文档,它似乎与措辞混淆,因为它将均衡描述为拉伸操作:

Histogram Equalization 所做的就是拉长这个范围。

因此,您需要将此直方图拉伸到两端(如下图所示,来自维基百科),这就是直方图均衡所做的(简单来说)

我觉得这是错误的,因为在维基百科上没有任何地方说 直方图均衡 意味着拉伸,并且阅读其他来源,他们清楚地区分了这两种操作。

  1. http://homepages.inf.ed.ac.uk/rbf/HIPR2/histeq.htm
  2. http://homepages.inf.ed.ac.uk/rbf/HIPR2/stretch.htm

我的问题

  1. OpenCV 文档是否实际上实现了直方图均衡化,同时解释得很糟糕?

    1. 在 Python 中是否有任何对比度拉伸的实现? (OpenCV 等?)

原文由 RMS 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 846
2 个回答

OpenCV 没有任何用于对比度拉伸的函数,而 google 会产生相同的结果,因为直方图均衡化 确实会 水平拉伸直方图,但它只是变换函数的差异。 (这两种方法都增加了图像的对比度。转换函数将像素强度级别从给定范围转移到所需范围。)

直方图均衡化从给定图像的概率密度函数 (PDF) 中自动导出变换函数 (TF),而与对比拉伸不同的是,您可以根据应用程序的要求指定自己的 TF。

一个简单的 TF,您可以通过它进行对比度拉伸 min-max 对比度拉伸 -

((像素 – 最小值) / (最大 – 最小值))*255。

您为每个像素值执行此操作。 min 和 max 是最小和最大强度。

原文由 hashcode55 发布,翻译遵循 CC BY-SA 3.0 许可协议

您还可以使用 cv2.LUT 通过使用 np.interp 创建自定义表来进行对比度拉伸。他们文档的链接分别是 这个这个。下面显示了一个示例。

 import cv2
import numpy as np

img = cv2.imread('messi.jpg')
original = img.copy()
xp = [0, 64, 128, 192, 255]
fp = [0, 16, 128, 240, 255]
x = np.arange(256)
table = np.interp(x, xp, fp).astype('uint8')
img = cv2.LUT(img, table)
cv2.imshow("original", original)
cv2.imshow("Output", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

创建的表

[  0   0   0   0   1   1   1   1   2   2   2   2   3   3   3   3   4   4
   4   4   5   5   5   5   6   6   6   6   7   7   7   7   8   8   8   8
   9   9   9   9  10  10  10  10  11  11  11  11  12  12  12  12  13  13
  13  13  14  14  14  14  15  15  15  15  16  17  19  21  23  24  26  28
  30  31  33  35  37  38  40  42  44  45  47  49  51  52  54  56  58  59
  61  63  65  66  68  70  72  73  75  77  79  80  82  84  86  87  89  91
  93  94  96  98 100 101 103 105 107 108 110 112 114 115 117 119 121 122
 124 126 128 129 131 133 135 136 138 140 142 143 145 147 149 150 152 154
 156 157 159 161 163 164 166 168 170 171 173 175 177 178 180 182 184 185
 187 189 191 192 194 196 198 199 201 203 205 206 208 210 212 213 215 217
 219 220 222 224 226 227 229 231 233 234 236 238 240 240 240 240 240 241
 241 241 241 242 242 242 242 243 243 243 243 244 244 244 244 245 245 245
 245 245 246 246 246 246 247 247 247 247 248 248 248 248 249 249 249 249
 250 250 250 250 250 251 251 251 251 252 252 252 252 253 253 253 253 254
 254 254 254 255]

现在 cv2.LUT 将用表中的值替换原始图像的值。例如,所有值为 1 的像素将被替换为 0,所有具有值 4 的像素将被替换为 1。

原图

原版的

对比度拉伸图像

在此处输入图像描述

xpfp 的值可以改变以根据需要创建自定义表,即使最小和最大像素为 0 和 255 与 hashcode55 提供的答案不同,它也会拉伸对比度。

原文由 Vardan Agarwal 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题