3x3的CCM矩阵如何标定?CCM矩阵色彩校正方法|焦点播报
CCM 标定的原理是,使用 sensor 抓拍到的 24 色卡场景下前 18 个色块的实际颜色信息和其期望值,计算 3x3 的 CCM 矩阵。输入颜色经 CCM 矩阵处理得到的颜色与其期望值差距越小,则 CCM 矩阵就越理想。
(资料图片)
海思CCM矩阵:8bit 小数精度。bit 15是符号位,0 表示正数,1表示负数。典型的三组 CCM 为D50,TL84,A 三个光源下的 CCM。典型的五组 CCM为 10K,D65,D50,TL84,A 五个光源下的CCM。优先红、绿、蓝纯色;然后肤色块
采集步骤:(1)标准 X-Rite 24 色卡,照度为 600Lux 均匀光源;(2)调整 AE 目标亮度,最亮灰阶(Block 19)的 G 分量亮度在饱和值的 0.8 倍左右
手动调试CCM步骤:
(1)优先确认颜色问题是由于AWB模块引入还是CCM引入
(2)过灯箱客观指标,确认是否需要重新标定
(3)最后再考虑手动调整CCM
a.一般都是针对单一颜色进行微调整(比如车牌天蓝,想要深蓝;人脸偏红或是偏黄绿),所以单一颜色都会有个当前RGB值,想要调整的目标RGB值,其实调整CCM的目的就是通过CCM使得当前RGB值趋于目标RGB值
b.针对a所述,调整RGB值,调整R:a00、a01、a02(RinR、GinR、BinR);调整G:a10、a11、a12(RinG、GinG、BinG);调整B:a20、a21、a22(RinB、GinB、BinB)。
CCM矩阵色彩校正的方法_一只特立独行的zhu..-CSDN博客_ccm调试
WDR模式下标定CCM,CCM 容易受到 DRC 的影响,容易造成颜色难以矫正:
(1)曝光比手动最大,同时也要调整亮度值,避免长帧过曝,采集长帧的 RAW 数据进行 CCM 的标定。标定过程中可以适当的降低饱和度,不能选择开启 autoGain 功能。
(2)适当减少 DRC 曲线对图像亮度的大幅度提升,这样 DRC 对颜色的改变会较弱。此时,图像的亮度会有所降低达不到想要的亮度,这时,可以用 gamma 对亮度进行适当的提升。这样联调 DRC 和 gamma 模块,可以让整体的颜色调节更准确一些。
(3)对于 WDR 模式,因为大多场景是混合光源场景,容易出现亮处颜色偏色,人脸颜色偏红等问题,除了可以降低饱和度值以外,还可以使用 CA 模块对这些区域适当的降低饱和度。
反gamma后图像和gamma 1.0存在些许差异:
(1)CSC模块
CCM模块代码:
https://github.com/WaterdropsKun/isppipeline_Python/tree/main/lecture14
Python实现ISP pipeline代码:
GitHub - WaterdropsKun/isppipeline_Python: isppipeline_Python
如有帮助,希望帮忙github帮忙点个star
def degamma_hisi(data, clip_range, gamma_txt): # gamma degamma hisi_gamma_x = 1024-1 hisi_gamma_y = 4096-1 hisi_degamma_x = 256-1 hisi_degamma_y = 1.0 gamma_hisi_x1023_y4095 = [] degamma_x255_y1 = [] with open(gamma_txt, "r") as f: for i, line in enumerate(f.readlines()): line = line.split(",") gamma_hisi_x1023_y4095 = [float(x) for x in line] # for j, value in enumerate(line): # print(j, value) # x = np.arange(0, 1024+1, 1) # np.arange(start, end+step, step) [start, end] end/step+1 # plt.plot(x, gamma_hisi_x1023_y4095) # plt.show() for i in range(hisi_degamma_x+1): # for i in range(0, hisi_degamma_x+1, 1): for j, value in enumerate(gamma_hisi_x1023_y4095): if (value / hisi_gamma_y * hisi_degamma_x) >= i: degamma_x255_y1.append(j/hisi_gamma_x) break # x = np.arange(0, hisi_degamma_x+1, 1) # plt.plot(x, degamma_x255_y1) # plt.show() # degamma data = np.clip(data, clip_range[0], clip_range[1]) data = np.divide(data, clip_range[1]) height = data.shape[0] weight = data.shape[1] channels = data.shape[2] for row in range(height): # 遍历高 for col in range(weight): # 遍历宽 pv0 = data[row, col, 0] pv1 = data[row, col, 1] pv2 = data[row, col, 2] data[row, col, 0] = degamma_x255_y1[int(pv0*255)] data[row, col, 1] = degamma_x255_y1[int(pv1*255)] data[row, col, 2] = degamma_x255_y1[int(pv2*255)] data_show = data.copy() data_show = np.clip(data_show * clip_range[1], clip_range[0], clip_range[1]) # gbr = rgb[...,[2,0,1]] # data_show = data_show[..., ::-1] data_show = data_show[..., [2,1,0]] cv2.imshow("data", data_show.astype(np.uint8)) cv2.waitKey(0) return np.clip(data * clip_range[1], clip_range[0], clip_range[1])def gamma_hisi(data, clip_range, gamma_txt): # gamma degamma hisi_gamma_x = 1024-1 hisi_gamma_y = 4096-1 hisi_degamma_x = 256-1 hisi_degamma_y = 1.0 gamma_hisi_x1023_y4095 = [] degamma_x255_y1 = [] with open(gamma_txt, "r") as f: for i, line in enumerate(f.readlines()): line = line.split(",") gamma_hisi_x1023_y4095 = [float(x) for x in line] # for j, value in enumerate(line): # print(j, value) # x = np.arange(0, 1024+1, 1) # np.arange(start, end+step, step) [start, end] end/step+1 # plt.plot(x, gamma_hisi_x1023_y4095) # plt.show() for i in range(hisi_degamma_x+1): # for i in range(0, hisi_degamma_x+1, 1): for j, value in enumerate(gamma_hisi_x1023_y4095): if (value / hisi_gamma_y * hisi_degamma_x) >= i: degamma_x255_y1.append(j/hisi_gamma_x) break # x = np.arange(0, hisi_degamma_x+1, 1) # plt.plot(x, degamma_x255_y1) # plt.show() # gamma data = np.clip(data, clip_range[0], clip_range[1]) data = np.divide(data, clip_range[1]) height = data.shape[0] weight = data.shape[1] channels = data.shape[2] for row in range(height): # 遍历高 for col in range(weight): # 遍历宽 pv0 = data[row, col, 0] pv1 = data[row, col, 1] pv2 = data[row, col, 2] data[row, col, 0] = gamma_hisi_x1023_y4095[int(pv0*1023)] / 4095.0 data[row, col, 1] = gamma_hisi_x1023_y4095[int(pv1*1023)] / 4095.0 data[row, col, 2] = gamma_hisi_x1023_y4095[int(pv2*1023)] / 4095.0 data_show = data.copy() data_show = np.clip(data_show * clip_range[1], clip_range[0], clip_range[1]) # gbr = rgb[...,[2,0,1]] # data_show = data_show[..., ::-1] data_show = data_show[..., [2,1,0]] cv2.imshow("data", data_show.astype(np.uint8)) cv2.waitKey(0) return np.clip(data * clip_range[1], clip_range[0], clip_range[1])def CCM_convert(data, CCM, color_space="srgb", clip_range=[0, 255]): # CCM工作在线性RGB因此需要先进行degamma if (color_space == "srgb"): data = color.degamma_srgb(data, clip_range) data = np.float32(data) data = np.divide(data, clip_range[1]) # 归一化 elif (color_space == "hisi"): data = degamma_hisi(data, clip_range, "./gamma_hisi_int.txt") data = np.float32(data) data = np.divide(data, clip_range[1]) # 归一化 # matrix multiplication output = np.empty(np.shape(data), dtype=np.float32) output[:, :, 0] = data[:, :, 0] * CCM[0,0] + data[:, :, 1] * CCM[0,1] + data[:, :, 2] * CCM[0,2] output[:, :, 1] = data[:, :, 0] * CCM[1,0] + data[:, :, 1] * CCM[1,1] + data[:, :, 2] * CCM[1,2] output[:, :, 2] = data[:, :, 0] * CCM[2,0] + data[:, :, 1] * CCM[2,1] + data[:, :, 2] * CCM[2,2] # gamma if (color_space == "srgb"): output = output*clip_range[1] output = color.gamma_srgb(output, clip_range) elif (color_space == "hisi"): output = output*clip_range[1] output = gamma_hisi(output, clip_range, "./gamma_hisi_int.txt") return outputif __name__ == "__main__": # CCM = np.array([ # [1.507812, -0.546875, 0.039062], # [-0.226562, 1.085938, 0.140625], # [-0.062500, -0.648438, 1.718750], # ]) CCM = np.array([ [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0], ]) maxvalue = 255 # image = plt.imread("kodim19.png") image = plt.imread("test02.png") if (np.max(image) <= 1): image = image * maxvalue new_image = CCM_convert(image, CCM, color_space="hisi", clip_range=[0, maxvalue]) color.rgb_show(image / 255) color.rgb_show(new_image / 255)
标签:
相关推荐:
最新新闻:
- d盘打不开怎么办? b盘打不开解决方法
- 电磁调速电机是什么原理?电磁调速电机常见故障分析
- 3x3的CCM矩阵如何标定?CCM矩阵色彩校正方法|焦点播报
- 如何理解KMT字符串匹配算法?如何计算出KMT数组?
- 焦点日报:PriorityQueue(优先队列)是堆还是最小?PriorityQueue详解
- 范氏之间的关系基础知识(一)
- 天天热门:NCBI-BLAST在线使用教程详细攻略(图解)
- 次世代游戏道具制作:高低模匹配烘焙法线的加速技巧
- 环球快报:进位标志位中的数值被丢弃?汇编SHL指令和SHR指令
- SCI论文怎么分区?SCI论文分区有两种方法
- 全球信息:【RL】算法简介与实现 Value-Based-Learning算法
- 如何给U盘设置密码?U盘设置密码的方法步骤|环球速看
- 电阻的单位是什么?SMT贴片电阻510R与510K的区别在哪?
- 环球看热讯:【企业版】Mule3的新增特点-云连接
- 天天观焦点:对数的计算公式是什么?对数的计算公式性质及推导过程
- 环球速读:如何使用using声明防止命名冲突?命令空间的using声明
- 天天即时看!社交是什么?看懂这6条社交潜规则
- python中rb是什么意思?Python文件读写的几种模式
- 当前视点!戴尔XPS15/17笔记本2023款发布:搭载13代酷睿+40系显卡
- 对标比亚迪唐,领克大5座SUV领克08来了,或搭载魅族Flyme Auto车机
- 如何实现百度云盘会员下载大文件?实现百度云盘文件高速下载的方法_环球快播
- 环球快播:什么是领域?输入流和输出流应该作为设计对象看待吗?
- 世界微动态丨《爆衣战士 零》Steam页面上线 支持简繁体中文
- 打赢了!科比坠机照片泄露案其遗孀获赔2885万美元
- 报道:iPhone16Pro有望采用屏下面容 2026年用上屏下摄像头
- 微美全息开发基于图像处理的动态手势交互系统:全球热点评
- 环球观速讯丨努比亚发布裸眼3D平板电脑
- 努比亚Z50 Ultra影像参数公布:35mm+85mm最佳拍档_天天聚看点
- 新华三集团亮相CHINC,以数字技术助力智慧医院高质量发展-百事通
- 新华三:以融合网络技术支撑智慧医院全场景业务数字变革 今热点
- 全球规模最大锂资源采选冶一体化项目在新疆和田启动_今日观点
- 《守望先锋2》匹配机制糟糕 开发者回应
- 停售6年的PS3再次获得固件更新 提高了系统性能_天天热门
- SOC射击新游《The Front》登陆Steam 预告片首曝
- 《最终幻想16》将不会有多个难度选项 新游戏+包含新战斗-每日精选
- Windows 11发布更新 iPhone也能连接PC了_天天日报
- 热点聚焦:融合创新,领军2023!鸿合科技联手合作伙伴加速推进幼教数字化
- 首发2399元!vivo S16新配色“春日悠蓝”今天正式预售_天天热文
- 世界快看:ChatGPT赋能?微软或将人工智能引入Windows 11
- 天天热资讯!VMware在MWC 2023发布创新成果,帮助扩展电信运营商和企业的5G能力
- 全球快资讯:iPhone SE 4今年发布:6.1英寸全面屏 京东方提供
- 国风城镇叠叠乐 《重檐》Steam页面上线
- 全球消息!新疆队宣布退出CBA联赛捐献全部资产 周琦做出回应
- 房东纠纷 英国国家电子游戏博物馆团队被锁在门外|新要闻
- 新动态:《最终幻想16》试玩版将于发售前两周推出 支持存档继承
- 【新要闻】北欧游戏展被员工指控 调查结果:或违反《反歧视法》
- SteamDeck二月热门游戏 《霍格沃兹之遗》登顶_每日快讯
- crampfish_世界看点
- 国产动作游戏《斩妖行2》开发中 沙漠截图欣赏-快消息
- 环球新动态:三星980 PRO固态硬盘大促:1TB 649元
- 石家庄一快餐店推2万元豪华板面:与宣传不符可举报 环球热门
- 《最终幻想16》制作人:请别说“我不买PS5版 PC版还有半年就出”-天天看热讯
- 路由器的核心功能是什么?推荐几款核心路由器及相应报价
- 路由器管理员密码是什么?路由器的管理员密码详细介绍
- 环球观察:柯南最新剧场版《黑铁的鱼影》最新预告 4月14日上映
- 环球播报:机械制作模拟《Plasma》steam抢测 从机器人到街机制作
- 环球微速讯:《暗黑破坏神4》玩家打怪时 不会出现夸张伤害数值
- 《命运2:光陨之秋》现已上线,迎接我们的终局!
- 骁龙636处理器性能怎么样?高通骁龙636处理器性能详解
- 魔兽世界暗夜要塞入口怎么走?去暗夜要塞入的方法介绍
- 如何设置进入待机快捷键?待机快捷键的设置方法
- directx9.0c是什么软件?directx9.0c如何安装使用?
- 汉翔大将军手写板驱动怎么用?汉翔大将军手写板驱动安装说明常见问题解答
- Word目录怎样做?Word目录怎么自动生成?Word目录操作方法介绍
- 弹出winlogon.exe应用程序错误怎么办?winlogon.exe应用程序错误原因分析及解决方法
- SmartPrinter支持哪些格式?SmartPrinter文档转换方法
- Usb无法识别的原因是什么?电脑usb无法识别的处理步骤
- 本地连接不见了怎么办?本地连接不见了原因分析及解决方案介绍
- 940MX显卡怎么样?GeForce 940MX详细测评
- 拳头账号怎么注册?拳头账号密码忘了怎么找回?
- tcpip.sys文件造成电脑蓝屏怎么解决?tcpip.sys文件造成电脑蓝屏修复方法
- 全球即时:小米无线键鼠套装2开售:首发价89 元
- 12G+512G旗舰机超值价2149元!
- 苹果MR头显隔空打字:iPhone要酸了|全球观天下
- iPhone 15 Pro Max曝光:更厚更重了