计算图像的动态范围



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

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

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

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

#include <math.h>
#include <opencvhighgui.h>
#include <opencvcv.h>
#include <opencvcxcore.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)) 

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

  • 获取像素的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

相关内容

  • 没有找到相关文章

最新更新