600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 数字图像处理--图像的缩放变换

数字图像处理--图像的缩放变换

时间:2021-04-17 10:19:20

相关推荐

数字图像处理--图像的缩放变换

在日常工作中,我们经常需要对图像进行缩放(放大、缩小),旋转平移等各种操作,这类操作统称为图像的几何变换。相对于前面提到的灰度变换,几何变换是改变了原图像像素点在新图像中的空间位置。

我们首先来看看图像缩放操作。假设一幅图像是100×100像素大小,放大一倍后是200×200大小。图像中的每一个像素点位置可以看作是一个点,也可以看作是二维平面上的一个矢量。图像缩放,本质上就是将每个像素点的矢量进行缩放,也就是将矢量x方向和y方向的坐标值缩放。也就是[x,y][x, y][x,y]变成了[kx⋅x,ky⋅y][k_x \cdot x,k_y\cdot y][kx​⋅x,ky​⋅y],一般情况下kx=kyk_x=k_ykx​=ky​,但是很多时候也不相同,例如将100×100的图像变成400×300的图像。学过线性代数的同学很快就能知道,这可以表示成矩阵乘法的形式:

[uv]=[kx00ky][xy]\begin{aligned} {\left[ \begin{array}{ccc} u\\ v\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} k_x & 0 \\ 0 & k_y\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x\\ y\\ \end{array} \right ]} \end{aligned} [uv​]=[kx​0​0ky​​][xy​]​

通过上述矩阵乘法的形式,我们就把原图像上的每一个像素点映射到新图像上相应的像素点了,这称为前向映射

但是,我们很快注意到,原始图像有100×100=10000个像素点,而变换后的图像是200×200=40000个像素点。纵使把原始图像的10000个像素点全部映射到新图像上的对应点上,新图像上仍然有40000-10000=30000个点没有与原图像进行对应,那这30000个像素点的灰度值从何而来呢?

我们把上面的矩阵表达式稍微转换下,两边乘以放大矩阵的逆矩阵:

[kx00ky]−1[uv]=[xy]\begin{aligned} { \left[ \begin{array}{ccc} k_x & 0 \\ 0 & k_y\\ \end{array} \right ] }^{-1}{\left[ \begin{array}{ccc} u\\ v\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} x \\ y\\ \end{array} \right ]} \end{aligned} [kx​0​0ky​​]−1[uv​]=[xy​]​

通过上面的式子,我们可以将新图像中的每一个像素点[u,v][u, v][u,v]与原图像中的一个像素点[x,y][x, y][x,y]对应起来了。这称为后向映射。显然后向映射比前向映射更有效。

import cv2import numpy as nplenna100 = cv2.imread("lenna100.png", 0)row, col = lenna100.shapekx, ky = 2, 2A = np.mat([[kx, 0], [0, ky]])lenna200 = np.zeros((kx * row, ky * col))for r in range(kx * row):for l in range(ky * col):v = np.dot(A.I, np.array([r, l]).T)lenna200[r, l] = lenna100[int(v[0, 0]), int(v[0, 1])]cv2.imshow("lenna100", lenna100)cv2.imshow("lenna200", lenna200.astype("uint8"))cv2.waitKey()1234567891011121314151617

转载自:/saltriver/article/details/79680067

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。