用2023a版matlab写一段将四副256*256的灰度图像I1、I2、I3、I4进行图像归一化处理,图像归一化的原理是:首先计算并确定原始图像对各种仿射变换具有较强不变性的图像矩,然后根据得到的图像矩确定变换函数的具体参数,最后利用变换函数将原始图像转换为具有标准形式的图像,其归一化过程主要包括4个步骤:平移归一化、X-shearing归一化、Y-shearing归一化和缩放归一化,原始图像在经过以上四个步骤后,便能够转化为标准图像,从而能够降低仿射变换对图像的影响
时间: 2023-07-16 15:16:34 浏览: 74
以下是一段可以实现图像归一化处理的MATLAB代码:
```matlab
% 读取四幅灰度图像
I1 = imread('image1.png');
I2 = imread('image2.png');
I3 = imread('image3.png');
I4 = imread('image4.png');
% 图像归一化的参数
m = 256; % 图像大小为256*256
n = 4; % 四幅图像
p = 3; % 三次多项式拟合
q = 3; % 三次多项式拟合
% 计算图像矩
m00 = zeros(n,1);
m10 = zeros(n,1);
m01 = zeros(n,1);
m11 = zeros(n,1);
m20 = zeros(n,1);
m02 = zeros(n,1);
for i = 1:n
img = eval(sprintf('I%d', i));
[x,y] = meshgrid(1:m, 1:m);
m00(i) = sum(img(:));
m10(i) = sum(x(:).*img(:));
m01(i) = sum(y(:).*img(:));
m11(i) = sum(x(:).*y(:).*img(:));
m20(i) = sum(x(:).^2.*img(:));
m02(i) = sum(y(:).^2.*img(:));
end
% 平移归一化
cx = m10./m00;
cy = m01./m00;
for i = 1:n
img = eval(sprintf('I%d', i));
T = [1 0 -cx(i); 0 1 -cy(i); 0 0 1];
img = imwarp(img, projective2d(T), 'OutputView', imref2d(size(img)));
eval(sprintf('I%d', i)) = img;
end
% X-shearing归一化
deltax = m00.*(m11.*m00-m01.*m10)./(m00.^2.*m20-m10.^2.*m00);
for i = 1:n
img = eval(sprintf('I%d', i));
T = [1 -deltax(i) 0; 0 1 0; 0 0 1];
img = imwarp(img, projective2d(T), 'OutputView', imref2d(size(img)));
eval(sprintf('I%d', i)) = img;
end
% Y-shearing归一化
deltay = m00.*(m02.*m00-m01.*m01)./(m00.^2.*m20-m10.^2.*m00);
for i = 1:n
img = eval(sprintf('I%d', i));
T = [1 0 0; -deltay(i) 1 0; 0 0 1];
img = imwarp(img, projective2d(T), 'OutputView', imref2d(size(img)));
eval(sprintf('I%d', i)) = img;
end
% 缩放归一化
a = (m00.*m20-m10.^2)./(m00.*m02-m01.^2);
b = (m00.*m02-m01.^2)./(m00.*m20-m10.^2);
for i = 1:n
img = eval(sprintf('I%d', i));
T = [b(i) 0 0; 0 a(i) 0; 0 0 1];
img = imwarp(img, projective2d(T), 'OutputView', imref2d(size(img)));
eval(sprintf('I%d', i)) = img;
end
```
在这段代码中,首先读取四幅灰度图像,然后根据原理计算图像矩,接着依次进行平移归一化、X-shearing归一化、Y-shearing归一化和缩放归一化处理,最终得到的四幅图像就是经过归一化处理的标准图像了。
阅读全文