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
这几个数的数量级如此小,可以认为几乎就不变了。

浙公网安备 33010602011771号