matlab练习程序(7个二维不变矩)

  《数字图像处理》书上说这7个矩是旋转、缩放、平移不变的,因此用这7个矩就可以代表一个图像了。我只试验了缩放的,这几个数几乎是不变的,也许做图像检索的时候可以用到。

代码:

main.m

clear all;
close all;
clc;

img=imread('lena.jpg');
fai1=two_dim_moment(img);

img1=imresize(img,[100 100]);
fai2=two_dim_moment(img1);

img2=imresize(img,[300 300]);
fai3=two_dim_moment(img2);

two_dim_moment.m

function fai=two_dim_moment(img)
    [m n]=size(img);
    img=double(img);
    
    %图像的各阶矩
    mm=zeros(4,4);   
    for y=1:m
        for x=1:n           
            for q=1:4
                for p=1:4
                    mm(q,p)=mm(q,p)+x^(p-1)*y^(q-1)*img(y,x);
                end
            end
        end
    end
    mean_x=mm(2,1)/mm(1,1);
    mean_y=mm(1,2)/mm(1,1);
    
    %三阶中心矩
    u00=mm(1,1);
    u11=mm(2,2)-mean_y*mm(2,1);
    u20=mm(3,1)-mean_x*mm(2,1);
    u02=mm(1,3)-mean_y*mm(1,2);
    u30=mm(4,1)-3*mean_x*mm(3,1)+2*mean_x^2*mm(2,1);
    u03=mm(1,4)-3*mean_y*mm(1,3)+2*mean_y^2*mm(1,2);
    u21=mm(3,2)-2*mean_x*mm(2,2)-mean_y*mm(3,1)+2*mean_x^2*mm(1,2);
    u12=mm(2,3)-2*mean_y*mm(2,2)-mean_x*mm(1,3)+2*mean_y^2*mm(2,1);
    %归一化中心矩
    n20=u20/u00^2;
    n02=u02/u00^2;
    n11=u11/u00^2;
    n30=u30/u00^2.5;
    n03=u03/u00^2.5;
    n12=u12/u00^2.5;
    n21=u21/u00^2.5;
    
    %7个不变矩
    fai(1) = n20 + n02; 
    fai(2) = (n20-n02)^2 + 4*n11^2;
    fai(3) = (n30-3*n12)^2 + (3*n21-n03)^2; 
    fai(4) = (n30+n12)^2 + (n21+n03)^2;
    fai(5) = (n30-3*n12)*(n30+n12)*((n30+n12)^2-3*(n21+n03)^2)+(3*n21-n03)*(n21+n03)*(3*(n30+n12)^2-(n21+n03)^2);
    fai(6) = (n20-n02)*((n30+n12)^2-(n21+n03)^2)+4*n11*(n30+n12)*(n21+n03);
    fai(7) = (3*n21-n03)*(n30+n12)*((n30+n12)^2-3*(n21+n03)^2)+(3*n12-n30)*(n21+n03)*(3*(n30+n12)^2-(n21+n03)^2);
    
end

结果:

原图:

0.0013419687027165 6.95655523873184e-09 1.24916604653673e-12 1.17939356080133e-11 -3.26570081740069e-24 -9.12854751076559e-16 -4.51507718900331e-23

放大后:

0.00134188447993572 6.96492642036082e-09 1.25147100094404e-12 1.18051442412046e-11 -3.17744677490662e-24 -9.14215664936433e-16 -4.52636844796181e-23

缩小后:

0.00134196941138094 6.95708662151456e-09 1.24992393394962e-12 1.17952059702159e-11 -3.25857426504391e-24 -9.12913253473569e-16 -4.51723884830695e-23

这几个数的数量级如此小,可以认为几乎就不变了。

你可能感兴趣的:(matlab)