Appearance
计算视觉
以固定机位,遥控进行风光摄影为标准
raw 数据导出
- 原生数据: Bayer12(实际格式可能为 uint16), height x width x depth
- 矫正数据
- debayer
- 调整增益
- 调整白平衡?
- 画面增强
- 调整对比度
- 彩色增强
- 去雾
3A 算法
指ISP流水线中的三种关键算法,自动对焦、自动曝光、自动白平衡
Auto Focus
自动对焦算法,算法相关内容很多,目前视觉类对焦主要是反差对焦,计算对比度。可惜目前没法控制自动对焦。因此暂不填充内容
Auto Exposure
Auto Exposure即自动曝光,是相机根据外界光线的强弱自动调整曝光量和增益,防止曝光过度或者不足的一种机制
曝光三角形中包含光圈、曝光时间、ISO。在常见的情况下,光圈固定,仅需要考虑日间快门时间和夜间ISO。但如何界定图像是否曝光合适仍需要进行计算,如果仅以不过曝为标准,则画面整体偏暗
需要参照AE算法,配置高光不过曝优先,同时考虑WDR场景。目前对焦算法存在问题,需要近百帧来完成对焦
Auto White Balance
自动白平衡,由于人眼有颜色恒常性,将物体的颜色自动校准为真实的颜色。因此需要对画面做白平衡校准(其实还有色彩校准,先白平衡调整色温)
有非常多种调整白平衡的算法,但是基本基于某些理想假设,需要根据实际情况镜像考虑
感觉目前可以不做处理,不需要单独考虑成像接近人眼
图像降噪
曝光融合
将不同曝光的照片融合为单张信息密度高的照片。需要选择一个能选取最合适像素的算法,Mertens就是一个效果很好的办法。但是合成非常消耗性能,22张20MP16位的raw文件需要使用16G以上的内存大小
可以考虑通过直接合并为debayer的图像、分组合并或分块合并的办法来降低内存消耗
图像矫正操作
python 二次处理需要使用 numpy 加速,否则处理时长可能大于 1 分钟
暗通道先验的去雾算法
感觉信息量损失有点大,天空范围比较大的图片大小只有三分之一了。需要研究如何配置自适应控制
python
"""画质损失非常高"""
def zmMinFilterGray(src, r=7):
'''最小值滤波,r是滤波器半径'''
return cv2.erode(src, np.ones((2*r+1, 2*r+1)))
def guidedfilter(I, p, r, eps):
height, width = I.shape
m_I = cv2.boxFilter(I, -1, (r, r))
m_p = cv2.boxFilter(p, -1, (r, r))
m_Ip = cv2.boxFilter(I*p, -1, (r, r))
cov_Ip = m_Ip-m_I*m_p
m_II = cv2.boxFilter(I*I, -1, (r, r))
var_I = m_II-m_I*m_I
a = cov_Ip/(var_I+eps)
b = m_p-a*m_I
m_a = cv2.boxFilter(a, -1, (r, r))
m_b = cv2.boxFilter(b, -1, (r, r))
return m_a*I+m_b
def Defog(m, r, eps, w, maxV1):
'''计算大气遮罩图像V1和光照值A, V1 = 1-t/A'''
V1 = np.min(m, 2)
Dark_Channel = zmMinFilterGray(V1, 7)
V1 = guidedfilter(V1, Dark_Channel, r, eps)
bins = 2000
ht = np.histogram(V1, bins)
d = np.cumsum(ht[0])/float(V1.size)
for lmax in range(bins-1, 0, -1):
if d[lmax]<=0.999:
break
A = np.mean(m, 2)[V1>=ht[1][lmax]].max()
V1 = np.minimum(V1*w, maxV1)
return V1, A
def deHaze(m, r=16, eps=0.001, w=0.95, maxV1=0.80):
Y = np.zeros(m.shape)
Mask_img, A = Defog(m, r, eps, w, maxV1)
for k in range(3):
Y[:,:,k] = (m[:,:,k]-Mask_img)/(1-Mask_img/A)
Y = np.clip(Y, 0, 1)
return Y
对数矫正
实测有点太极端了,很容易拉爆。注意变换后需要进行二次缩放填充色彩空间
可以拉伸范围较窄的低灰度值,同时压缩范围较宽的高灰度值。可以用来扩展图像中的暗像素值,同时压缩亮像素值
简而言之是对图像中低灰度细节进行增强
python
s = c*log(1+r)
c 为常数,0 <= 输入 r <=1
Gamma 校正
非常传统的算法,如果自动调整系数的话效果感觉比较好
该函数多用在图像整体偏暗,扩展灰度级。另外一种情况是,图像有“冲淡”的外观(很亮白)需要压缩中高以下的大部分的灰度级
简而言之是整体灰度值进行改变
python
s = c*r ** y
c 为常数,0 <= c <= 1,指数 y 大于 1 时为 gamma 拓展,小于 1 时为 gamma 压缩