图像几何变换

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

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:R1for j = 1:C1p = [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);endendend
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 : Rfor j = 1 : Ctemp = [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);  endend
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 : R1for j = 1 : C1temp = [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);endend
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>=0A=1-(a+3)*w^2+(a+2)*w^3;
else if w>=1&&w<2A=a*w^3-5*a*w^2+(8*a)*w-4*a;
elseA=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*kdx=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*kdy=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:rowfor j=1:colfor n=1:colorx = floor(i/R+0.5);y = floor(j/R+0.5);%为了避免出现‘位置 1 处的索引无效。数组索引必须为正整数或逻辑值’的问题。%Matlab中的数组或矩阵的下标最小为1if x==0x=x+1endif y==0y=y+1endM(i,j,n) = F(x,y,n);endend
endfigure(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:rowfor j = 1:colfor n = 1:colorx = floor(i/C);y = floor(j/C);if x == 0x = x+1;endif y ==0y = y+1;endu = i/C-floor(i/C); v = j/C-floor(j/C); %求出dx和dyif x==dx=x-1;endif y==ey=y-1;endA(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);endend
endfigure(3);
imshow(A)
end

20161117110940335.png:

2. 原理

1.平移


2.旋转

防止信息丢失方法:

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

解决方法:

旋转原理


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

3.缩放

4.哈达玛变换

哈达玛变换

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

  1. 数字图像处理 - 图像色彩平衡源码实现及解析

    1.色彩平衡概述 在摄影和图像处理中,色彩平衡是颜色(通常是红.绿.蓝三原色)强度的全局调整.此调整的一个重要目标是正确渲染特定颜色,尤其是白色或灰色等中性颜色. 颜色平衡.颜色校正和颜色分级通常可以 ...

  2. Matlab数字图像处理——图像的空间变换

    Matlab空间变换函数 imtransform Matlab空间变换函数 imtransform 可以实现图像仿射变换(如 平移.旋转.剪切.缩放).投影变换, 该函数可与 maketform 配合 ...

  3. matlab 求其骨架,数字图像处理图像的骨架生成和提取(Matlab)三种方法

    [实例简介] 数字图像处理图像的骨架生成和提取(Matlab),有三种方法,推荐给大家! [实例截图] [核心代码] Programe ├── Programe1 │   ├── 00.JPG │   ...

  4. matlab数字图像实验报告,数字图像处理实验报告(matlab)

    数字图像处理实验报告(matlab) 学院:自动化学院 班级:电081班 姓名:李林树 学号:40850099 2011年10月 实验一 直方图均衡化 一. 实验目的: 1. 熟悉图像数据在计算机中的 ...

  5. 《数字图像处理》冈萨雷斯matlab函数statmoments、计算均值和n阶中心矩,并返回行向量

    <数字图像处理>冈萨雷斯matlab函数statmoments statmoments:计算均值和n阶中心矩,并返回行向量 ○ [v, unv] = statmoments(p,n) ○ ...

  6. matlab图像处理基础实验,数字图像处理实验报告 Matlab图像处理基础

    <数字图像处理实验报告 Matlab图像处理基础>由会员分享,可在线阅读,更多相关<数字图像处理实验报告 Matlab图像处理基础(27页珍藏版)>请在人人文库网上搜索. 1. ...

  7. 计算机图像进行滤波的函数,数字图像处理图像滤波.ppt

    数字图像处理图像滤波 图像滤波 图像处理中所用到的图像往往含有噪声,需要用图像滤波的方法去除噪声. 内容框架 像素基础知识介绍 算术和逻辑运算 直方图 直方图均衡算法,用于图像锐化. 图像增强基本方法 ...

  8. 数字图像处理之在matlab中做彩色图像的加减乘除

    数字图像处理之在matlab中做彩色图像的加减乘除 图像与数做运算 clc; clear all; A = imread('C:\Users\Administrator\Desktop\333.jpg ...

  9. 数字图像处理图像反转的实现_使用8086微处理器反转16位数字

    数字图像处理图像反转的实现 Problem statement: 问题陈述: Write an assembly language program in 8086 microprocessor to ...

  10. 数字图像处理图像反转的实现_反转8位数字| 8085微处理器

    数字图像处理图像反转的实现 Problem statement: 问题陈述: To reverse 8 bits number using 8085 microprocessors. 使用8085微处 ...

最新文章

  1. html怎么做半圆形按钮,css3做出半圆弧线
  2. OpenCV形态转换Morphology Transformations
  3. 机器学习(三)逻辑回归以及python简单实现
  4. 三、PHP基础——HTTP协议 文件编程
  5. java unsafe park_Java魔法类——Unsafe应用解析
  6. Linux环境下的JFreeChart中文乱码问题解决办法
  7. jedis的源码理解-基础篇
  8. 洛谷 P1004 方格取数 WD
  9. 第十三次CCF CSP认证(2018年3月)真题URL映射
  10. 使用cdn和npm引入的区别_带你体验 Vue2 和 Vue3 开发组件有什么区别
  11. 人事管理系统都有哪些功能和优势?
  12. Other | 十招教你找到海量PPT模板
  13. mac 配置mysql 环境变量
  14. 使用GDI来绘制简易验证码
  15. Python头歌合集(题集附解)
  16. 重磅消息,Micrium的uCOS全家桶将推出免费商业授权
  17. win7配置本地ftp服务器
  18. pytorch 中 .detach() .detach_() 和 .data的区别
  19. 程序员版--致青春(一)——facejoking刷票工具(谈刷票原理)
  20. 201771010112罗松《面向对象程序设计(java)》第六周学习总结

热门文章

  1. 想把手机内容投屏到电脑 并且可以用电脑控制手机怎么办,很简单
  2. Android OpenGLES滤镜开发之贴纸效果
  3. springboot自定义启动图标
  4. Configure an Egress Gateway(0.8)
  5. Python之Sqlitespy中选出两表中以id相同的元素
  6. python内存泄漏_诊断和修复Python中的内存泄漏
  7. Mac 直接在word 中使用latex编辑公式
  8. 压缩包文件跟html不一样,为什么压缩文件还是那么大
  9. 4个手机使用必备小常识,没几个人全知道,了解完绝对涨知识
  10. 搭建前端错误监控系统