心得笔记--色彩空间

news/2024/7/5 21:38:51

在电子领域,常用的东西都可以量化,比如声音,用一秒钟采样声音的幅值48k或者44.1k次,那这些数值记录下来,可以描述一段时间声音。播放的时候可以用这段数据通过adc模拟出来输送到喇叭或者耳机上来。
我们眼睛所看到的大千世界都是由各种颜色组成,我们常用描述一种物体,比如天空:说成是蓝色,树叶说成是绿色。但实际各种物体不是一种颜色组成的 ,国旗一样带有五颗黄色的星。这样我们像上面类似,也可以对任何一幅画面量化。这个量化就是把一幅图像量化成横竖多少个格子,量化的大小决定图像的清晰程度,比如量化很小,32x32,类似小时候玩的小霸王游戏机,明显看的到是由颗粒组成。当前摄像头像素越来越高,早已经看不出颗粒了。比如1300w像素:4224x3136,一幅图可以横竖分成约为1300万个小格子。更夸张的当前小米已经做到1亿像素,个人认为未来像素还可以更多的增加,但对于普通场景,已经完全像素过剩。
回到原题,什么是色彩空间,我仅仅是个人描述,达到意思即可,就是如何描述一个像素点(上面说的小格子)的颜色。量化后就是用一组数据来描述一种颜色。类似位置空间,我们用xyz坐标来描述位置。我们最常见的是RGB,可以描述所有颜色。
因为关于几种色彩空间文章太多,我只做简述,网上很多,读者可以去自行搜索,根据色彩规则我发现了什么
1.RGB
Rgb三基色,用三种红绿蓝三种基色组合来描述所有颜色。为什么没有黄色,黄色可以由红色和绿色混合得到。
常用的rgb有rgb888 rgb565, 前者是分别用8bit表示一种基色,同理后者分别用5bit 6bit 5bit表示r g b的值。
这里主要说下一些规则:
@1.Rgb如果值接近,表现为灰度图,黑色值是0 0 0 白色值是255 255 255.
@2.其余两种颜色比较接近,另一种比较大,那么颜色显示为比较大的哪一种。
比如r 255 g 102 b 102,这种颜色表现为红色,但不是纯红,纯红是255 0 0
@3.如果要测试颜色显示比较方便的是用纯红 纯绿和纯蓝去显示,如果显示其他颜色说明采集错误颜色。

2.Yuv
这种是在camera领域比较常用是色彩空间,也可以叫ycbcr,其中y表示亮度信号,cbcr表示色度信号。
Yuv常用的组合有yuv444, yuv422,yuv420.
Yuv444: 一个亮度信号对应于一组uv信号 ,一个像素y和u、v各占一个字节公三个字节。
yuv422 : 两个亮度信号对应于一组uv信号,两个像素为两个y占用两个字节,u、v各占一个字节,公四个字节,每个像素为2个字节
yuv420: 四个亮度信号对应于一组uv信号,四个像素为两个y占用两个字节,u、v各占一个字节,公四个字节,每个像素为3/2个字节
实际yuv根据排列顺序,以及占用几个平面,可以细化成很多命名。
y u v和rgb转换的公式是
YUV 8bitRGB 计算:
Y = 0.299 R + 0.587 G + 0.114 B
U = - 0.1687 R - 0.3313 G + 0.5 B + 128
V = 0.5 R - 0.4187 G - 0.0813 B + 128
反过来,RGB 也可以直接从YUV 转换
R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)

规则:
@1:如果yuv都是0,这个时候图片显示的是绿色。因为从公式来看
R和B分量为负数,只有G分量为正值,那么只有绿色显示。所以我们有的时候看摄像头采集到绿色,很大可能是完全没有采集到数据。
@2:如果要把yuv彩色信号变成黑白色,根据公式,只需把cb cr的值改成128.那么R G B 的值都为Y,也就是只有亮度信号。所以黑色为0 128 128 白色为
@3:如果颜色显示红蓝互换,很有可能是uv的值对调了
@4:第一个公式可以算出纯色
红色为Y= 76.5 U=88 V=0

