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]);