【问题标题】:Contrast stretching in Python/ OpenCVPython/OpenCV 中的对比度拉伸
【发布时间】:2017-07-04 13:46:30
【问题描述】:

在 Google 中搜索 Histogram Equalization PythonContrast Stretching 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

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

直方图均衡所做的就是扩展这个范围。

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

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

  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 等?)

【问题讨论】:

标签: python opencv image-processing histogram


【解决方案1】:

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

输入:

#!/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:

标准化2:

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

【讨论】:

    【解决方案2】:

    您还可以通过使用np.interp 创建自定义表格,使用cv2.LUT 进行对比度拉伸。他们的文档链接分别是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。

    原图

    对比度拉伸图像

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

    【讨论】:

      【解决方案3】:

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

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

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

      ((像素-最小)/(最大-最小))*255。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-31
        • 1970-01-01
        • 2015-10-23
        • 2021-02-25
        • 2018-12-02
        • 2013-02-28
        • 1970-01-01
        相关资源
        最近更新 更多