3.raw
实际raw图也可以认为是RGB图,但是raw图每一个pix只对应8bit 10bit或者12bit,不像RGB 如果是8bit,一个pix占用8*3=24bit (当然我说的是rgb888格式),raw实际每个pix只有rbg三种颜色的一种, 以BGGR排列来说,第一样是BGBGBGBG…这样排列,第二行就是GRGRGR…这样排列。
那既然都是单个颜色的值,那么就不方便看图了。要还原其他两色,这个过程叫做demosic,那这个就涉及到一些算法了,最简单的就是将周围若干个点取平均值。
我分析过一张彩条图,以raw8,1280x800分辨率,BGGR排列为例:
第一行0x00-0x99个字节都为0xff
0x9a-0x13b个字节为0x00 0xff依次排列
0x13c-0x1dc个字节都 0xff
0x1de-0x27f个字节是 0xff 0x00依次排列
0x280-0x321个字节是0x00 0xff依次排列
0x322-0x3c3个字节都是0x00
0x3c4-0x465个字节是0xff 0x00依次排列
0x466-0x49f个字节都是0x00
第二行就不写了,字节是从0x500开始到0x99f

0xff 0xff0x00 0xff0xff 0xff0x00 0xff0xff 0x000x00 0x000xff 0x000x00 0x00
0xff 0xff0xff 0xff0xff 0x000xff 0x000x00 0xff0x00 0xff0x00 0x000x00 0x00
绿

根据排列第一行是BGBG
第二行是GRGR
所以8列中第一列是BGGR都是0xff,那就是白色
第二列B为00 GR是0xff,也就是绿色和红色混合的黄色
其他颜色混合就不一一说出来,看颜色对照表,读懂了,raw图也就明白了

当然还有其他色彩空间比如打印行业常用的cmyk,C代表青色(Cyan),M代表洋红色(Magenta),Y代表黄色(Yellow),K代表黑色(Black)。

其实写这个文章的目的是什么呢?
在debug摄像头的时候,经常碰到颜色错误,黑白,色彩偏移,这些问题,实际我们可以通过分析采集的数据,来做大致的分析。
只要清晰的了解颜色的值,大可以输出固定的值,与采集到的值比较。
有时我们完全可以通过数值知道分辨率,比如发现第n个值比较接近第一个值,n+1的值比较接近第二个值,其他值都有偏差,根据相近颜色值偏差不大的原理,可以认为有n列,根据总点阵数除以n可以获取行数。


http://www.niftyadmin.cn/n/2085178.html

相关文章

AAA配置实例

测试目的:通过AAA,实现用户级的授权 测试环境:TACACS ,1720路由器 测试过程: 实验一:用本地(LOCAL)方法进行验证和授权 配置文件: version 12.1 ! hostname Router ! aaa…

angular学习(七)-- Service

1.7 服务:Service 如果做过后台开发,那么对 Angular 中的服务就好理解多了。 在 Angular 中,服务的概念和后台的服务概念基本是一样的,差别只是在于技术细节。 服务是对公共代码的抽象,比如,如果在多个控制…

安装和使用Glassfish

安装和使用Glassfish Glassfish是Sun Microsystem支持的一个开源社区,它参考了Apache, Eclipse等开源社区的模式,通过OpenSource实现了Java EE 5的全部功能。 Sun的Java System Application PE 9和Java EE 5 SDK即以Glassfish为基础。更多Glassfish的功能…

camera dhpy和csi2协议分析

简介 MIPI(移动行业处理器接口)是Mobile Industry Processor Interface的缩写。 MIPI联盟一系列的手机内部接口标准,其中最常用的是: 像头接口CSI(CameraSerialInterface)定义了一个位于处理器和摄像模组之…

Game theory初步

游戏1l 有两个游戏者:A和B。l 有21颗石子。l 两人轮流取走石子,每次可取1、2或3颗。l A先取。l 取走最后一颗石子的人获胜,即没有石子可取的人算输。如果剩下1、2或3颗石子,那么接下来取的人就能获胜;如…

java小算法复习

package com.bshinfo.bm.util; import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Scanner; public class Test { //菱形 public void test1(){ for (int i 0; i < 5; i) {//行数 for (int j 0; j <5-i-1; j) {//空格 System…

CPHY简单介绍

之前的文章有介绍过DPHY和CSI2&#xff0c;这篇文章简单介绍下CPHY 实际上是在DPHY之后CPHY之前&#xff0c;mipi组织提出了M-PHY和CSI3协议。M-PHY&#xff0c;4lane tx全部打开理论每 lane最大值达到11.6gb/s,而DPHY最大只达到2.5gb/s. M-PHY是DPHY的4.64倍。为了应用与类似车…

Jquery mobile中的 checkbox和radio的设置问题

在Jquery Mobile网页中用JS控制Radio的状态一直达不到目的。 用$("input[nameradio]:first").prop("checked",true)设置checked的时候&#xff0c;用.attr("checked")读取不到值。 用$("input[nameradio]:first").attr("checked&…