图像的缩放变换

转:图像的缩放变换

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

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


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

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

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

 

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

import cv2
import numpy as np

lenna100 = cv2.imread("lenna100.png", 0)
row, col = lenna100.shape
kx, ky = 2, 2
A = 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()

è¿éåå¾çæè¿°

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值