python图像处理——图像形变与缩放

本文介绍Skimage库中transform模块的功能,包括图片尺寸调整、按比例缩放、图像旋转及图像金字塔实现等操作,并通过示例代码展示具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图像的形变与缩放,使用的是skimage的transform模块,函数比较多,功能齐全。
1、改变图片尺寸
函数格式为:
skimage.transform.resize(image,output_shape)
image:需要改变尺寸的图片
output_shape:新的图片尺寸

from skimage import transform,data
import matplotlib.pyplot as plt
img = data.camera()
dst=transform.resize(img, (80, 60))
plt.figure('resize')

plt.subplot(121)
plt.title('before resize')
plt.imshow(img,plt.cm.gray)

plt.subplot(122)
plt.title('before resize')
plt.imshow(dst,plt.cm.gray)

plt.show()

可以看到简爱嗯图片由原来512×512,变成来80×60。
这里写图片描述

2 按比例缩放
函数格式为:
skimage.transform.resize(image,scale[…..])
scale参数可以是单个floate数,表示缩放的倍数,也可是floate型tuple,如[0.2,0.5]表示将行列分开进行缩放。

from skimage import transform,data
img = data.camera()
print(img.shape)  #图片原始大小 
print(transform.rescale(img, 0.1).shape)  #缩小为原来图片大小的0.1倍
print(transform.rescale(img, [0.5,0.25]).shape)  #缩小为原来图片行数一半,列数四分之一
print(transform.rescale(img, 2).shape)   #放大为原来图片大小的2倍

3、旋转rotate
skimage.transform.rotate(image,angle[,…],resize=False)
angle参数是一个float类型,表示旋转度数
resize用于控制在旋转时,是否改变大小,默认为False

from skimage import transform,data
import matplotlib.pyplot as plt
img = data.camera()
print(img.shape)  #图片原始大小
img1=transform.rotate(img, 60) #旋转90度,不改变大小 
print(img1.shape)
img2=transform.rotate(img, 30,resize=True)  #旋转30度,同时改变大小
print(img2.shape)   

plt.figure('resize')

plt.subplot(121)
plt.title('rotate 60')
plt.imshow(img1,plt.cm.gray)

plt.subplot(122)
plt.title('rotate  30')
plt.imshow(img2,plt.cm.gray)

plt.show()

4、图像金字塔
以多分辨率来解释图像的一种有效但概念简单的结构就是图像金字塔。图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像集合。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。当向金字塔的上层移动时,尺寸和分辨率就降低。

在此,我们举一个高斯金字塔的应用实例,函数原型为:

skimage.transform.pyramid_gaussian(image, downscale=2)
import numpy as np
import matplotlib.pyplot as plt
from skimage import data,transform

image = data.astronaut()  #载入宇航员图片
rows, cols, dim = image.shape  #获取图片的行数,列数和通道数
pyramid = tuple(transform.pyramid_gaussian(image, downscale=2))  #产生高斯金字塔图像
#共生成了log(512)=9幅金字塔图像,加上原始图像共10幅,pyramid[0]-pyramid[1]

composite_image = np.ones((rows, cols + cols / 2, 3), dtype=np.double)  #生成背景

composite_image[:rows, :cols, :] = pyramid[0]  #融合原始图像

i_row = 0
for p in pyramid[1:]:
    n_rows, n_cols = p.shape[:2]
    composite_image[i_row:i_row + n_rows, cols:cols + n_cols] = p  #循环融合9幅金字塔图像
    i_row += n_rows

plt.imshow(composite_image)
plt.show()

这里写图片描述

### 图像处理中的像素变换 #### 缩放算法 图像缩放是指改变一幅图像尺寸大小的过程。当放大图像时,通常会引入新的像素点;而缩小图像则意味着要减少一些原有的像素点。为了保持图像质量,在执行这两种操作过程中都需要采用合适的插值方法来计算新位置上的颜色值[^3]。 ```python import cv2 resized_image = cv2.resize(src=image, dsize=None, fx=scale_factor_x, fy=scale_factor_y, interpolation=cv2.INTER_LINEAR) ``` 此代码片段展示了利用 OpenCV 库调整图像大小的一个例子,其中 `fx` 和 `fy` 参数分别代表沿 X 轴和 Y 轴的比例因子,`interpolation` 则指定了用于重采样的插值方式。 #### 旋转变换 对于图像旋转而言,一般先确定中心点作为旋转轴心,再按照指定角度顺时针或者逆时针转动整个画面。为了避免因坐标系变化带来的数据丢失问题,常采取反向映射策略——即针对目标空间内的每一个像素找到其对应于源图的位置并据此赋值[^4]。 ```python M = cv2.getRotationMatrix2D(center=(width / 2, height / 2), angle=-angle_degrees, scale=1.0) rotated_image = cv2.warpAffine(src=image, M=M, dsize=(width, height)) ``` 上述 Python 语句实现了基于给定参数获取二维仿射矩阵,并以此为基础完成实际的旋转操作。 #### 平移变换 平移指的是将图像整体沿着水平方向或垂直方向移动一定距离而不发生任何形变的行为。具体来说就是把每个像素都加上相同的偏移量从而达到位移效果[^1]。 ```c void translateImage(unsigned char* srcImg, unsigned char* dstImg, int width, int height, int offsetX, int offsetY){ for(int y = 0; y < height; ++y){ for(int x = 0; x < width; ++x){ if(x + offsetX >= 0 && x + offsetX < width && y + offsetY >= 0 && y + offsetY < height){ dstImg[(y+offsetY)*width+(x+offsetX)] = srcImg[y*width+x]; } } } } ``` 这段 C 语言程序演示了一个简单的图像平移过程,它遍历输入数组并将各元素复制到适当的新索引处。 #### 插值技术的应用 无论是哪种类型的几何变换都会涉及到不同坐标的相互转换,因此往往伴随着一定程度的信息损失风险。为此人们提出了多种插值方案用来弥补这种差距,比如最近邻法、双线性插值以及三次卷积等,它们各自有着不同的精度表现运算效率特点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值