Matlab EMD算法评测图片相似性

function similarity_result = EMD_algorithm(descriptor,tem)
% 此函数通过描述符计算图像之间的相似性
% 用EMD算法的最小功表示相似性,功越小,图片越相似

       % 求出矩阵的行数,256个特征
       [a,b] = size(descriptor);

       % 初始化EMD的距离搬运矩阵
       distance = ones(a);

       t = max(max(descriptor));
       lb = zeros(1,a^2);
       ub = ones(1,a^2)*t;
       
       % 计算距离搬运矩阵distance
       for m = 1:a       
           for n = 1:a
           distance(m,n) = abs(m - n);
           end
       end
       
       % 把二维向量展开
       distance =  reshape(distance,[a*a,1]);
       % 计算货物重量
       % 计算变换矩阵m_cargo
       col = 2 * a+a^2;
       row = a^2;
       m_cargo = zeros(2 * a,row);
       
       % 前256行的变换,也就是公式:求和fij <= wqj(i属于1-m)
       for i = 1:a         
           m_cargo(i,(i-1)*a+1 : i*a) = 1;           
       end
       
       % 前257-512行的变换,也就是公式:求和fij <= wpi(j属于1-n)
       for  j = 1:a   
           for  k = 0:a-1 
               m_cargo(j+a,k*a+j) = 1;
           end    
       end
       
%        % 513-最后一行的变换,也就是公式:-fij <= 0 
%        for h = 1:row
%            m_cargo(h+2*a,i) = -1;
%        end
       
       Aeq = ones(1,a^2);
       
       % 按每一列求和
       % beq = sum(descriptor);
       % 进行归一化之后的结果
       beq = 1;
       
       % 直方图的特征
       histogram_feature = zeros(2 * a,b);
       for p = 1:b
           
           % 将计算相似度的图片的feature进行拼接
           temp = [descriptor(:,p);tem'];
           % 将拼接后的特征进行存储
           histogram_feature(1:2*a,p) =  temp;
       
       end

       % histogram_feature(find(isnan(histogram_feature) == 1)) = 1;
       % histogram_feature(:,89) = [];
       
       % 计算EMD距离,并得出相似度
       for p = 1:b
       
           % 计算EMD算法的最优解
           [x,result] = linprog(distance,m_cargo,histogram_feature(:,p),Aeq,beq,lb,ub);
       
           if isempty(result)

               result = 0;
               
           end
           % 求得的相似度存储
           similarity_result(p) = result;
           
           disp(p)
       end

       similarity_result = similarity_result/max(similarity_result);
       
end

上述代码是EMD算法进行迁移之后用于计算两幅图片之间相似性的函数。

建议读者先去了解一下EMD算法,并且了解矩阵之间的乘法。

你可能感兴趣的:(Matlab)