图像——坏点

引起坏点的原因

  1. 工艺:(a)在sensor的制作过程中有灰尘等引起。

            (b)电子产品的寿命影响有限,导致会随着使用时间的增加而引起坏点。
    
  2. noise : (a)sensor gain 增大

              (b)温度增高等.
    

坏点的分类

时间变化

根据是否随着时间变化分:

静态坏点:不会随着时间、增益等改变,从sensor制造时因为工艺等产生的坏点。

动态坏点:因为增益、温度等引起的坏点,会随着时间变化而变化。

亮度

根据亮度分类:

hot pixel:比周围点亮很多的坏点。
dead pixel:比周围点暗很多的坏点。
weak pixel:没有提供一个正确的像素值,但并没有比周围点特别亮或者特别暗的像素。

集中状态

根据坏点是否集中来分:

单坏点、双坏点、多坏点
指的是单通道上的相邻坏点数量 ,3x3 邻域内出现的。
都在R、G、B一个方向上出现的坏点。

单坏点
在这里插入图片描述
双坏点
在这里插入图片描述
多坏点
在这里插入图片描述

坏点检测

方法

消除算法

在这里插入图片描述
评价指标:
不能损失原有的图像细节
去除所有的坏点
不能引起artifact
静态坏点消除
一般在sensor或则和模组产线上进行标定,并将坏点位置写在OTP(one time programmable) 里面。
在这里插入图片描述
也可用ISP静态坏点修正,通过SOC的I2C接口,从OTP读出来,写到SOC的memory里面,然后进行坏点矫正。

动态坏点判断方法
以G5为例
在这里插入图片描述
在这里插入图片描述
hot pixel:比 AVG +dif 大的点。
dead pixel:比 AVG -dif 小的点。

动态坏点修正:

静态坏点:中值滤波
根据边缘情况,选择均值滤波的像素点

在这里插入图片描述

Corner case

  • noise的影响,高噪声(坏点检测矫正时根据ISO强度进行调试,根据噪声强度判断是否是坏点)
  • 高亮的孤立点(红绿灯案例,LED点阵灯)
  • 分辨率卡(密集的条纹不可被抹平)
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算坏点需要对YUV图像进行处理。具体实现步骤如下: 1. 读取YUV图像,将数据存储在一个数组中。 2. 遍历数组中的每一个像素点,计算该像素点的亮度值Y。 3. 判断该像素点是否为坏点。一般情况下,坏点的亮度值会偏离正常值,所以可以根据一定的阈值来判断该像素点是否为坏点。如果该像素点的亮度值小于阈值,则认为该像素点为坏点。 4. 对于坏点,需要进行修复。一般的修复方法是使用周围像素点的平均值来取代坏点。具体地,可以找到坏点周围一定范围内的正常像素点,然后计算这些像素点的平均值,将平均值作为坏点的修复值。 5. 将修复后的YUV图像保存到文件中。 下面是C++代码实现: ``` #include <iostream> #include <fstream> using namespace std; const int WIDTH = 640; // 图像宽度 const int HEIGHT = 480; // 图像高度 const int THRESHOLD = 50; // 判断坏点的阈值 const int RADIUS = 3; // 坏点修复半径 // 读取YUV图像 void read_yuv(const char* file, unsigned char* yuv) { ifstream in(file, ios::binary); in.read(reinterpret_cast<char*>(yuv), WIDTH * HEIGHT * 3 / 2); in.close(); } // 写入YUV图像 void write_yuv(const char* file, const unsigned char* yuv) { ofstream out(file, ios::binary); out.write(reinterpret_cast<const char*>(yuv), WIDTH * HEIGHT * 3 / 2); out.close(); } // 计算像素点是否为坏点 bool is_bad_pixel(unsigned char* yuv, int x, int y) { int pos = y * WIDTH + x; int y_val = yuv[pos]; return (y_val < THRESHOLD); } // 修复坏点 void fix_bad_pixel(unsigned char* yuv, int x, int y) { int sum = 0; int count = 0; // 计算周围像素点的平均值 for (int i = x - RADIUS; i <= x + RADIUS; i++) { for (int j = y - RADIUS; j <= y + RADIUS; j++) { if (i >= 0 && i < WIDTH && j >= 0 && j < HEIGHT && !is_bad_pixel(yuv, i, j)) { int pos = j * WIDTH + i; sum += yuv[pos]; count++; } } } if (count > 0) { int pos = y * WIDTH + x; yuv[pos] = sum / count; // 用平均值修复坏点 } } // 处理YUV图像 void process_yuv(unsigned char* yuv) { for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { if (is_bad_pixel(yuv, x, y)) { fix_bad_pixel(yuv, x, y); } } } } int main() { unsigned char* yuv = new unsigned char[WIDTH * HEIGHT * 3 / 2]; read_yuv("input.yuv", yuv); // 读取YUV图像 process_yuv(yuv); // 处理YUV图像 write_yuv("output.yuv", yuv); // 写入YUV图像 delete[] yuv; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值