用OpenCV和Numpy在Python中实现全局对比度

2024-09-29 19:26:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用Numpy和OpenCV在Python中实现Krešimir Matkovic、LászlóNeumann、Attila Neumann、Thomas Psik和Werner Purgathofer的论文《全局对比度因子-图像对比度的新方法》中详细介绍的过程。然而,有一步我正在努力。你知道吗

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

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

enter image description here

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

我的问题是,我不知道如何有效地缩小图像,使其像素值的计算方式与这些公式相对应。OpenCV已经有了一些内置的调整大小算法,但我真的不确定哪种算法(如果有的话)会提供与本文中详细介绍的类似的结果。你知道吗

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


Tags: 图像numpy算法过程像素opencv灰度公式
1条回答
网友
1楼 · 发布于 2024-09-29 19:26:19

OpenCVresize不执行这些操作。必须显式计算图像中每个像素的线性亮度值,然后使用线性插值(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个不同的像素值。你知道吗

相关问题 更多 >

    热门问题