- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章图文详解matlab原始处理图像几何变换由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
图像的平移很简单,平移前后的坐标分别为(x,y)和(x',y'),则满足的关系式为 。
x'= x +tx; 。
y'= y +ty; 。
其中tx与ty分别为对应的偏移量。 。
图像的比例也很简单,可以描述为:x'=s_x * x; y'=s_y * y,
那么上述的关系怎么用一个矩阵来表示呢?一个很重要的矩阵来了,那就是变换矩阵t,并且对于二维坐标下的点,一般转化为笛卡尔坐标系下进行计算,用一个三维点表示二维的,只不过把最后一项值置为1,这样一个二维坐标(x,y)就变为 (x,y,1)了。在把上述的平移等式关系转化为矩阵形式为:
。
比例等式关系为:
对于某个点,在坐标系中的变换为(旋转角度为θ,并且逆时针旋转为正):
那么可以看出,这个时候对应的旋转矩阵为t就如图上所示.
对称变换比较简单,还是以点的变换为例,比如变换前的点p(x,y)和变换后的点p'=(x',y'),那么对称变换包括点关于x轴、y轴、原点、y=x、y=-x等等,点的变换可以自己推导下,这样也就可以得到对应的变换矩阵t了.
比如,关于x对称的话,t=[1,0,0;0,-1,0;0,0,1],关于原点对称的话,t=[-1,0,0;0,-1,0;0,0,1];关于y=x对称的话,t=[0,1,0;1,0,0;0,0,1];等等.
下面再重点介绍下复合变换,因为有的变换不是简单的初等变换,但是有一点需要明确的是任何复合变换都可以用初等变换一步步变换而来。比如前面的旋转变换,旋转点选取的是原点,这样才有的那个公式,那要是旋转点不是原点怎么办?比如任一点s(x_f,y_f),那么点p绕着点s旋转一定的角度θ该怎么表示呢?这里就要把这个复合变换化成为3个简单的初等变换,具体步骤为:首先把s点平移操作至原点(这个过程中,相当于所有的点都按照一定的方向平移了),然后相当于在原点对平移后的p点进行旋转变换,变换完后再把这个店反平移回去,这样是不是就相当于完成了那个复合变换。此时的变换矩阵为t,则t可以看出是两次平移矩阵t1、t2和一次旋转矩阵t3相乘的组合,即t=t1*t3*t2,注意方向不能反,因为是矩阵相乘,反的话相乘的结果不一定相同.
那么这个时候总的变换矩阵t就是:
这个在编程实现原点移动位置时至关重要.
几何变换的基础知识就说到这,具体的可以再找相关文章了解.
matlab表示一副图像的方法很简单,对于灰度图像来说,就是一个二维矩阵,行与列存的就是像素点的位置,而矩阵值就是该像素点的灰度值。这里以有名的一副图lenna图为例,那么直接image=imread(‘lenna.jpg')就可以加载带matlab工作框中,显示的话imshow(image)就可以了,显示如下:
了解了变换的基本原理,要知道其中最重要的就是关于坐标的变换。如果以上图中的行和列都为1的点作为原点的话,变换的程序为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
%-------------函数说明----------------
% 比例变换
% 输入变量:img 灰白图像(彩色不行)
% s_x x方向上的比例系数
% s_y y方向上的比例系数
%-------------------------------------
function bili(img,s_x,s_y)
[m,n] = size(img);
new_matrix = ones(m,n);
t1 = [s_x,0,0;0,s_y,0;0,0,1]; %对应的比例系数矩阵
for
i=1:m
for
j=1:n
p =
floor
([i,j,1]*t1^-1);%由p_new = p_old*t 可得:p_old = p_new*(t^-1)
if
(p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围
new_matrix(i,j) = img(p(1),p(2)); %坐标变换关系
else
new_matrix(i,j) = 0; %没有的点赋值为0
end
end
end
figure;imshow(new_matrix,[]);
————————————————
版权声明:本文为csdn博主「on2way」的原创文章,遵循cc 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https:
//blog.csdn.net/on2way/article/details/40460675
|
这样运行对应程序:
bili(image,2,2)
bili(image,0.5,0.5)
可以看到,分别对图像扩大和缩小的时候,都是以行和列为1为原点来操作的。如果还是以这个点来进行旋转操作的话,就会非常不协调不好看。况且如果了解matlab本身自带这些旋转、比例操作函数的话会发现,这些函数操作原点是图像的正中心,这样操作起来后才很好看。那么现在的问题就是如何把图像的中心作为我们在坐标系下认为的原点呢?那就是上面讲到的三步走了,首先平移中心点至原点,再变换,再平移至中心点就好了。我们需要做的就是确定平移的行与列的长度(平移的长度应该是图像行与列总长度的一半吧,如果是把中心点当做原点的话)。基于此修改上述的程序如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
function bili(img,s_x,s_y)
[m,n] = size(img);
new_matrix = ones(m,n);
t2 = [1,0,0;0,1,0;-m/2,-n/2,1]; %x、y轴平移值原点
t3 = [1,0,0;0,1,0;m/2,n/2,1]; %x、y轴反平移
t1 = [s_x,0,0;0,s_y,0;0,0,1]; %对应的比例系数矩阵
t = t2*t1*t3; %p_new = p_old*t2*t1*t3 顺序不能错了
for
i=1:m
for
j=1:n
p =
floor
([i,j,1]*t1^-1);%由p_new = p_old*t 可得:p_old = p_new*(t^-1)
if
(p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围
new_matrix(i,j) = img(p(1),p(2)); %坐标变换关系
else
new_matrix(i,j) = 0; %没有的点赋值为0
end
end
end
% figure;imshow(img,[]);
figure;imshow(new_matrix,[]);
|
从程序可以看出,只是多了那么两个矩阵而已就可以实现原点的转移了.
运行相应程序,bili(image,2,2)
bili(image,0.5,0.5)
可以看出,这样操作以后是不是协调多了,基本上和matlab自带的函数有相同的功能了.
对称变换和上述变换差不多,无非修改相应的变换矩阵,程序如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
%-------------函数说明----------------
% 对称变换
% 输入变量:img 灰白图像(彩色不行)
% num 对称类型
% 0:原点对称,1:x轴对称,2:y轴对称
% 3:y=x轴对称 4:y=-x轴对称 其他。。
%-------------------------------------
function duichen(img,num)
[m,n] = size(img);
new_matrix = ones(m,n);
t2 = [1,0,0;0,1,0;-m/2,-n/2,1]; %x、y轴平移值原点
t3 = [1,0,0;0,1,0;m/2,n/2,1]; %x、y轴反平移
t_x = [1,0,0;0,-1,0;0,0,1]; %x轴对称矩阵
t_y = [-1,0,0;0,1,0;0,0,1]; %y轴对称矩阵
t_o = [-1,0,0;0,-1,0;0,0,1]; %原点对称矩阵
t_yx = [0,1,0;1,0,0;0,0,1]; %y=x对称的矩阵
t_xy = [0,-1,0;-1,0,0;0,0,1]; %y=-x对称的矩阵
switch
num %选择某一种对称方式
case
0
t = t2*t_o*t3 ;
case
1
t = t2*t_x*t3 ;
case
2
t = t2*t_y*t3 ;
case
3
t = t2*t_yx*t3 ;
case
4
t = t2*t_xy*t3 ;
end
for
i=1:m %对于每一个像素点
for
j=1:n
p =
floor
([i,j,1]*t^-1);%由p_new = p_old*t 可得:p_old = p_new*(t^-1)
if
(p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围
new_matrix(i,j) = img(p(1),p(2)); %坐标变换关系
else
new_matrix(i,j) = 0; %没有的点赋值为0
end
end
end
% figure;imshow(img,[]);
figure;imshow(new_matrix,[]);
————————————————
|
运行相应程序:
>> duichen(image,0) 。
>> duichen(image,2) 。
(4)旋转变换 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
%-------------函数说明----------------
% 旋转变换
% 输入变量:img 灰白图像(彩色不行)
% theat 变化的角度,逆时针旋转为正
%---------------------------------------
function xuanzhuan(img,theat)
[m,n] = size(img);
new_matrix = ones(m,n);
t2 = [1,0,0;0,1,0;-m/2,-n/2,1]; %x、y轴平移值原点
t3 = [1,0,0;0,1,0;m/2,n/2,1]; %x、y轴反平移
t1 = [
cos
(theat),
sin
(theat),0;-
sin
(theat),
cos
(theat),0;0,0,1];%旋转变换
t = t2*t1*t3; %p_new = p_old*t2*t1*t3 顺序不能错了
for
i=1:m
for
j=1:n
p =
floor
([i,j,1]*t^-1);%由p_new = p_old*t 可得:p_old = p_new*(t^-1)
if
(p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围
new_matrix(i,j) = img(p(1),p(2)); %坐标变换关系
else
new_matrix(i,j) = 0; %没有的点赋值为0
end
end
end
% figure;imshow(img,[]);
figure;imshow(new_matrix,[]);
|
运行相应程序:
>> xuanzhuan(image,pi/4) 。
>> xuanzhuan(image,-pi/3) 。
至此,一些基本的几何变换操作就完成了,其他的变换就在次基础上发挥了.
有一个问题是上述的变换在旋转的时候,原图的部分图像会被切割掉,这个是没有考虑到的,因为部分像素点在变换以后必然超出范围,对比matlab自带的旋转函数可以发现自带的函数是可以对出界的部分进行压缩到范围内。当然这一点我们也可以编程处理,不过稍微要麻烦点,必须对每个像素点再进行压缩处理,这个有待研究.
二维图像的几何变换大致如此了。那么引申一下,对于三维图像的几何变换怎么处理了?其实归结到底还是有一个变换矩阵t,而这个矩阵不再是3*3的了,这个时候增加了一维,那么对应的矩阵也得增加一维变成4*4的了,维数的增加必然带来处理上的更加复杂了,不过理解了二维变换的原理,再来处理三维的话还是很好处理的,弄清楚对应关系就可以了.
到此这篇关于matlab原始处理图像几何变换的文章就介绍到这了,更多相关matlab原始处理图像内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/on2way/article/details/40460675 。
最后此篇关于图文详解matlab原始处理图像几何变换的文章就讲到这里了,如果你想了解更多关于图文详解matlab原始处理图像几何变换的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在 Matlab 中,您可以选择创建新的“示例”脚本文件以及脚本、函数、类等。创建它们时,它们会获得一个脚本图标。 它们与其他标准脚本文件的处理方式有何不同? 是否有关于这些示例脚本类型的预期用途的文
我正在运行一个不是我自己编写的大 m 文件,它依赖于某些子函数。我想知道是否在所有嵌套函数的任何地方都使用了特定函数(在我的例子中是函数 eig.m(计算特征值))。有没有快速的方法来做到这一点? 亲
Matlab中有一个函数叫 copulafit .我怎样才能看到这个函数背后的代码?许多 Python 的 numpy 和 scipy 函数在 Github 上很容易开源,但由于某种原因我在 Gith
我定义了一个抽象基类measurementHandler < handle它定义了所有继承类的接口(interface)。这个类的两个子类是a < measurementHandler和 b < me
假设有一个矩阵 A = 1 3 2 4 4 2 5 8 6 1 4 9 例如,我有一个 Vector 包含该矩阵每一列的“类”
我有一个在后台运行的 Matlab 脚本。随着计算的进行,它会不断弹出进度栏窗口。这很烦人。 问题是我没有自己写 Matlab 脚本,这是一段很长很复杂的代码,我不想搞砸。那么如何在不修改 Matla
有没有办法从一个 matlab 程序中检测计算机上正在运行多少个 matlab 进程? 我想要恰好有 n 个 matlab 进程在运行。如果我的数量太少,我想创建它们,如果数量太多,我想杀死一些。您当
我正在测试我们在 Matlab 中开发的一个独立应用程序,当时我注意到它的内存使用量(根据 Windows 任务管理器)达到了 16gb 以上的数倍峰值。我决定在编译版本后面的脚本上使用 profil
我面临着一个相当棘手的问题。在 Matlab 中,命令 S = char(1044) 将俄语字母 д 放入变量 S。但是 disp(S) 返回空白符号,尽管内容实际上是正确的: >> S = char
我在这行 MATLAB 代码中遇到内存不足错误: result = (A(1:xmax,1:ymax,1:zmax) .* B(2:xmax+1,2:ymax+1,2:zmax+1) +
我正在寻找一种在 MATLAB 中比较有限顺序数据与非确定性顺序的方法。基本上,我想要的是一个数组,但不对包含的元素强加顺序。如果我有对象 a = [x y z]; 和 b = [x z y]; 我希
我有一个由 1 和 0 组成的二维矩阵。 mat = [0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1]; 我需
我可以在 Matlab 中用一组 x,y 点绘制回归线。但是,如果我有一组点(如下图),假设我有四组点,我想为它们绘制四条回归线……我该怎么做?所有的点都保存在 x,y 中。没有办法将它们分开并将它们
我正在尝试使用以下代码在 MATLAB 中绘制圆锥体。但是,当 MATLAB 生成绘图时,曲面中有一个间隙,如下图所示。谁能建议关闭它的方法? clearvars; close all; clc; [
我有一个 map称为 res_Map,包含一组不同大小的数组。我想找到用于存储 res_Map 的总内存。 正如您在下面看到的,看起来 res_Map 几乎不占用内存,而 res_Map 中的各个元素
有没有办法在 MATLAB 中组合 2 个向量,这样: mat = zeros(length(C),length(S)); for j=1:length(C) mat(j,:)=C(j)*S;
已结束。此问题不符合 Stack Overflow guidelines 。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答它。 关闭 5 年前
我正在尝试将MatLab中的t copula适配到我的数据,并且我的功能是: u = ksdensity(range_1, range_1,'function','cdf'); v = ksdens
大家好,我目前正在尝试使用论文“多尺度形态学图像简化”中的 SMMT 运算符 Dorini .由于没有订阅无法访问该页面,因此我将相关详细信息发布在这里: 请注意,我将相关文章的部分内容作为图片发布。
我在MATLAB中编写代码,需要使用一个名为modwt的函数,该函数同时存在于两个我同时使用的工具箱(Wavelet和WMTSA)中。问题在于,一个版本仅返回一个输出,而另一个版本则返回三个输出。我应
我是一名优秀的程序员,十分优秀!