Gem_isp_eris.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // =============================================================================
  2. // File : Gem_isp_iris.h
  3. // Version : v1.0
  4. // Author : Honglei Zhu
  5. // Date : 2014.12.5
  6. // -----------------------------------------------------------------------------
  7. // Description :
  8. //
  9. // -----------------------------------------------------------------------------
  10. #ifndef __GEM_ISP_ERIS_HEADFILE__
  11. #define __GEM_ISP_ERIS_HEADFILE__
  12. #include "Gem_isp_ae.h"
  13. #define GEM_ERIS_BASE (0x110)
  14. #define GEM_LUT_BASE (0x1a0)
  15. #define GEM_ERIS_HIST_BASE (0x6f*4)
  16. #define GEM_ERIS_INFO_BASE (0x9b*4)
  17. typedef struct isp_eris_
  18. {
  19. unsigned short enable;
  20. unsigned short manual; // 1 手动模式 0 自动模式
  21. unsigned short dfsEris; // 1bit, 缺省为0
  22. // dfsEris = 0, resolt使用由"表项索引"="resoli^spacev"查表(指数表)得到的定值表(每个表项都使用同一个值),
  23. // "表项索引"越大, eris拉伸的强度越大, 画面直方图向左边挤压, 画面高光处的细节基本不变, 画面低光处的细节逐渐丢失.
  24. // 随着拉伸的强度越大, 画面偏色的情况逐步增加(紫绿条纹增加)
  25. //
  26. // dfsEris = 1, resolt使用由外部提供的拉伸系数表resolt, 共33项. 此时不再使用上面的"表项索引".
  27. // 拉伸系数表resolt描述了基于亮度的系数表( 0, 8, 16, ..., 248, 255 )
  28. // 这样, 可以定制不同场景下的拉伸系数表, 根据场景对低光区/高光区/其他区配置不同的拉伸系数(拉伸强度)
  29. // 以上获得的拉伸系数再查一个指数表, 得到拉伸强度系数
  30. //
  31. // *** 以下2种不同设置得到的eris效果完全一致 **********
  32. //
  33. // 设置1 dfsEris = 0, resoli = 230, spacev = 0
  34. // 设置2 dfsEris = 1, resolt的每个表项均为230
  35. //
  36. // ******************************************************
  37. unsigned short varEris; // 2bit, 选择权重系数不同的高斯表(4个表)
  38. // 选择不同的高斯表, 比较差异最大的选项0及选项3的图像效果, 图像效果变化非常轻微.
  39. // 使用imatest分析不同高斯表选项的sfrplus测试图像,
  40. // 1) 比较解析度, 选项3的MTF50值(1547 LW/PH)大于选项0的MTF50值(1515 LW/PH),
  41. // 2) 比较色差 chrom aber, 选项3的值也小于选项0的值.
  42. // 缺省选择选项 3. (相比选项0, 锐度稍微有点提升, 主观上(视觉)基本无法感知差异.)
  43. unsigned short resols; // 已废弃
  44. unsigned short resoli; // dfsEris = 0下的索引项值 = "resoli^spacev"
  45. unsigned short spacev;
  46. unsigned short target; // lum target value (default 128), 0 ~ 255
  47. // 超出255时, 取低字节. 即(256) == (0)
  48. // target增加时(最大255), 画面的平均亮度增加, 画面的动态范围基本不变(高光处及低光处细节基本不变).
  49. unsigned short black; // minium black level(0-4095)
  50. // 黑电平增加会减少低光处的细节, 保留高光处的细节, 缩小画面的动态范围, 提升画面的对比度
  51. // black值减小, 直方图逐步向右移动, 暗部细节增加, 整体亮度增加, 高光处细节会保留. 对比度降低
  52. // black值增加, 直方图逐步向左移动, 暗部细节减少, 整体亮度降低, 高光处细节会保留. 对比度提升
  53. unsigned short white; // maxium white level(0-4095)
  54. // 10bit sensor, 超出1023会压缩画面的动态范围
  55. // 超出4095等同4095.
  56. // 较小的white设置会导致画面的动态范围缩小
  57. // 如蓝天/白云的场景, 蓝天会随着参数的减小变为白色而使画面整体动态范围降低.
  58. // white值减小, 直方图向右移动. 暗部细节增加, 整体亮度增加, 高光处细节会丢失.
  59. // white值增加, 直方图向左移动. 暗部细节减少, 整体亮度降低, 高光处细节会保留.
  60. //
  61. // 夜晚环境下, white值较大时, 光晕现象较弱. white值较小时, 光晕现象较强.
  62. //
  63. // 场景的环境光强度较小时, 应减小white值.(夜晚, 环境光较弱, 曝光时间较长)
  64. // 场景的环境光强度较大时, 应增加white值.(白天, 环境光较强, 曝光时间较短)
  65. //
  66. // AR0330的white需要设置到3700以上才能很好的保护高光区不溢出,
  67. // 这与AR0330的12bit数据宽度有关(最大值4095).
  68. //
  69. // PS1210的white只需要设置到1023左右,就可以很好的保护高光区不溢出,
  70. // 这与PS1210的10bit数据宽度有关.
  71. //
  72. // 曝光时间较短时,应增加white值,
  73. // 1) 压缩低光区,直方图向左移动. 抑制低光区可能因为曝光时间不够而引起的色斑或紫绿条纹.
  74. // 2) 高光区向左移动,防止拉伸后更多高光区溢出的问题
  75. //
  76. // 夜晚场景下, 减少white值可以极大地增加场景的亮度.(white < 128)
  77. // 通过自适应调节white值, 可以将场景的亮度维持在某个范围之内(通过监控二次曝光的信息).
  78. unsigned short gain_max; // Eris max gain (0-1023)
  79. unsigned short gain_min; // Eris min gain (0-1023)
  80. // gain主要受到gain_max的影响, gain_min的影响很小. (gain_min增加时, 图像效果轻微降低, 人眼基本无法观察)
  81. // gain_max参数增大时, 整体亮度值增加. 直方图向右移动.(类似曝光补偿增加)
  82. // gain_max参数可以微调.
  83. // gain_max, gain_min基本不影响画面的动态范围.
  84. // (如蓝天/白云的场景, 蓝天不会随着参数的增加变为白色而使画面整体动态范围降低 )
  85. //
  86. // ? 值超出1023时, 画面亮度会出现翻转. (此处应确认是否需要保护)
  87. // 已通过ISP脚本确认, (1024) = (0), (1025) = (1), 以此类推
  88. //
  89. // 1) 过曝时应该降低gain的设置
  90. // 256 --> 64 (1654ID10.RAW)
  91. unsigned short cont_max; //
  92. unsigned short cont_min; // Eris min cont (0 - 1024)
  93. // 超出1024(16*64)等于1024.
  94. // 实际存在2个区域,
  95. // 区域1 (0 ~ 64), 参数变化时,ISP效果变化明显, 不适合微调。
  96. // 区域2 (65 ~ 1024),参数变化时,ISP效果变化缓慢, 适合微调。
  97. // 实际中使用区域2
  98. //
  99. // ISP Eris的对比度设置仅与Cont_min有关, 与Cont_max无关.
  100. // 使用自动模式时, 当设置(Cont_max, Cont_min)为(4*64, 4*64), (10*64, 4*64), (64*64, 4*64)时, ISP的效果完全一致.
  101. // Cont_min越小, 画面平均亮度越大, 画面对比度也越大, 动态范围也越大.
  102. // Cont_min增加时, 画面对比度减小, 动态范围减小.
  103. // 随Cont_min的参数变化,ISP画面效果变化明显.
  104. // 比如, 从(12,1)到(12,2), (12,3), (12,4), Cont_min每一阶梯(单位为1)的效果变化非常明显, 不利于参数微调.
  105. // (最好将参数灵敏度降低16倍)
  106. // 20160622 ISP新版本已修改, 灵敏度降低64倍, 可以微调效果.
  107. // 调控
  108. // 明亮场景下, Cont_min应该变小, 提升场景的对比度及动态范围, 保留更多的细节.
  109. // 阴暗场景下, Cont_max应该变大, 降低场景的对比度及动态范围, 抑制噪声与色差.
  110. // 直方图的暗部比例过大时, 应该降低对比度, 抑制暗部的噪声及拉伸引起的色差(紫绿纹).
  111. //
  112. unsigned short gain_man; // 手动模式下增益及对比度的设置参数 (0-1023)
  113. unsigned short cont_man;
  114. unsigned char resolt[33]; // 表项最大取值为255
  115. // 场景的环境光强度较小时, 应减小resolt[0], resolt[1]这2个表项的值(控制0 ~ 8 ~ 15之间的线性插值),
  116. // 减弱低光区拉伸后出现的色差(比如夜晚的天空拉伸后偏红, 将resolt[0], resolt[1]置为0可减弱该现象).
  117. // 极端情况下为0. 降低拉伸的强度, 减少暗处拉伸的噪音.
  118. // 拉伸的强度越大(表项值越大), 对比度越大, 但是低光处(暗处)会容易出现块状的紫/绿/蓝色斑点.
  119. // 拉伸的强度越小(表项值为0), 对比度最低(画面缺少层次感), 此时低光处(暗处)不容易出现块状的紫/绿/蓝色斑点.
  120. //
  121. // 表项值的变化不会影响画面的动态范围.
  122. unsigned short colort[33]; // 表项最大取值为4095 (12bit)
  123. // 值越大, 颜色的饱和度越高, 色彩越鲜艳.
  124. // 低光处(暗处)越容易出现块状的紫/绿/蓝色斑点. 表项索引越小,表项值应越小,避免色斑现象。
  125. // 表项值较大时,高光处容易出现偏色现象,表项索引越大,表项值应越小,降低偏色程度。
  126. // 实际的颜色表是一个2边小中间大的分布。
  127. // 表项的值一般不要超过512。
  128. // 20160627
  129. // 加入ERIS直方图统计
  130. unsigned char eris_hist_thresh[4]; // ERIS亮度直方图的4个阈值(每个阈值的取值范围为0~255)
  131. // bit0~7对应01区间, bit8~15对应12区间, bit16~23对应23区间, bit24~31对应34区间
  132. unsigned int eris_hist_statics[5]; // (只读信息) 5段ERIS亮度直方图的统计点像素个数,
  133. unsigned int eris_yavg; // (只读信息) ERIS亮度统计值, 需除以总像素点数, 得到平均亮度值
  134. } isp_eris_t;
  135. typedef struct isp_eris_ *isp_eris_ptr_t;
  136. void isp_eris_init (isp_eris_ptr_t p_iris);
  137. void isp_eris_init_io (isp_eris_ptr_t p_iris);
  138. void isp_eris_run (isp_eris_ptr_t p_iris ,isp_ae_ptr_t p_ae);
  139. #endif // #ifndef __GEM_ISP_ERIS_HEADFILE__