Python一些基本的圖像操作和處理總結(jié)
一、Python圖像處理PIL庫
1.1 轉(zhuǎn)換圖像格式
# PIL(Python Imaging Library) from PIL import Image plt.rcParams['font.sans-serif'] = ['SimHei'] # 讀取的是圖像,cv.imread讀取的是array,Image.open()顯示的圖像是RGB pil_im=Image.open('pic/kobe_mamba.jpg') subplot(121),plt.title('原圖'),axis('off') imshow(pil_im) pil_im_gray=pil_im.convert('L') subplot(122),plt.title('灰度圖'),xticks(x,()),yticks(y,()) imshow(pil_im_gray)
# 轉(zhuǎn)換圖像格式 PIL中有九種不同模式。分別為1,L,P,RGB,RGBA,CMYK,YCbCr,I,F(xiàn)。 import matplotlib.pyplot as plt import numpy as np from PIL import Image plt.rcParams['font.sans-serif'] = ['SimHei'] pil_im=Image.open('pic/apple.jpg') # 模式1 二值圖像 pil_im_binary=pil_im.convert('1') subplot(231),plt.title('二值圖像'),axis('off'),imshow(pil_im_binary) pil_im_binary.getpixel((10,10)) # 模式2 L = R * 299/1000 + G * 587/1000+ B * 114/1000 灰度模式 0表示黑,255表示白 # 模式3 P模式為8位彩色圖像,通過RGB調(diào)色 pil_im_p=pil_im.convert('P') subplot(232),plt.title('調(diào)色P圖像'),axis('off'),imshow(pil_im_p) # 模式4 模式“RGBA”為32位彩色圖像,它的每個像素用32個bit表示,其中24bit表示紅色、綠色和藍(lán)色三個通道,另外8bit(255)表示alpha通道,255表示不透明。 pil_im_RGBA=pil_im.convert('RGBA') subplot(233),plt.title('RGBA圖像'),axis('off'),imshow(pil_im_RGBA) # 模式5 CMYK 三原色+黑色,每個像素由32位表示 # C = 255 - R, M = 255 - G, Y = 255 - B, K = 0 pil_im_CMYK=pil_im.convert('CMYK') subplot(234),plt.title('CMYK圖像'),axis('off'),imshow(pil_im_CMYK) #模式6 YCbcr 24位bit表示 Y= 0.257*R+0.504*G+0.098*B+16 Cb = -0.148*R-0.291*G+0.439*B+128 Cr = 0.439*R-0.368*G-0.071*B+128 pil_im_YCbCr=pil_im.convert('YCbCr') subplot(235),plt.title('YCbCr圖像'),axis('off'),imshow(pil_im_YCbCr) # 模式7 I模式略 與L模式顯示相同 ,只不過是32bit # 模式8 F模式略 像素保留小數(shù),其余與L模式相同
1.2 縮略圖
# PIL(Python Imaging Library) from PIL import Image from pylab import * plt.rcParams['font.sans-serif'] = ['SimHei'] pil_im=Image.open('pic/kobe_mamba.jpg') # 創(chuàng)建縮略圖 且可以指定大小 pil_im.thumbnail((120,120)) plt.title('縮略圖'),xticks(x,()),yticks([]) imshow(pil_im)
1.3 復(fù)制、粘貼和旋轉(zhuǎn)、調(diào)整尺寸
# 元組坐標(biāo)分別為(左、上、右、下),從而標(biāo)出了一塊區(qū)域,相當(dāng)于[100:400,100:400] box=(100,100,400,400) region=pil_im.crop(box) # 旋轉(zhuǎn)180度 region=region.transpose(Image.ROTATE_180) figure(figsize=(5,5)) plt.title('復(fù)制區(qū)域'),axis('off') imshow(region) #粘貼 pil_im=Image.open('pic/kobe_mamba.jpg') pil_im.paste(region,box) figure(figsize=(5,5)) plt.title('粘貼后的圖像'),axis('off') imshow(pil_im) # 調(diào)整尺寸和旋轉(zhuǎn) resize 和 rotate 函數(shù) out=pil_im.resize((128,128)) out=pil_im.rotate(45)
第二張圖是box旋轉(zhuǎn)了180度再粘貼的結(jié)果
二、Matoplotlib庫基礎(chǔ)學(xué)習(xí)
# 基本繪圖 import numpy as np import matplotlib.pyplot as plt from numpy import pi from pylab import * x=np.linspace(-pi,pi,256) y,z=np.cos(x),np.sin(x) figure() plt.plot(x,y) figure() plt.plot(x,z) plt.show()
兩張繪圖
x=np.linspace(-pi,pi,256) y,z=np.cos(x),np.sin(x) plt.plot(x,y) plt.plot(x,z)
繪圖疊加
# 曲線顏色、標(biāo)記、粗細(xì) plot(x, y, color="blue", linewidth=1.0, linestyle=":") plot(x,z,'--r',linewidth=2.0)
# 離散取值 a=np.arange(13)*pi/12 b=cos(3*a) plot(a,b,'bo',markersize=3)
# 離散取值的屬性及用虛線相連 a=np.arange(13)*pi/12 b=cos(3*a) plot(a,b,'--rs',markeredgecolor='y',markerfacecolor='w')
# 設(shè)置坐標(biāo)軸的范圍和記號 x=np.linspace(-pi,pi,256) y,z=np.cos(x),np.sin(x) xlim(-4,4) xticks(np.linspace(-4,4,10)) ylim(-1.0,1.0) yticks(np.linspace(-1.0,1.0,5)) plt.plot(x,y,'--r')
# 設(shè)置title與坐標(biāo)軸的一些操作 # 設(shè)置中文 matplotlib.rcParams['axes.unicode_minus'] =False plt.rcParams['font.sans-serif'] = ['SimHei'] x=np.linspace(-pi,pi,256) y,z=np.cos(x),np.sin(x) figure() plt.plot(x,y) axis('off') figure() plt.plot(x,z) plt.xticks([]) plt.show()
# 設(shè)置title與坐標(biāo)軸的一些操作 # 設(shè)置中文 matplotlib.rcParams['axes.unicode_minus'] =False plt.rcParams['font.sans-serif'] = ['SimHei'] x=np.linspace(-pi,pi,256) y,z=np.cos(x),np.sin(x) figure() plt.plot(x,y) axis('off') figure() plt.plot(x,z) plt.xticks([]) plt.show()
#設(shè)置坐標(biāo)軸的標(biāo)簽(多樣化) # xticks(locs, [labels], **kwargs) # Set locations and labels **kwargs是關(guān)鍵字參數(shù) import calendar x = range(1,13,1) y = range(1,13,1) plt.plot(x,y) # 標(biāo)簽手動設(shè)置('','','',...)亦可 plt.xticks(x, calendar.month_name[1:13],color='m',rotation=45,fontsize=12,fontname='Arial') plt.show()
# 設(shè)置圖例 matplotlib.rcParams['axes.unicode_minus'] =False plt.rcParams['font.sans-serif'] = ['SimHei'] a=np.arange(13)*pi/12 b=cos(3*a) plt.plot(a,b,'--rs',markeredgecolor='y',markerfacecolor='w',label='cos的圖像') xlabel('橫軸') ylabel('縱軸') plt.legend(loc='upper right') plt.show()
# 子圖1 matplotlib.rcParams['axes.unicode_minus'] =False x=np.linspace(-pi,pi,10) y,z=np.cos(x),np.sin(x) fig, (ax1 ,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4)) ax1.plot(x,y),ax2.plot(x,z) ax1.set_title('cos'),ax2.set_title('sin') plt.show()
# 子圖2 matplotlib.rcParams['axes.unicode_minus'] =False x=np.linspace(-pi,pi,10) y,z=np.cos(x),np.sin(x) figure(figsize=(10,5),dpi=80) subplot(121),plt.plot(x,y),plt.title('cos') subplot(122),plt.plot(x,z),plt.title('sin') plt.show()
2.1 繪制實際圖像中的點和線
# 使用matplotlib連線 from PIL import Image from pylab import * # 讀取為列表,以便標(biāo)記x、y的點? im=array(Image.open('pic/kobe_mamba.jpg')) imshow(im) # 列表 包含四個點坐標(biāo) x=[100,100,400,400] y=[200,500,200,500] #紅色叉型標(biāo)出 plot(x,y,'rx') # 連接坐標(biāo)的前兩個點的線 (100,200)與(100,500) plot(x[:2],y[:2]) show()
2.2 圖像輪廓與直方圖
# contour 與 hist # 繪制輪廓要將圖像先灰度化 from PIL import Image from pylab import * im=array(Image.open('pic/kobe_mamba.jpg').convert('L')) figure() # gray() # 繪制輪廓,且起始位置從左上角開始 contour(im,origin='image') # 坐標(biāo)軸均勻分布 axis('equal') # 新圖像 figure() hist(im.ravel(),256) # hist的第二個參數(shù)指定小區(qū)間的個數(shù),128個,即每個小區(qū)間灰度值跨度為2 figure() hist(im.flatten(),128) show()
三、Numpy庫基本學(xué)習(xí)
import numpy as np import math a=np.array(((1,2,3),(4,5,6)),dtype=float/complex) a
b=np.arange(15).reshape(3,5) b # 屬性 b.shape b.ndim b.dtype b.size b.itemsize
from numpy import pi np.linspace( 0, 2, 9 ) # 9 numbers from 0 to 2 array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
c=np.random.random((2,3)) c.max/min()
d=np.arange(12).reshape((3,4)) d.dtype.name # 每個col的sum print(d.sum(axis=0)) # 每行的累計和 print(d.cumsum(axis=1))
# 轉(zhuǎn)變數(shù)組類型 a=np.array(((1,2,3),(4,5,6)),'float32') a=a.astype('int16') a
# 索引和切片 a = np.arange(10)**3 # 0~9的立方 a[2:5] #a[2-4] # 令a[0,2,4]為-1000 a[:6:2] = -1000 # reverse a[ : :-1]
a = np.arange(12).reshape((3,4)) a[0:3,1] # 第2列 # or a[:,1] a[0:1,0:3]
# 變換為1維數(shù)組 a = np.arange(12).reshape((3,4)) a.ravel()
# 變換形狀 a = np.arange(12).reshape((3,4)) a.resize((6,2)) a
a = np.arange(12).reshape((3,4)) b=10*np.random.random((3,4)) # 豎著疊加 np.vstack((a,b)) # 橫著疊加 np.hstack((a,b))
x, y = np.ogrid[:3, :4] # 同樣可以設(shè)置步長 x, y = np.ogrid[0:3:1, 0:5:2] # 詢問,x>0的部分不變,其余賦值為2 np.where(x>0,x,2)
3.1 直方圖均衡化
# 解釋累加函數(shù) import numpy as np a=[1,2,3,4,5,6,7] cdf=np.cumsum(a) cdf[-1] cdf=7*cdf/cdf[-1] cdf
28
# 直方圖均衡化 # bins 小區(qū)間的個數(shù) def histeq(im,bins=256): #返回兩個參數(shù) imhist,bins=histogram(im.flatten(),bins) # 累計分布函數(shù),相當(dāng)于cdf是一個列表 cdf=imhist.cumsum() # cdf[-1]是列表的最后一個值,(0,255) cdf=255*cdf/cdf[-1] # 新的線性插值 im2=interp(im.flatten(),bins[:-1],cdf) # 返回im2圖像大小與im相同 return im2.reshape(im.shape),cdf # 直方圖先轉(zhuǎn)為灰度圖 im=array(Image.open('pic/kobe_mamba.jpg').convert('L')) im2,cdf=histeq(im,256) figure() imshow(im2) figure() hist(im2.flatten(),256) show()
3.2 圖像縮放
# 轉(zhuǎn)換為array img = np.asarray(image) # 轉(zhuǎn)換為Image Image.fromarray(np.uint8(img)) # 圖像縮放函數(shù) def imresize(im,sz): # 將數(shù)組轉(zhuǎn)換為圖像 pil_im=Image.fromarray(np.uint8(im)) # 圖像轉(zhuǎn)換為數(shù)組 return np.array(pil_im.resize(sz)) imshow(imresize(Image.open('pic/kobe_mamba.jpg'),(128,128)))
3.3 圖像的主成分分析(PCA)
PCA(Principal Component Analysis,主成分分析)是一個非常有用的降維技巧。它可以在使用盡可能少維數(shù)的前提下,盡量多地保持訓(xùn)練數(shù)據(jù)的信息,在此意義上是一個最佳技巧。即使是一幅 100×100 像素的小灰度圖像,也有 10 000 維,可以看成 10 000 維空間中的一個點。一兆像素的圖像具有百萬維。由于圖像具有很高的維數(shù),在許多計算機視覺應(yīng)用中,我們經(jīng)常使用降維操作。PCA 產(chǎn)生的投影矩陣可以被視為將原始坐標(biāo)變換到現(xiàn)有的坐標(biāo)系,坐標(biāo)系中的各個坐標(biāo)按照重要性遞減排列。
為了對圖像數(shù)據(jù)進(jìn)行 PCA 變換,圖像需要轉(zhuǎn)換成一維向量表示。我們可以使用 NumPy 類庫中的flatten() 方法進(jìn)行變換。
將變平的圖像堆積起來,我們可以得到一個矩陣,矩陣的一行表示一幅圖像。在計算主方向之前,所有的行圖像按照平均圖像進(jìn)行了中心化。我們通常使用 SVD(Singular Value Decomposition,奇異值分解)方法來計算主成分;但當(dāng)矩陣的維數(shù)很大時,SVD 的計算非常慢,所以此時通常不使用 SVD 分解。
from PIL import Image from numpy import * def pca(X): """ 主成分分析: 輸入:矩陣X ,其中該矩陣中存儲訓(xùn)練數(shù)據(jù),每一行為一條訓(xùn)練數(shù)據(jù) 返回:投影矩陣(按照維度的重要性排序)、方差和均值""" # 獲取維數(shù) num_data,dim = X.shape # 數(shù)據(jù)中心化 mean_X = X.mean(axis=0) X = X - mean_X if dim>num_data: # PCA- 使用緊致技巧 M = dot(X,X.T) # 協(xié)方差矩陣 e,EV = linalg.eigh(M) # 特征值和特征向量 tmp = dot(X.T,EV).T # 這就是緊致技巧 V = tmp[::-1] # 由于最后的特征向量是我們所需要的,所以需要將其逆轉(zhuǎn) S = sqrt(e)[::-1] # 由于特征值是按照遞增順序排列的,所以需要將其逆轉(zhuǎn) for i in range(V.shape[1]): V[:,i] /= S else: # PCA- 使用SVD 方法 U,S,V = linalg.svd(X) V = V[:num_data] # 僅僅返回前nun_data 維的數(shù)據(jù)才合理 # 返回投影矩陣、方差和均值 return V,S,mean_X
四、Scipy
4.1 圖像模糊
# 圖像模糊 # Scipy 庫 from PIL import Image from numpy import * from scipy.ndimage import filters im=array(Image.open('pic/building.tif').convert('L')) # filters.gaussian_filter第二個參數(shù)是標(biāo)準(zhǔn)差 im2=filters.gaussian_filter(im,9) imshow(im2)
from PIL import Image # 彩色通道,三通道分別進(jìn)行高斯濾波 im=array(Image.open('pic/landmark500x500.jpg')) im2=np.zeros((im.shape)) for i in arange(3): im2[:,:,i]=filters.gaussian_filter(im[:,:,i],2) # 轉(zhuǎn)換為(0,255),否則imshow顯示不出來 im2=uint8(im2) figure(figsize=(5,5),dpi=80) imshow(im2) axis('off')
4.2 圖像導(dǎo)數(shù)
from PIL import Image from numpy import * from scipy.ndimage import filters # filters.sobel(src,0/1,dst),0表示y方向的方向?qū)?shù),1表示x方向的方向?qū)?shù) figure() im=array(Image.open('pic/building.tif')) imshow(im) imx=np.zeros(im.shape) imy=np.zeros(im.shape) filters.sobel(im,0,imy) figure() imx=uint8(imy) imshow(imy) figure() filters.sobel(im,1,imx) imy=uint8(imx) imshow(imx) figure() mag=sqrt(imx**2+imy**2) mag=uint8(mag) imshow(mag) show()
第二/三張圖是sobel算子在x/y方向的導(dǎo)數(shù),第四張圖是兩個導(dǎo)數(shù)疊加成梯度。
4.3 形態(tài)學(xué)計數(shù)
# 形態(tài)學(xué) 對象計數(shù) from scipy.ndimage import measurements,morphology im=array(Image.open('pic/zhiwen.tif').convert('L')) im2=np.zeros(im.shape) im2=1*(im<128) labels,nbr_objects=measurements.label(im2) print(f"Number of objects is {nbr_objects}.") labels=np.uint8(labels) imshow(labels) im_open=morphology.binary_opening(im2,ones((3,3)),1) labels_open,nbr_objects_open=measurements.label(im_open) print(f"Number of objects is {nbr_objects_open}.") imshow(labels_open)
形態(tài)學(xué)計數(shù)使用label()函數(shù),令圖像的灰度值為標(biāo)簽,圖一找到了114個物體,圖二經(jīng)過開操作,找到了17個物體。
到此這篇關(guān)于Python一些基本的圖像操作和處理總結(jié)的文章就介紹到這了,更多相關(guān)Python圖像操作和處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Scrapy框架基本命令與settings.py設(shè)置
這篇文章主要介紹了Scrapy框架基本命令與settings.py設(shè)置,結(jié)合實例形式分析了創(chuàng)建爬蟲項目、創(chuàng)建爬蟲文件、存儲、打開網(wǎng)頁及settings.py設(shè)置等相關(guān)操作技巧,需要的朋友可以參考下2020-02-02Python+OpenCV圖像處理——打印圖片屬性、設(shè)置存儲路徑、調(diào)用攝像頭
這篇文章主要介紹了Python+OpenCV圖像處理——打印圖片屬性、設(shè)置存儲路徑、調(diào)用攝像頭的示例,幫助大家更好的利用python處理圖片,感興趣的朋友可以了解下2020-10-10python?aeon庫進(jìn)行時間序列算法預(yù)測分類實例探索
這篇文章主要介紹了python?aeon庫進(jìn)行時間序列算法預(yù)測分類實例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02Python中import導(dǎo)入不同目錄的模塊方法詳解
這篇文章主要介紹了Python中import導(dǎo)入不同目錄的模塊方法詳解,需要的朋友可以參考下2020-02-02Windows下安裝python2.7及科學(xué)計算套裝
這篇文章主要向大家介紹的是在windows系統(tǒng)下安裝python 2.7以及numpy安裝、six安裝、dateutil安裝、pyparsing安裝、matplotlib安裝和scipy安裝的方法,分享給大家,需要的小伙伴可以參考下,相對來說,windows下的安裝還是比較簡單的。2015-03-03