Python / OpenCV

时间:2017-02-15 18:18:52

标签: python opencv image-processing histogram

在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

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

      

    直方图均衡的作用是拉伸此范围。

      

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

    我觉得这是错误的,因为维基百科上没有说明直方图均衡意味着拉伸,而阅读其他来源则明确区分这两种操作。

    1. http://homepages.inf.ed.ac.uk/rbf/HIPR2/histeq.htm
    2. http://homepages.inf.ed.ac.uk/rbf/HIPR2/stretch.htm
    3. 我的问题

      1. OpenCV文档是否实际实现了直方图均衡,同时对其进行了严格解释?

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

3 个答案:

答案 0 :(得分:6)

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

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

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

  

((像素 - 分钟)/(最大 - 分钟))* 255。

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

答案 1 :(得分:0)

通过使用cv2.LUT创建自定义表格,您还可以使用np.interp进行对比度拉伸。指向其文档的链接分别为thisthis。下面显示了一个示例。

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。

原始图片

Original

对比度拉伸图像

enter image description here

可以根据需要更改xpfp的值以创建自定义表格,即使最小和最大像素分别为0和255,也可以扩展对比度,这与{{3 }}。

答案 2 :(得分:0)

Python / OpenCV可以使用min_max规范化通过cv2.normalize()方法进行对比度拉伸。例如:

输入:

enter image description here

#!/bin/python3.7

import cv2
import numpy as np

# read image
img = cv2.imread("zelda3_bm20_cm20.jpg", cv2.IMREAD_COLOR)

# normalize float versions
norm_img1 = cv2.normalize(img, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
norm_img2 = cv2.normalize(img, None, alpha=0, beta=1.2, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

# scale to uint8
norm_img1 = (255*norm_img1).astype(np.uint8)
norm_img2 = np.clip(norm_img2, 0, 1)
norm_img2 = (255*norm_img2).astype(np.uint8)

# write normalized output images
cv2.imwrite("zelda1_bm20_cm20_normalize1.jpg",norm_img1)
cv2.imwrite("zelda1_bm20_cm20_normalize2.jpg",norm_img2)

# display input and both output images
cv2.imshow('original',img)
cv2.imshow('normalized1',norm_img1)
cv2.imshow('normalized2',norm_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()


标准化1:

enter image description here

Normalize2:

enter image description here

您还可以通过使用带有2对输入/输出值的简单线性方程式(y = A * x + B)并求解两个联立方程式来进行自己的拉伸。请参阅How can I make the gradient appearance of one image equal to the other?

中显示的拉伸概念