基于双线性插值的图像旋转原理及MATLAB实现(非自带函数)

您所在的位置:网站首页 图像插值运算不包括的是什么 基于双线性插值的图像旋转原理及MATLAB实现(非自带函数)

基于双线性插值的图像旋转原理及MATLAB实现(非自带函数)

2024-07-14 10:50| 来源: 网络整理| 查看: 265

目录 1.图像旋转的原理1.1.旋转矩阵1.2.双线性插值1.3.像素点匹配 2.实现效果与说明

1.图像旋转的原理 1.1.旋转矩阵

旋转一幅图像(假设这幅图像大小是矩形的),当然应该从像素点(pixels)开始,在直角坐标系中,对点 x 0 = [ a 0 b 0 ] x_0=\begin{bmatrix}a_0\\b_0\\ \end{bmatrix} x0​=[a0​b0​​]逆时针旋转角度 θ \theta θ到 x 1 = [ a 1 b 1 ] x_1=\begin{bmatrix}a_1\\b_1\\ \end{bmatrix} x1​=[a1​b1​​]的变换公式为 x 1 = [ c o s θ − s i n θ s i n θ c o s θ ] x 0 x_1=\begin{bmatrix}cos\theta ; -sin\theta \\ sin\theta ; cos\theta\\ \end{bmatrix}x_0 x1​=[cosθsinθ​−sinθcosθ​]x0​ 那么对图像上的每个点调用这个旋转公式,将旧图像像素点的RGB值搬移到新图像像素点,就可以将图像旋转到任意位置。 但是问题来了,显示屏的像素点是有限的,这意味着显示在显示屏上的像素点坐标必须是整数,旋转过后的图像的每个像素点坐标难免有非整数的情况,那么这种情况下我们怎么处理呢? 我们不妨假设逆时针旋转 θ \theta θ旋转后的图形上所有的像素点都是整点,对于旋转后的图形的每个像素点 x 1 x_1 x1​,求旋转前图形的对应像素点的坐标 x 0 x_0 x0​,取 ω = − θ \omega=-\theta ω=−θ为逆旋转角度,则旋转后的像素点和旋转前的像素点的对应关系为: x 0 = [ c o s ω − s i n ω s i n ω c o s ω ] x 1 x_0=\begin{bmatrix}cos\omega ; -sin\omega \\ sin\omega ; cos\omega\\ \end{bmatrix}x_1 x0​=[cosωsinω​−sinωcosω​]x1​ 此时 x 0 x_0 x0​不一定为整点, x 0 x_0 x0​的像素值需要做一定的近似。近似的方法有最近邻插值、双线性插值等等,在这里我们就介绍比较实用且不是很复杂的双线性插值,该插值方法不会产生明显失真现象。 对于像素点的旋转坐标函数编写如下: ①坐标旋转变换函数:rot.m

function y=rot(p,angle) %p=[x,y]为角度制 angle=angle*pi/180;%角度制输入进行计算 y=[cos(angle) -sin(angle);sin(angle) cos(angle)]*p'; end 1.2.双线性插值

对于x和y坐标非整数的非整点 x p x_p xp​,假设它周围的四个整点坐标分别为 x 11 , x 12 , x 21 , x 22 x_{11},x_{12},x_{21},x_{22} x11​,x12​,x21​,x22​(构成一个矩形)。假设第一维度是x坐标,第二维度是y坐标。则 x 11 ( 1 ) = x 21 ( 1 ) ≤ x p ( 1 ) ≤ x 12 ( 1 ) = x 22 ( 1 ) x_{11}(1)=x_{21}(1)≤x_p(1)≤x_{12}(1)=x_{22}(1) x11​(1)=x21​(1)≤xp​(1)≤x12​(1)=x22​(1) x 11 ( 2 ) = x 12 ( 2 ) ≥ x p ( 2 ) ≥ x 21 ( 2 ) = x 22 ( 2 ) x_{11}(2)=x_{12}(2)≥x_p(2)≥x_{21}(2)=x_{22}(2) x11​(2)=x12​(2)≥xp​(2)≥x21​(2)=x22​(2) 显然,即使 x p x_p xp​为整点,仍然存在这样的四个点 x 11 , x 12 , x 21 , x 22 x_{11},x_{12},x_{21},x_{22} x11​,x12​,x21​,x22​使得上式成立。 在下图中,P为非整点,存在4个整点 Q 12 , Q 11 , Q 22 , Q 21 Q_{12},Q_{11},Q_{22},Q_{21} Q12​,Q11​,Q22​,Q21​将P点包围在其中,设纵向比例系数 β = y − y 2 y 1 − y 2 \color{blue}\beta=\frac{y-y_2}{y_1-y_2} β=y1​−y2​y−y2​​,横向比例系数 α = x − x 1 x 2 − x 1 \color{blue}\alpha=\frac{x-x_1}{x_2-x_1} α=x2​−x1​x−x1​​颜色函数 F ( P ) F(P) F(P)在四个整点处的值分比为 F 12 , F 11 , F 22 , F 21 F_{12},F_{11},F_{22},F_{21} F12​,F11​,F22​,F21​,则P点的函数值 F P = β [ ( 1 − α ) F 11 + α F 21 ] + ( 1 − β ) [ ( 1 − α ) F 12 + α F 22 ] F_P=\beta[(1-\alpha)F_{11}+\alpha F_{21}]+(1-\beta)[(1-\alpha)F_{12}+\alpha F_{22}] FP​=β[(1−α)F11​+αF21​]+(1−β)[(1−α)F12​+αF22​]写成矩阵的形式即为: F P = [ 1 − α α ] [ F 11 F 12 F 21 F 22 ] [ β 1 − β ] F_P=\begin{bmatrix}1-\alpha ; \alpha \end{bmatrix}\begin{bmatrix} F_{11} ; F_{12} \\[2ex] F_{21} ; F_{22} \end{bmatrix}\begin{bmatrix}\beta \\[2ex] 1-\beta \end{bmatrix} FP​=[1−α​α​][F11​F21​​F12​F22​​][β1−β​] 在这里插入图片描述 对于灰度图像, F ( P ) F(P) F(P)是一维函数,对于RGB图像, F ( P ) = [ F R ( P ) F G ( P ) F B ( P ) ] F(P)=\begin{bmatrix}F_R(P) \\F_G(P) \\ F_B(P) \end{bmatrix} F(P)=⎣⎡​FR​(P)FG​(P)FB​(P)​⎦⎤​ 由于该公式较为复杂,可以单独编写双线性插值函数,输入为一个任意点坐标,和图像每个点的像素;输出为该点进行双线性插值后的颜色函数值。但需要主要的是,若给采集的4个周围整点,有其中一个超出了图像边界,考虑到图像边界一般为白色,则以白色为替代。检测点是否在画布内只需要条件判断语句就够了。 ②检测是否在画布内的判断程序:isinrect.m

function y=isinrect(plt,rect) if plt(1)>=rect(1) && plt(1)=rect(3) && plt(2)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3