Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据EV值调整原始图像的曝光_Python_Image Processing_Autoexposurecompensation - Fatal编程技术网

Python 根据EV值调整原始图像的曝光

Python 根据EV值调整原始图像的曝光,python,image-processing,autoexposurecompensation,Python,Image Processing,Autoexposurecompensation,我正在尝试编写一个程序,它接收一个满是12位原始传感器值(范围从[512-4096])(512是拜耳传感器黑电平-->即纯黑色的定义)的矩阵,并调整每个像素的EV,特别是像Adobe Camera RAW(ACR)“曝光”滑块一样。我想知道基本上是怎么做的。我查阅了几十篇解释电动汽车计算方法的博客,似乎是: 似乎给出了公式:PixelAdjusted=Pixel*2^EV 这似乎是非常错误的,因为5电动汽车的调整会使画面偏离比例。。我在网上找不到任何其他资源。维基百科上有一个很好的条目,但它似乎

我正在尝试编写一个程序,它接收一个满是12位原始传感器值(范围从[512-4096])(512是拜耳传感器黑电平-->即纯黑色的定义)的矩阵,并调整每个像素的EV,特别是像Adobe Camera RAW(ACR)“曝光”滑块一样。我想知道基本上是怎么做的。我查阅了几十篇解释电动汽车计算方法的博客,似乎是:

似乎给出了公式:PixelAdjusted=Pixel*2^EV

这似乎是非常错误的,因为5电动汽车的调整会使画面偏离比例。。我在网上找不到任何其他资源。维基百科上有一个很好的条目,但它似乎也没有我想要的。。。有什么帮助吗

谢谢

以下是我的意思的一个例子:

ACR中EV为0的原始文件:

对于EV 5:

我现在有这个公式:

black_level = 512
bit_depth = 2**12
normalized = max((raw_pixel - black_level),0) / (bit_depth) ## normalize to [0,1]
exposed = normalized * (2**EV)    ## expose by desired EV value

## scale back to normal level:
raw_pixel_new = exposed * bit_depth  
但这在任何不是5的EV值上都失败,因此公式不正确。我也知道这个公式是错误的,因为如果
EV=0
,它就不起作用。我找到了几十个网站,解释这个公式只是
new\u pixel=pixel*2^曝光
,但这似乎不适用于原始照片。。。我错过什么了吗

有什么想法吗

下面是我用来测试的一些python代码和一些文件: 代码: 图像:


出于某种原因,我花了14个小时在这上面。。。我不知道我做错了什么,因为我不能让它一直工作(与多个电动汽车),总是有一个绿色或品红色调。我认为这是一张原始照片的事实破坏了绿色通道…

假设你从原始图像开始,你在一个线性空间中。在这种情况下,改变曝光是一种乘法运算

将曝光值(EV)增加1相当于曝光量增加一倍。曝光是到达每个像素的光量的线性度量。曝光倍增,光量倍增。因为在摄影中,人们通常以当前曝光的分数来考虑,所以谈论“增加1倍EV”,而不是“增加2倍曝光”是有意义的

因此,实际上,要将曝光值增加n,将像素值乘以2n

如果输入图像是JPEG或TIFF文件,则它可能位于sRGB颜色空间中。这是一个非线性颜色空间,旨在增加8位图像文件的外观范围。在修改曝光之前,必须先将sRGB转换为线性RGB。这可以通过将每个像素值提高到2.2的幂来大致实现


OP中的问题是由不精确的黑电平引起的
raw.black\u level\u per\u channel
为给定图像返回528(每个通道的值相同,但我猜其他相机型号不一定如此),而不是512。此外,代码将
raw.raw\u image\u visible
写回
raw.raw\u image
,这是不正确的

以下代码生成正确的结果:

import rawpy
import numpy as np
from PIL import Image

bit_depth = 12
exposure = 5

path = "/001_ev0.DNG"
raw = rawpy.imread(path)
black_level = raw.black_level_per_channel[0] # assume they're all the same

im = raw.raw_image
im = np.maximum(im, black_level) - black_level # changed order of computation
im *= 2**exposure
im = im + black_level
im = np.minimum(im, 2**12 - 1)
raw.raw_image[:,:] = im
im = raw.postprocess(use_camera_wb=True, no_auto_bright=True)
img = Image.fromarray(im, 'RGB')
img.show()

似乎没有给我与Adobe Camera Raw相同的结果,我甚至尝试将RGB值乘以
2**p
,但仍然不起作用。根据inspector,我已经在RGB空间中工作,但文件是原始的,所以像素值实际上是拜耳传感器values@QuantumHoneybees:参见编辑后的答案。但是你可能需要计算原始数据的曝光值来知道增加多少。所以我尝试了这个方法,但由于以下原因它不起作用:我的原始图片数据是一个12位的数据,黑色级别为512,这意味着每个传感器都有一个值[5124095],512表示无光,4095表示最大光。现在,例如,如果我想添加
+5ev
,我将增加一个值为
1500
的像素:
1500*2^5=48000
,这远远超过了4095的最大值。那么这个公式到底是如何工作的呢?@QuantumHoneybees:将EV增加5相当于将F-stop增加5,或者将曝光时间乘以32。如果你从一张正确曝光的照片开始,如果你这样做,它就会爆炸。
import rawpy
import numpy as np
from PIL import Image

bit_depth = 12
exposure = 5

path = "/001_ev0.DNG"
raw = rawpy.imread(path)
black_level = raw.black_level_per_channel[0] # assume they're all the same

im = raw.raw_image
im = np.maximum(im, black_level) - black_level # changed order of computation
im *= 2**exposure
im = im + black_level
im = np.minimum(im, 2**12 - 1)
raw.raw_image[:,:] = im
im = raw.postprocess(use_camera_wb=True, no_auto_bright=True)
img = Image.fromarray(im, 'RGB')
img.show()