数字图像处理学习笔记1:暗通道求取大气光值A的Matlab代码

1 前言   

        我妹妹是学编导的,但很神奇的是她们也要选修数字图像处理。只能说体现了985的含金量。她选了个去雾的大作业,要求复现何恺明老师的去雾算法,其中有一步骤是要求大气光值A,具体办法是选取暗通道前0.1%亮的位置,再求灰度图中这些位置点的平均值。下面就是我写给妹妹的代码,发出来做个记录,同时与诸君共勉,如有纰漏,还望斧正。

2 原理

        首先获取暗通道中前0.1%亮的位置。假设图大小为m*n,把暗通道图变成单行数组,然后对数组进行降序排序,找出第(m*n)/1000个像素(如果(m*n)/1000不是整数就四舍五入),记为x。然后对暗通道图进行遍历,凡是大于等于x的像素,都变为1;小于x的像素都变为0,这样我们就得到了前0.1%像素的位置图,记为F。接下来用F点乘灰度图,所得到的矩阵求和再除以F中1的像素数就得到了A。

3 代码

如果觉得有用请点赞!

function A = SolveA(img,img_d)

%img是rgb原图,img_d是暗通道图;A是大气光值

[h,w,~] = size(img_d);

Hh = img_d(:);

n = round(w*h/1000);

E = sort(Hh(:),"descend");

e = E(n);

matrix1 = zeros(h,w);

for i = 1:h
    for j = 1:w
        if img_d(i,j)>=e
            matrix1(i,j) = 1;
        else
            matrix1(i,j) = 0;
        end
    end
end

guide = matrix1;

img_hsv = rgb2hsv(img);

C = im2uint8(guide.*img_hsv(:,:,3));

A0 = sum(sum(C))/sum(sum(guide));

A = min([240,A0]);

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值