Python進(jìn)行圖像變換和插值操作詳解
圖像變換
盡管numpy提供了一些矩陣函數(shù),但圖像處理是一個(gè)十分浩瀚的領(lǐng)域,numpy的體量顯然有些不夠。相比之下,【scipy】封裝了【ndimage】模塊,即專(zhuān)用的多維數(shù)組處理模塊,自然也涵蓋了二維圖像的處理。
ndimage中提供了對(duì)數(shù)組進(jìn)行平移、縮放以及旋轉(zhuǎn)操作的函數(shù),分別是shift, zoom, rotate,可以實(shí)現(xiàn)下面的變換效果
import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import * from scipy.misc import face img = face() imDct = { "original": img, "shift" : shift(img, [50, 50, 0]), "zoom" : zoom(img, [1.5, 2, 1]), "rotate" : rotate(img, 15, axes=(1,0)) } fig = plt.figure() for i, key in enumerate(imDct): fig.add_subplot(2,2,i+1) plt.imshow(imDct[key]) plt.title(key) plt.axis('off') plt.show()
除了輸入圖像外,平移和縮放均有一個(gè)參數(shù),表示圖像數(shù)據(jù)的三個(gè)坐標(biāo)軸寬、高、通道的平移與縮放情況;旋轉(zhuǎn)有兩個(gè)參數(shù),分別表示旋轉(zhuǎn)角度和旋轉(zhuǎn)軸。
這些變換都是通過(guò)插值來(lái)實(shí)現(xiàn)的,通過(guò)參數(shù)order可以指定幾何變換的插值次數(shù),參數(shù)prefilter若設(shè)為為T(mén)rue,則會(huì)在插值前進(jìn)行樣條濾波。
從上圖可知,當(dāng)平移和旋轉(zhuǎn)在對(duì)原數(shù)組進(jìn)行操作后,空出來(lái)的區(qū)域會(huì)被填補(bǔ)為黑色,這由兩個(gè)參數(shù)決定,參數(shù)mode用于指定填充方法,默認(rèn)為constant模式,在此模式下,會(huì)用某個(gè)常數(shù)來(lái)填充空余區(qū)域,這個(gè)數(shù)值由參數(shù)cval指定。
填充模式
設(shè)數(shù)組中的值為a b c d,當(dāng)mode參數(shù)取不同的模式時(shí),其填充方法如下
reflect/grid-mirror 反射取點(diǎn)【d c b a | a b c d | d c b a】
mirror 反射取點(diǎn),不包括邊緣點(diǎn) 【d c b | a b c d | c b a】
constant/grid-constant 添加常數(shù)k【k k k k | a b c d | k k k k】
grid-constant 【k k k k | a b c d | k k k k】
nearest 就近取點(diǎn) 【a a a a | a b c d | d d d d】
grid-wrap 循環(huán)處理 【a b c d | a b c d | a b c d】
wrap 循環(huán)處理,不包括邊緣點(diǎn)【d b c d | a b c d | b c a b】
下面以旋轉(zhuǎn)為例,進(jìn)一步對(duì)比不同mode下的變換效果,旋轉(zhuǎn)函數(shù)中有一個(gè)axes參數(shù),表示旋轉(zhuǎn)所在的坐標(biāo)平面。
imDct = { "mirror" : rotate(img, 15, axes=(1,0), mode='mirror'), "reflect" : rotate(img, 30, axes=(1,0), mode='reflect'), "nearest" : rotate(img, 45, axes=(1,0), mode='nearest'), } fig = plt.figure() for i, key in enumerate(imDct): fig.add_subplot(1,3,i+1) plt.imshow(imDct[key]) plt.title(key) plt.axis('off') plt.show()
效果如下
圖像插值
由于數(shù)組本身是格點(diǎn)化了的,所以對(duì)數(shù)組的旋轉(zhuǎn)、平移和縮放,并不像實(shí)數(shù)空間中那么簡(jiǎn)單。以一維的平移為例,現(xiàn)有三個(gè)點(diǎn),坐標(biāo)為0,1,2,值對(duì)應(yīng)為a,b,c,現(xiàn)在將這個(gè)數(shù)軸向右平移0.5,則這a,b,c三個(gè)點(diǎn)的坐標(biāo)就變成了0.5,1.5,2.5,但數(shù)組中不允許出現(xiàn)非整數(shù)的坐標(biāo),所以顯示的仍然是0,1,2位置處的值,所以就需要通過(guò)0.5,1.5,2.5位置處的值,來(lái)插值得到0,1,2位置處的值。
幾何變換中所用到的插值方法,就是樣條插值,而樣條插值的核心步驟,是根據(jù)臨近點(diǎn)做數(shù)據(jù)擬合,擬合時(shí)最重要的參數(shù)就是階數(shù),這也是旋轉(zhuǎn)、縮放等操作中order參數(shù)的源頭。
在【ndimage】中,提供了一維樣條插值和多維樣條插值函數(shù),分別是spline_filter1d和spline_filter,這兩個(gè)函數(shù)的參數(shù)也包括order和mode。而一維插值函數(shù)還有一個(gè)坐標(biāo)軸選項(xiàng),用以約定插值的方向,其差別如下。
繪圖代碼為
import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import * ori = np.eye(20) ori[10, :] = 1.0 fDct = { "ori" : ori, "axis_0" : spline_filter1d(ori, axis=0), "axis_1" : spline_filter1d(ori, axis=1), "multi axis, order=3" : spline_filter(ori, order=3), "multi axis, order=4" : spline_filter(ori, order=4), "multi axis, order=5" : spline_filter(ori, order=5) } fig = plt.figure() for i, key in enumerate(fDct): fig.add_subplot(2, 3, i+1) plt.imshow(fDct[key], cmap='gray_r') plt.title(key) plt.show()
到此這篇關(guān)于Python進(jìn)行圖像變換和插值操作詳解的文章就介紹到這了,更多相關(guān)Python圖像變換和插值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3 實(shí)現(xiàn)串口兩進(jìn)程同時(shí)讀寫(xiě)
今天小編就為大家分享一篇Python3 實(shí)現(xiàn)串口兩進(jìn)程同時(shí)讀寫(xiě),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06Django框架基礎(chǔ)模板標(biāo)簽與filter使用方法詳解
這篇文章主要介紹了Django框架基礎(chǔ)模板標(biāo)簽與filter使用方法,簡(jiǎn)單分析了Django模板基本語(yǔ)法、函數(shù)與自定義filter相關(guān)使用技巧,需要的朋友可以參考下2019-07-07Python實(shí)現(xiàn)數(shù)據(jù)清洗的示例詳解
這篇文章主要通過(guò)五個(gè)示例帶大家深入了解下Python實(shí)現(xiàn)數(shù)據(jù)清洗的具體方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2022-08-08python selenium實(shí)現(xiàn)智聯(lián)招聘數(shù)據(jù)爬取
這篇文章主要介紹了python selenium實(shí)現(xiàn)智聯(lián)招聘數(shù)據(jù)爬取,需要的朋友可以參考下2021-04-04Python?裝飾器常用的創(chuàng)建方式及源碼示例解析
裝飾器(decorator)是一種高級(jí)Python語(yǔ)法,可以對(duì)一個(gè)函數(shù)、方法或者類(lèi)進(jìn)行加工,這篇文章主要介紹了Python?裝飾器常用的創(chuàng)建方式及解析,需要的朋友可以參考下2022-04-04