上一篇:
数字图像处理与机器视觉-4-直方图均衡化
首先明确一点,图像几何变换不改变像素的值。例如,平移,旋转,镜像等。但是也会遇到特殊情况 ,比如旋转角度不是90°的整数倍,会出现原图像素在新图中没有位置(映射后位置不为整数),这时候还需要用插值法来补充。
几何变换过程可以概括为:
其中x和y坐标映射关系分别为:
假设原图为I,变换后的图为J,新图J中的点(x1,y1),算法大概原理是:
1.确定变换后新图J的尺寸(w,h);2.通过逆变换求得新图中点(x1,y1)在原图中对应的点(x0,y0),需要注意的是,逆变换后的点坐标可能不是整数,需要通过插值转换成整数;3.判断(x0,y0)是否在原图区域内,如果在,则将I(x0,y0)的像素值赋给J(x1,y1);不在则直接将J(x1,y1)赋为(0,0);
下面来见识下图像变换里最最基础的变换
图像平移
这个应该是几何变换中最简单了,不用考虑变换后像素点坐标不为整数的情况,变换函数为:
矩阵变换:
木有接触过
灰度形态学,书上的方法先不管了,有兴趣的可以敲下书上示例代码;
按照之前的变换算法,MATLAB实现如下:
function O = translate(I,x,y)
%translate image I
% Detailed explanation goes here
[m,n] = size(I);
O = zeros(m,n);
for i = 1 : m
for j = 1 : n
if i - x > 0 && i - x < m + 1 && j - y > 0 && j - y < n + 1
O (i,j) = I(i - x, j - y);
% else %这里默认超过边界的像素为0,黑色
% O (i,j) = 0;
% end
end
end
O = uint8(O);
end
上效果图:
图像镜像
分为水平镜像和垂直镜像,话不多说,直接上矩阵表达式:
MATLAB实现:
imtransform 用于一般的二维空间变换
B = imtransform(A,
TFORM,method);
TFORM是具体的变换类型,
method是选择变换后用哪种插值方法
定义变换类型的函数为,T = maketform(transformtype,Matrix);
transformtype有如下几个选项(参见'maketform'函数用法)
'affine':在二维或n维仿射变换,什么是仿射变换,可以理解为线性变换+平移;变换前是直线的,变换后依然是直线,并且比例保持不变。参考
如何通俗的讲解仿射变换
'projective':在二维或n维投影变换;
'custom':用户自定义变换;
'box':每个维度的独立仿射变换(平移和缩放);
'composite':任意多个基本变换的组合;
效果图:
总的来说,平移和镜像变换都比较简单,理解起来没有什么难度,就是要多熟悉下MATLAB函数和处理方法。