LSC(Lens Shade Correction)------镜头阴影校正

由于相机在成像距离较远时,随着视场角慢慢增大,能够通过照相机镜头的斜光束将慢慢减少,从而使得获得的图像中间比较亮,边缘比较暗,这个现象就是光学系统中的渐晕。由于渐晕现象带来的图像亮度不均会影响后续处理的准确性。因此从图像传感器输出的数字信号必须先经过镜头矫正功能块来消除渐晕给图像带来的影响。同时由于对于不同波长的光线透镜的折射率并不相同,因此在图像边缘的地方,其R、G、B的值也会出现偏差,导致CA(chroma aberration)的出现,因此在矫正渐晕的同时也要考虑各个颜色通道的差异性。

常用的镜头矫正的具体实现方法是,首先确定图像中间亮度比较均匀的区域,该区域的像素不需要做矫正;以这个区域为中心,计算出各点由于衰减带来的图像变暗的速度,这样就可以计算出相应R、G、B通道的补偿因子(即增益)。下图左边图像是未做镜头阴影校正的,右边图像是做了镜头阴影校正的。

在这里插入图片描述
luma shading:
由于Lens的光学特性,Sensor影像区的边缘区域接收的光强比中心小,所造成的中心和四角亮度不一致的现象。镜头本身就是一个凸透镜,由于凸透镜原理,中心的感光必然比周边多。如图所示:

在这里插入图片描述

