计算图像的动态范围?

时间:2013-01-10 14:16:04

标签: algorithm matlab image-processing opencv computer-vision

如何使用Opencv计算图像的动态范围?良好动态范围的价值是多少?如何使用opencv计算它?

3 个答案:

答案 0 :(得分:2)

图像的动态范围是最大和最小亮度值之差的log2(以EV表示);考虑到图像是用线性响应模型编码的。

使用OpenCV,您可以访问图像的像素值,因此请迭代并应用公式。

答案 1 :(得分:0)

动态范围为 20*log(maxv / minv),其中 maxv 和 minv 是图像的最大和最小像素值。这不要与信息内容或信噪比混淆,后者测量信号(最大值-最小值)除以本底噪声的比率。

#include <math.h>
#include <opencv\highgui.h>
#include <opencv\cv.h>
#include <opencv\cxcore.h>

// Place your grayscale image with unsigned integer pixel values in img:
Mat img; 
double minVal; 
double maxVal; 
Point minLoc; 
Point maxLoc;

minMaxLoc( img, &minVal, &maxVal, &minLoc, &maxLoc );

dr = 20*log10(maxVal/(1+minVal)) 

答案 2 :(得分:0)

我创建了一个函数,它返回作为参数传递的给定图像路径的计算动态范围列表。我已经计算了动态范围,如:

  • 获取像素的RGB信息
  • 计算亮度
  • 获取给定照片亮度的最大值和最小值
  • 应用动态范围计算公式

代码如下:

def dinamic_range(list_of_images):
    
    dinamic_range = []

    for img in list_of_images:
        image = cv2.imread(img, cv2.IMREAD_COLOR)
        pixel_brightness = []
        for x in range (1,480):
            for y in range (1,640):
                try:
                    pixel = image[x,y]
                    R, G, B = pixel
                    brightness = sum([R,G,B])/3
                    pixel_brightness.append(brightness)
                except IndexError:
                    pass
        din_range = round(np.log2(max(pixel_brightness))-np.log2(min((pixel_brightness))), 2)
        dinamic_range.append(din_range)
        print('The image', img, 'has a dinamic range of', din_range, 'EV')

    return dinamic_range