【问题标题】:Implementation of "Global Contrast Factor" in Python with OpenCV and Numpy使用 OpenCV 和 Numpy 在 Python 中实现“全局对比度因子”
【发布时间】:2019-01-09 10:25:06
【问题描述】:

我想使用 Python 实现 Krešimir Matkovic、László Neumann、Attila Neumann、Thomas Psik 和 Werner Purgathofer 的论文 Global Contrast Factor - a New Approach to Image Contrast 中详述的过程Numpy 和 OpenCV。但是,有一个步骤我正在努力。

该过程本质上涉及灰度图像像素上的一些基本乘法和加法,这可以通过 Numpy 矢量化操作轻松完成。但是,对于分辨率越来越小的图像,需要重复此过程,其中较小图像中的超像素根据论文中提供的特定公式进行组合。

从原始图像开始,每次将尺寸减半,“超像素值计算为平均线性亮度,并且 然后将其转换为感知亮度,”由公式给出:

其中 gamma = 2.2,k 是原始像素值 [0, 255]。我假设这意味着每次缩小图像时,我需要一次计算四个像素的第一个公式(以正方形排列),将它们平均,然后应用第二个公式用作灰度值较小的图像。

我的问题是我不确定如何有效地缩小图像,以便以对应于这些公式的方式计算其像素值。 OpenCV 已经内置了一些调整大小的算法,但老实说,我不确定哪个(如果有的话)会提供与论文中详述的结果相似的结果。

在较小图像中的像素值由这些公式确定的情况下,如何有效地调整灰度图像的大小?

【问题讨论】:

    标签: python image numpy opencv


    【解决方案1】:

    OpenCV resize 不执行这些操作。您必须明确计算图像中每个像素的线性亮度值,然后使用线性插值 (INTER_LINEAR) 应用 resize。线性插值将计算平均值。请参阅以下示例。它计算非重叠 2x2 块的平均值。

    >>> im = np.random.randint(0, 255, (8, 8)).astype(np.float32)
    >>> im
    array([[ 74.,  73., 109.,  41., 165.,  24., 165., 189.],
           [143.,  15., 212., 139.,  63., 123., 222., 231.],
           [ 58., 150., 168., 234.,  64., 139., 239., 179.],
           [227.,  11., 142.,  42.,  28., 127., 213.,  52.],
           [187., 232.,  26.,  34.,  63., 104., 197., 155.],
           [ 95., 154.,  69.,  56., 163.,  93.,  37., 136.],
           [ 14., 249., 204.,  15., 182., 226.,  20., 114.],
           [231.,  61., 155., 184., 211., 162.,  62.,  26.]], dtype=float32)
    >>> cv2.resize(im, dsize=None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)
    array([[ 76.25, 125.25,  93.75, 201.75],
           [111.5 , 146.5 ,  89.5 , 170.75],
           [167.  ,  46.25, 105.75, 131.25],
           [138.75, 139.5 , 195.25,  55.5 ]], dtype=float32)
    >>> (168+234+142+42)/4
    146.5
    

    据我了解,您只计算原始图像的线性亮度(l),然后依次降低分辨率(如果我错了,请纠正我)。

    您可以使用查找表 (LUT) 加速线性亮度计算,因为如果您的图像是 8 位 (8U),则最多只有 256 个不同的像素值。

    【讨论】:

    • 这是个好主意,但请记住,在较小的图像中,像素值是按四个像素块中该值的平均值计算的(因为每一步两个维度都会减半)。那么我怎样才能快速计算出这个平均值,因为它取决于像素的位置?
    • @jippyjoe4 线性插值将计算平均值。我添加了一个示例。
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2020-11-24
    • 2017-07-04
    • 1970-01-01
    相关资源
    最近更新 更多