图像去雾学习(一):“暗通道”是什么

最近刚开始学图像处理方面的知识,对很多专业名词都并不了解,所以记录一下这方面的知识:

通常彩色图像都包括三个通道,即RGB三通道,也可以理解而成一张图片又三层同样大小的RGB(光学三原色:红绿蓝)三色堆叠而成,而图片实质上是由一个个像素组成的,对应于RGB三色来说,每一种颜色都是由这三原色组合而成,比如红色为(255,0,0),绿色为(0,255,0),粉红为(255,192,203),也就是说一张彩色图片中的每个像素都是以这种形式来表示的。

那么我们通常所说的暗通道,即清晰无雾的图片中除天空区域(因为天空区域或者白色区域和雾的特征较为接近)外的任一局部区域像素至少有一个通道值很低,几乎趋近于零。
那如何求暗通道呢,我们在上面的代码中已经做了详细的说明,便是先求每个像素在三个通道中的最小值,然后得到一张与原始图像大小一致的灰度图,然后再使用最小值滤波进行平滑处理,即在得到的灰度图中,以每一个像素为中心取一定大小的矩形窗口(本文为15x15),取矩形窗口中灰度值的最小值代替中心像素的值,从而得到原始图像对应的暗通道图像。(求暗通道过程中要计算两次最小值)

何博士的基于暗通道先验的单幅图像去雾中的部分代码:

clear all;
I=imread('xxxx\dehazing.png');  %读取图片
I=double(I);  %将读入图像I的uint8数据转换为double类型的数据
I=I./255;  %将像素值转换到0~1之间
dark=darkfunction(I);
 
subplot(1,2,1);imshow(I);
subplot(1,2,2);imshow(dark);  %展示雾图和对应的暗通道
 
function [dark] =darkfunction(I)
R=I(:,:,1);  %将I的第一层赋值给R,下面的G、B分别为I的第二、三层
G=I(:,:,2);  %三个参数分别代表行、列和层
B=I(:,:,3);
[m,n]=size(R); %size求取矩阵大小,返回其行列值,即m、n
a=zeros(m,n);  %zeros返回 m x n 大小的零矩阵
for i=1:m   %i从1开始一直循环到m
    for j=1:n
        a(i,j)=min(R(i,j),G(i,j));
        a(i,j)=min(a(i,j),B(i,j));
    end;
end;  
%整个for循环就是求取所有像素的RGB三通道(层)中的最小值,最后得到
%一副和原始图像同样大小的灰度图,即单通道图像
d=ones(15,15); %ones产生15x15的全1矩阵
fun=@(block_struct)min(min(block_struct.data))*d; %最小值滤波
%@(block_struct)为装饰器函数,block_struct.data表示传入的数据(图片或者矩阵)
dark=blockproc(a,[15,15],fun); %blockproc为分块矩阵处理函数
dark=dark(1:m,1:n); 
end
 
  • 11
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值