1. 程式人生 > >Python學習07_影象的形變與縮放

Python學習07_影象的形變與縮放

轉自:http://www.cnblogs.com/denny402/p/5124152.html

影象的形變與縮放,使用的是skimage的transform模組,函式比較多,功能齊全。

1、改變圖片尺寸resize

函式格式為:

skimage.transform.resize(imageoutput_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()
複製程式碼

將camera圖片由原來的512*512大小,變成了80*60大小。從下圖中的座標尺,我們能夠看出來:

2、按比例縮放rescale

函式格式為:

skimage.transform.rescale(image, scale[, ...])

scale引數可以是單個float數,表示縮放的倍數,也可以是一個float型的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倍

結果為:

(512, 512)
(51, 51)
(256, 128)
(1024, 1024)

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)
downscale控制著金字塔的縮放比例
複製程式碼
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()
複製程式碼

上右圖,就是10張金字塔影象,下標為0的表示原始影象,後面每層的影象行和列變為上一層的一半,直至變為1

除了高斯金字塔外,還有其它的金字塔,如:

skimage.transform.pyramid_laplacian(image, downscale=2):