使用算法

时间:2016-10-16 17:10:38

标签: matlab

我正在尝试使用定向梯度直方图来实现复制移动伪造的纸张检测。

算法是:

  1. 将图像分割成重叠的块。

  2. 计算每个块的特征向量并将它们存储在矩阵中。

  3. 按字典顺序对矩阵进行排序

  4. 使用块匹配来识别伪造区域。

  5. https://www.researchgate.net/publication/276518650_Detection_of_copy-move_image_forgery_using_histogram_of_orientated_gradients

    我陷入了第3步,无法继续。

    我实施的代码是:

    clc;
    clear all;
    close all;
    %read image
    img = imread('006_F.png');
    img=rgb2gray(img);
    img=imresize(img, 1/4);
    figure(1); 
    imshow(img);
    
    b=16; %block size
    nrc=5; %no. of rows to check
    td=416; %threshold
    [r, c]=size(img);%Rows and columns;
    column=(r-b+1)*(c-b+1);
    M= zeros(column,4);
    Mi = zeros(1,2);
    i=1;
    disp('starting extraction of features');
    for r1 = 1:r-b+1
    for c1 = 1:c-b+1
    % Extract each block
    B = img(r1:r1+b-1,c1:c1+b-1);
    
    features = extractHOGFeatures(B);%extracting features
    M(i, :) = features;
    Mi(i,:) = [r1 c1];
    i=i+1;
    end
    end
    [S, index] = sortrows(M , [ 1 2 3 4]);
    P= zeros(1,6);
    b2=r-b+1;
    disp('Finding Duplicates');
    for i = 1:column
        iv = index(i);
        xi=mod(iv,b2) + 1;
        yi=ceil(iv/b2);
        j = i+1;    
        while j < column && abs(i - j) < 5
            jv=index(j);
            xj=mod(jv,b2) + 1;
            yj=ceil(jv/b2);
    
            z=sqrt(power(xi-xj,2) + power(yi-yj,2));
            % only process those whose size is above Nd 
    
            if z > 16
                offset = [xi-xj yi-yj];
                P = [P;[xi yi xj yj xi-xj yi-yj]];  
    
            end          
           j = j + 1;
        end
    end
    rows = size(P,1);
    P(:,6) = P(:,6) - min(P(:,6));
    P(:,5) = P(:,5) - min(P(:,5));
    
    maxValP = max(P(:,6)) + 1;
    P(:,5) = maxValP .* P(:,5) + P(:,6);
    mostfrequentval = mode(P(:,5));
    
    
    disp('Creating Image');
    idx = 2;
    % Create a copy of the image and mask it
    
    RI = img;
    while idx < rows 
      x1 = P(idx,1);
      y1 = P(idx,2);
      x2 = P(idx,3);
      y2 = P(idx,4);
    
      if (P(idx,5) == mostfrequentval)
        RI(y1:y1,x1:x1) = 0;
        RI(y2:y2,x2:x2) = 0;
    
      end
      idx = idx + 1;
    end;
    

1 个答案:

答案 0 :(得分:0)

在完成您正在撰写的论文中指出的一些参考文献后(参考文献[8]和[20]):

词典排序相当于字母顺序,对于数字,即[1 1 1 1]&lt; [1 1 2 1]&lt; [2 3 4 5]&lt; [2 4 4 5]

因此,在您的情况下,您通过以下方式使用函数sortrows()

A = [1 1 1 1;1 1 1 2;1 1 1 4;1 2 2 2; 1 2 2 1; 1 4 6 3; 2 3 4 5; 2 3 6 6]; % sample matrix
[B,idx] = sortrows(A,[1 2 3 4]); % Explicit notation but it is the Matlab default setting so equivalent to sortrows(A)

这意味着:首先查看第一列,然后在相等的情况下查看第二列,对A行进行排序,依此类推。

如果您正在寻找相反的订单,请在列号前指定“ - ”。

所以最后,你的代码很好,如果结果不符合预期,那么它必须来自实现的另一个步骤......

编辑:参数idx记录已排序行的原始索引。