数字图像处理:图像几何变换(Matlab实现几何变换+原理解析

图像几何变换

自己手动实现几何变换和调用内置函数实现几何变换的区别

1.代码实现

在这里插入图片描述

xianxing.m
% 读入图片
init = imread('20161117110940335.png');
init = rgb2gray(init);

[R,C] = size(init);
% 求出旋转矩阵
alfa = 30 / 180 * pi;
tras = [cos(alfa), -sin(alfa),0; sin(alfa), cos(alfa),0;0,0,1];
c1 = [R; C;0] / 2;

% 计算所需背景尺寸
R1 = floor(C*sin(alfa)+R*cos(alfa))+1;
%floor 向上取整函数,保证图像信息完整
C1 = floor(C*cos(alfa)+R*sin(alfa))+1;
c2 = [R1; C1;0] / 2;
% 初始化背景,将旋转后的图像坐标赋给该背景
res = uint8(zeros(R1, C1)*128);
    for i = 1:R1
        for j = 1:C1
            p = [i; j;1];
            pp = (tras*(p-c2)+c1);
            mn = floor(pp);%向上取整,保证信息完整
            ab = pp - mn;
            a = ab(1);
            b = ab(2);
            m = mn(1);
            n = mn(2);
            % 线性插值方法
            if (pp(1) >= 2 && pp(1) <= R-1 && pp(2) >= 2 && pp(2) <= C-1)
                res(i, j) = (1-a)*(1-b)*init(m, n) + a*(1-b)*init(m, n+1)...
                    +(1-a)*b*init(m+1, n)+a*b*init(m+1, n+1);
            end
        end
    end
figure;
imshow(init);
title('原图像')
figure;
imshow(B);
title('图像旋转')
transform1.m
init = imread('20161117110940335.png'); % 读取图像
init =rgb2gray(init);%将rgb图像转换成灰度图

figure(1)
imshow(uint8(init));

[R, C] =size(init);
res = zeros(R, C); % 构造结果矩阵。每个像素点默认初始化为0(黑色)
delX = 100; % 平移量X
delY = 100; % 平移量Y
tras = [1 0 delX; 0 1 delY; 0 0 1]; % 平移的变换矩阵 

R1=2*R;
C1=2*C;
%R1=R;
%C1=C;
for i = 1 : R
    for j = 1 : C
        temp = [i; j; 1];
        temp = tras * temp; % 矩阵乘法
        x = temp(1, 1);
        y = temp(2, 1);
        % 变换后的位置判断是否越界
        if (x <= R1) & (y <= C1) & (x >= 1) & (y >= 1)
            res(x, y) = init(i, j);  
        end
    end
end
figure(2)
imshow(uint8(res)); % 显示图像
% 利用imtranslate函数
J = imtranslate(init,[delX, delY]);
figure(3)
imshow(J)
transform2.m
init = imread('20161117110940335.png'); % 读取图像
init =rgb2gray(init);
[R, C] = size(init); % 获取图像大小
res = zeros( R,  C); % 构造结果矩阵。每个像素点默认初始化为0(黑色)

alfa = -30* 3.1415926 / 180.0; % 旋转角度
tras = [cos(alfa) -sin(alfa) 0; sin(alfa) cos(alfa) 0; 0 0 1]; % 旋转的变换矩阵
R1=floor(R*cos(-alfa)+C*sin(-alfa))+1;
C1=floor(C*cos(-alfa)+R*sin(-alfa))+1;
center = [R1; C1;0] / 2;
c1=[R;C;0]/2;
%R1=R;
%C1=C;
for i = 1 : R1
    for j = 1 : C1
        temp = [i; j; 1];
        temp = tras * (temp-center)+c1;% 矩阵乘法
        x = uint16(temp(1, 1));
        y = uint16(temp(2, 1));
        % 变换后的位置判断是否越界
        if (x <= R) & (y <= C) & (x >= 1) & (y >= 1)
            res(i, j) = init(x, y);
        end
    end
end
figure(1)
imshow(init)
hold on
figure(2)
imshow(uint8(res));  % 显示图像

J = imrotate(init,30,'bilinear')
figure(3)
imshow(J)
transform3.m
M=closet('20161117110940335.png',3);%R 放大倍数
M=bilinear('20161117110940335.png',2);
M=SSJJ('20161117110940335.png',10);

transform4.m
clc;
clear all;
im_l=imread('20161117110940335.png');
im_l1=im2double(im_l);
im_l2=rgb2gray(im_l1);
im_l2= imresize(im_l2,[512,512]);
%对图像进行哈达玛变换
H=hadamard(512);%产生512X512的Hadamard矩阵
haImg=H*im_l2*H;
haImg2=haImg/512;

%对图像进行哈达玛逆变换
hhaImg=H'*haImg2*H';
hhaImg2=hhaImg/512;

haImg1=im2uint8(haImg);
hhaImg1=im2uint8(hhaImg2);

subplot(2,2,1);
imshow(im_l);
title('原图');

subplot(2,2,2);
imshow(im_l2);
title('灰度图');

subplot(2,2,3);
imshow(haImg2);
title('图像的二维离散Hadamard变换');

subplot(2,2,4);
imshow(hhaImg1);
title('图像的二维离散Hadamard逆变换');

sw.m
function A=sw(w1)
w=abs(w1);
a=-0.5;
if w<1&&w>=0
  A=1-(a+3)*w^2+(a+2)*w^3;
else if w>=1&&w<2
  A=a*w^3-5*a*w^2+(8*a)*w-4*a;
else
  A=0;
    end
end
end

SSJJ.m
function g=SSJJ(filename,k)
F=imread(filename);                               
[m,n,color]=size(F);  
f=rgb2gray(F);
a=f(1,:);
c=f(m,:) ;        %将图像扩展四行四列
b=[f(1,1),f(1,1),f(:,1)',f(m,1),f(m,1)];
d=[f(1,n),f(1,n),f(:,n)',f(m,n),f(m,n)];
a1=[a;a;f;c;c];
b1=[b;b;a1';d;d];
f=b1';
f1=double(f);
for i=1:m*k
    dx=i/k-floor(i/k);           
     x=floor(i/k)+2;   
     A=[sw(1+dx) sw(dx) sw(1-dx) sw(2-dx)];   %四个横坐标的权重W(i)
  for j=1:n*k
    dy=rem(j,k)/k;
     y=floor(j/k)+2;   
    C=[sw(1+dy);sw(dy);sw(1-dy);sw(2-dy)]; 
    B=[f1(x-1,y-1),f1(x-1,y) ,f1(x-1,y+1), f1(x-1,y+2)    
         f1(x ,y-1),f1(x,   y),f1(x,  y+1),f1(x,   y+2)
         f1(x+1,y-1),f1(x+1,y),f1(x+1,y+1),f1(x+1,y+2)
         f1(x+2,y-1),f1(x+2,y),f1(x+2,y+1),f1(x+2,y+2)];
    g1(i,j)=(A*B*C);
  end
end
g=uint8(g1); %将矩阵转换成整数类型
figure(4)
imshow(g);
end
closet.m
function M=closet(filename,R)
F=imread(filename);
[row,col,color]=size(F);
row=row*R;
col=col*R;
M=zeros(row,col,color,class(F));
for i=1:row
    for j=1:col
       for n=1:color
            x = floor(i/R+0.5);
            y = floor(j/R+0.5);
            %为了避免出现‘位置 1 处的索引无效。数组索引必须为正整数或逻辑值’的问题。
            %Matlab中的数组或矩阵的下标最小为1
             if x==0
                x=x+1
             end
             if y==0
                y=y+1
             end
             M(i,j,n) = F(x,y,n);
        end
   end
end
    figure(1);
    imshow(F);
    figure(2);
    imshow(M)
end

bilinear.m
function A=bilinear(filename,C)
F=imread(filename);
[row,col,color]=size(F);
row=row*C;
col=col*C;
[d,e,f]=size(F);
A=zeros(row,col,color,class(F));
for i = 1:row
    for j = 1:col
        for n = 1:color
            x = floor(i/C);
            y = floor(j/C);
            if x == 0
                x = x+1;
            end
            if y ==0
                y = y+1;
            end
            u = i/C-floor(i/C); 
            v = j/C-floor(j/C); %求出dx和dy
                 if x==d
                     x=x-1;
                 end
                 if y==e
                     y=y-1;
                 end
                    A(i,j,n) =(1-u)*(1-v)*F(x,y,n)+(1-u)*v*F(x+1,y,n)+u*(1-v)*F(x,y+1,n)+u*v*F(x+1,y+1,n);
        end
    end
end

figure(3);
imshow(A)
end


20161117110940335.png:
20161117110940335

2. 原理

1.平移

在这里插入图片描述
在这里插入图片描述

2.旋转

在这里插入图片描述

防止信息丢失方法:

  • 旋转前,平移坐标;
  • 旋转后,填充空洞点

解决方法:

旋转原理

在这里插入图片描述
在这里插入图片描述

线性插值:
MATLAB图像平移、旋转、缩放、裁剪
图像插值技术——双线性插值法

3.缩放

4.哈达玛变换

哈达玛变换

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值