【算法积累】找到前0.1%最大值的位置/MATLAB

文章目录


前言

为了提高编程能力,决定对日常遇到的一些编程问题做一个积累,以供今后查阅


1. Problem

在数字图像处理实践实验一中,要求复现何凯明的暗通道去雾算法,其中计算大气亮度这一步骤中。
要求:
记录暗通道图中灰度最大的前 0.1%的像素所在位置,把带雾图像在这些位置中分别求出三个通道最大的灰度值作为大气亮度。

2. Solution

首先,找到前0.1%大的灰度值像素所在位置。

  1. 初始化位置储存变量Maxpos。
  2. 找到最大值和最大值所在位置
  3. 将位置插入Maxpos,最大值置0
  4. 返回步骤2,像素个数达到要求后跳出循环。
  5. 删掉初始点。
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

上一篇:C++中提高程序运行效率的方法集合


下一篇:Offer II 004. 只出现一次的数字