文章目录
前言
为了提高编程能力,决定对日常遇到的一些编程问题做一个积累,以供今后查阅
1. Problem
在数字图像处理实践实验一中,要求复现何凯明的暗通道去雾算法,其中计算大气亮度这一步骤中。
要求:
记录暗通道图中灰度最大的前 0.1%的像素所在位置,把带雾图像在这些位置中分别求出三个通道最大的灰度值作为大气亮度。
2. Solution
首先,找到前0.1%大的灰度值像素所在位置。
- 初始化位置储存变量Maxpos。
- 找到最大值和最大值所在位置
- 将位置插入Maxpos,最大值置0
- 返回步骤2,像素个数达到要求后跳出循环。
- 删掉初始点。
num=floor(0.001*m*n); %计算前0.1%的个数
MaxPos = [0,0]; % 初始化位置
for i=1:num
MaxValue = max(max(dark_img));
[x,y] = find(dark_img==MaxValue);
dark_img(dark_img==MaxValue) = 0; %最大值置零,寻找下一次次大值
%检查长度
MaxPos = vertcat(MaxPos,[x,y]);
Cnt = length(MaxPos(1));
if Cnt > num
break;
end
end
MaxPosN = MaxPos(2:num+1,:);%删掉初始点[0,0]
找到位置中对应的三个通道灰度值
%找到三个维度的亮度最大值
Ar=0;Ag=0;Ab=0;
for i=1:num
if img_r(MaxPosN(i,1),MaxPosN(i,2))>Ar
Ar=img_r(MaxPosN(i,1),MaxPosN(i,2))
end
if img_g(MaxPosN(i,1),MaxPosN(i,2))>Ag
Ag=img_r(MaxPosN(i,1),MaxPosN(i,2))
end
if img_b(MaxPosN(i,1),MaxPosN(i,2))>Ab
Ab=img_b(MaxPosN(i,1),MaxPosN(i,2))
end
end
A=[Ar,Ag,Ab]
end