使用OpenCV和Numpy在Python中实现“全局对比度因子”

时间:2019-01-07 03:03:30

标签: python image numpy opencv

我想用Python实现KrešimirMatkovic,LászlóNeumann,Attila Neumann,Thomas Psik和Werner Purgathofer撰写的论文 Global Contrast Factor-一种新的图像对比度方法中详细介绍的过程。 Numpy和OpenCV。但是,我正在努力的一步。

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

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

enter image description here

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

我的问题是我不确定如何有效地按比例缩小图像,以便以与那些公式相对应的方式计算其像素值。 OpenCV已经内置了一些调整大小的算法,但是老实说,我不确定哪一种算法可以提供与本文详细介绍的结果类似的结果。

如何通过这些公式确定较小图像中像素值的灰度图像的大小?

1 个答案:

答案 0 :(得分:0)

OpenCV resize不执行这些操作。您将必须显式计算图像中每个像素的线性亮度值,然后将resize应用于线性插值(INTER_LINEAR)。线性插值将计算平均值。请参见以下示例。计算不重叠的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个不同的像素值。