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