ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

图像的缩放变换

2019-03-08 09:55:48  阅读:373  来源: 互联网

标签:缩放 变换 图像 100 ky kx 像素点


转:图像的缩放变换

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

我们首先来看看图像缩放操作。假设一幅图像是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()

è¿éåå¾çæè¿°

标签:缩放,变换,图像,100,ky,kx,像素点
来源: https://blog.csdn.net/qq_38619342/article/details/88327222

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有