ch

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是天祥TX-1C单片机开发板的电子时钟程序示例: ```c #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit SCL=P2^1; //定义 I2C 时钟线引脚 sbit SDA=P2^0; //定义 I2C 数据线引脚 sbit LSA=P2^2; //定义数码管位选引脚 sbit LSB=P2^3; sbit LSC=P2^4; uchar code LedCharTable[]={ //LED 显示字符表 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0~9 0x77,0x7c,0x39,0x5e,0x79,0x71 //A~F }; uchar code WeekDayTable[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; //星期表 uchar timeData[]={0x00,0x58,0x23,0x06,0x08,0x02,0x20}; //保存时间日期数据:年月日星期时分秒 uchar secondFlag=0; //秒闪烁标志 uchar i; //循环计数变量 void I2C_Start(void); void I2C_Stop(void); void I2C_SendByte(uchar dat); uchar I2C_RecvByte(void); void Delay1ms(uint cnt); void DS1307_Init(void); void DS1307_Write(uchar addr, uchar dat); uchar DS1307_Read(uchar addr); void DisplayTime(void); void DisplayDate(void); void DisplayWeekDay(void); void DisplaySecond(void); void main() { DS1307_Init(); //初始化 DS1307 while(1) { DisplayTime(); //显示时间 DisplayDate(); //显示日期 DisplayWeekDay(); //显示星期 DisplaySecond(); //闪烁显示秒 } } void I2C_Start(void) { SDA=1; //数据线高电平 SCL=1; //时钟线高电平 Delay1ms(1); //延时 SDA=0; //数据线低电平,发出起始信号 Delay1ms(1); //延时 SCL=0; //时钟线低电平,准备发送或接收数据 } void I2C_Stop(void) { SDA=0; //数据线低电平 SCL=1; //时钟线高电平 Delay1ms(1); //延时 SDA=1; //数据线高电平,发出停止信号 Delay1ms(1); //延时 } void I2C_SendByte(uchar dat) { uchar i; for(i=0; i<8; i++) { SDA=dat>>7; //发送数据的最高位 dat<<=1; //数据左移一位,准备发送下一位数据 SCL=1; //时钟线高电平,数据线上的数据被采样 Delay1ms(1); //延时 SCL=0; //时钟线低电平,准备发送或接收下一位数据 Delay1ms(1); //延时 } } uchar I2C_RecvByte(void) { uchar i, dat=0; SDA=1; //数据线高电平,准备接收数据 for(i=0; i<8; i++) { dat<<=1; //数据左移一位,准备接收下一位数据 SCL=1; //时钟线高电平,数据线上的数据被采样 Delay1ms(1); //延时 if(SDA) //如果数据线上的数据为高电平 { dat|=0x01; //将数据线上的数据存入 dat 的最低位 } SCL=0; //时钟线低电平,准备发送或接收下一位数据 Delay1ms(1); //延时 } return dat; } void Delay1ms(uint cnt) { uint i, j; for(i=0; i<cnt; i++) { for(j=0; j<110; j++); } } void DS1307_Init(void) { uchar i; I2C_Start(); //发起 I2C 起始信号 I2C_SendByte(0xd0); //发送器件地址+写命令 I2C_SendByte(0x07); //发送内部地址:时钟芯片控制寄存器 I2C_SendByte(0x00); //发送控制字节:清除 CH、RS0、RS1 位 I2C_Stop(); //发起 I2C 停止信号 I2C_Start(); //发起 I2C 起始信号 I2C_SendByte(0xd0); //发送器件地址+写命令 I2C_SendByte(0x00); //发送内部地址:秒 for(i=0; i<7; i++) { I2C_SendByte(timeData[i]); //发送时间数据 } I2C_Stop(); //发起 I2C 停止信号 } void DS1307_Write(uchar addr, uchar dat) { I2C_Start(); //发起 I2C 起始信号 I2C_SendByte(0xd0); //发送器件地址+写命令 I2C_SendByte(addr); //发送内部地址 I2C_SendByte(dat); //发送数据 I2C_Stop(); //发起 I2C 停止信号 } uchar DS1307_Read(uchar addr) { uchar dat; I2C_Start(); //发起 I2C 起始信号 I2C_SendByte(0xd0); //发送器件地址+写命令 I2C_SendByte(addr); //发送内部地址 I2C_Start(); //发起 I2C 起始信号 I2C_SendByte(0xd1); //发送器件地址+读命令 dat=I2C_RecvByte(); //接收数据 I2C_Stop(); //发起 I2C 停止信号 return dat; } void DisplayTime(void) { uchar hour, minute; hour=DS1307_Read(0x02); //读取小时 minute=DS1307_Read(0x01); //读取分钟 LSA=0; //显示小时的十位 P0=LedCharTable[hour/10]; Delay1ms(5); LSA=1; LSB=0; //显示小时的个位 P0=LedCharTable[hour%10]; Delay1ms(5); LSB=1; LSC=0; //显示分钟的十位 P0=LedCharTable[minute/10]; Delay1ms(5); LSC=1; LSA=0; //显示分钟的个位 P0=LedCharTable[minute%10]; Delay1ms(5); LSA=1; } void DisplayDate(void) { uchar year, month, day; year=DS1307_Read(0x06); //读取年份 month=DS1307_Read(0x05); //读取月份 day=DS1307_Read(0x04); //读取日期 LSA=0; //显示年份的十位 P0=LedCharTable[year/10]; Delay1ms(5); LSA=1; LSB=0; //显示年份的个位 P0=LedCharTable[year%10]; Delay1ms(5); LSB=1; LSC=0; //显示月份的十位 P0=LedCharTable[month/10]; Delay1ms(5); LSC=1; LSA=0; //显示月份的个位 P0=LedCharTable[month%10]; Delay1ms(5); LSA=1; LSB=0; //显示日期的十位 P0=LedCharTable[day/10]; Delay1ms(5); LSB=1; LSC=0; //显示日期的个位 P0=LedCharTable[day%10]; Delay1ms(5); LSC=1; } void DisplayWeekDay(void) { uchar weekDay; weekDay=DS1307_Read(0x03); //读取星期 LSA=0; //显示星期的第一个字符 P0=LedCharTable[10]; Delay1ms(5); LSA=1; LSB=0; //显示星期的第二个字符 P0=LedCharTable[11]; Delay1ms(5); LSB=1; LSC=0; //显示星期的第三个字符 P0=LedCharTable[12]; Delay1ms(5); LSC=1; LSA=0; //显示星期的第四个字符 P0=LedCharTable[weekDay-

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值