Python資料分析中的Numpy影象處理實操!
Numpy應用案例
注:使用numpy庫來對影象進行處理。這裡我們使用matplotlib.pyplot的相關方法來輔助。處理影象的時候,顏色都是使用RGB三個通道進行疊加而形成的一個顏色 R:紅色通道G:綠色B: 藍色可以使用三維的陣列來表示一張圖片
最高維度0:圖片的高度 次高維1:圖片的寬度 最低維2:RGB三個元素
In [2]:
import numpy as np
import matplotlib。pyplot as plt
影象讀取與顯示
plt。imread:讀取影象,返回影象的陣列(三維陣列)。
plt。imshow:顯示影象。
plt。imsave:儲存影象。
說明:
imread方法預設只能處理png格式的影象,如果需要處理其他格式的影象,需要安裝pillow庫。
In [62]:
a=plt。imread(“1。jpg”) # 將圖片資訊讀取成陣列資訊
# 返回的資訊是一個三維的陣列
# 最高維度:一共有332個元素
# 次高維:一共有500個元素
# 最低維:每個畫素點的顏色信r g b
a #已知陣列資訊,使用imshow讀取成圖片
plt。imshow(a)
# 將陣列資訊儲存成圖片
plt。imsave(“c:/numpy。jpg”,a)
# 利用已學過的知識顯示陣列a的形狀
print(a。shape)
(332, 500, 3)
顯示純色影象
顯示白色影象
顯示黑色影象
顯示指定顏色影象
In [23]:
# (1)如何在ndarray陣列中儲存一張圖片。
# 三維:最高維:高
# 次高維:寬
# 最低維:顏色
# 顏色的儲存:
# 在numpy中可以有兩種形式:
# 3 rgb顏色值越大,圖片就越亮
#一種是無符號 uint8 0-255
#float型別 float 0-1
# x=np。ones(shape=(100,200,3))#白色影象,rgb[1,1,1]
# x=np。zeros(shape=(100,200,3))#黑色色影象,rgb[0,0,0]
# x=np。full(shape=(100,200,3),fill_value=255)#rgb[255,255,255]
# plt。imshow(x)
# x=np。full(shape=(100,200,3),fill_value=148) # [148,148,148],[148,148,148],[148,148,148],[148,148,148],
# 使得rgb三個值都不同,但是影象上的所有點的rgb顏色都一致,就是純色的其他顏色的圖
# plt。imshow(x)
# 每個下畫素點的值[228,251,142]
# x=[228,251,142] # 不行 直接使用x進行賦值,不是在對x中的每個元素進行賦值,而是將x跟其他的資料物件進行了繫結。
# x[:,:] # 獲取影象中的每個rgb元素的值(列表)
# x[:,:]=[228,251,142]
# x[:]=[228,251,142] # 簡化,因為獲取的低維度全部獲取。
# plt。imshow(x)
Out[23]:
轉換為灰度圖
灰度圖的資料可以看成是二維陣列,元素取值為0 ~ 255,其中,0為黑色,255為白色。從0到255逐漸由暗色變為亮色。
灰度圖轉換(ITU-R 601-2亮度變換):
L = R * 299 / 1000 + G * 587 / 1000 + B * 114 / 1000
R,G,B為最低維的資料。
顯示灰度圖時,需要在imshow中使用引數:
cmap=“gray”
In [36]:
# a# 三維的陣列 最高維:高, 次高維:寬 最低維[R,G,B]
# b=np。array([0。299,0。587,0。114])
# x=np。dot(a,b) # 將上面的RGB和b陣列中的每個元素進行對位相乘,再相加,一定得到的是一個數字L
# plt。imshow(x,cmap=“gray”)
#第二種比較粗糙的方式,
# 目的是讓每個rgb都變成一個數值,可以去rgb三個數值中的最大值,最小值,或者是平均值。
# x=np。max(a,axis=2)
# plt。imshow(x,cmap=“gray”)
# x=np。min(a,axis=2)
# plt。imshow(x,cmap=“gray”)
# x=np。mean(a,axis=2)
# plt。imshow(x,cmap=“gray”)
Out[36]:
灰度圖(2)
以上轉換為標準的公式,我們也可以採用不正規的方式:
使用最大值代替整個最低維
使用最小值代替整個最低維
使用平均值代替整個最低維
影象顏色通道
對於彩色影象,可以認為是由RGB三個通道構成的。每個最低維就是一個通道。分別提取R,G,B三個通道,並顯示單通道的影象。
In [68]:
t=a。copy()
# 進行紅色通道的提取:就是將每個畫素點中的g和b,設定成0
# (1)獲取素有的畫素點。
# (2)將每個畫素點中的第1個元素和第二個元素(g,b)設定成0
# [r,g,b]
# t[:,:,1:3]=0
# plt。imshow(t)
# 對藍色通道進行提取
# 將b不變,其餘都設定成0
#[r,g,b]
# t[:,:,0:2]=0
# plt。imshow(t)
# 對綠色通道進行提取
# 將g不變,其餘都設定成0
#[r,g,b]
# t[:,:,0:3:2]=0
# t[:,:,::2]=0
# plt。imshow(t)
# 獲取綠色通道,如果不使用切片,只使用索引
# 透過提供整數索引
# a=np。array([1,2,3,4,5])
# a[1],a[3],a[4]
# index=[1,3,4] #形成索引列表
# a[index]
t
# greenindex=[0,2]
# t[:,:,greenindex]=0
# 以下三種方法都可以
t[:,:,[0,2]]=0
t[:,:,0:3:2]=0
t[:,:,::2]=0
# plt。imshow(t)
# 一起顯示
red=a。copy()
green=a。copy()
blue=a。copy()
red[:,:,1:3]=0
green[:,:,::2]=0
blue[:,:,:2]=0
fig,ax=plt。subplots(2,2)
fig。set_size_inches(15,15)
ax[0,0]。imshow(a)
ax[0,1]。imshow(red)
ax[1,0]。imshow(green)
ax[1,1]。imshow(blue)
Out[68]:
影象重複
將影象沿著水平方向重複三次。
將影象沿著垂直方向重複兩次。
將影象沿著水平方向重複兩次,垂直重複三次。
In [74]:
t=a。copy()
# r=np。concatenate((t,t,t),axis=1)
# r=np。concatenate((t,t),axis=0)
# 先水平方向兩次,再垂直方向3次
r1=np。concatenate((t,t),axis=1)
r2=np。concatenate((r1,r1,r1),axis=0)
plt。imshow(r2)
Out[74]:
影象鏡面對稱
將影象水平鏡面轉換。
將影象垂直鏡面轉換。
In [91]:
# li=[1,2,3,4,5]
# li[::-1]
# 獲得ndarray陣列下的每一列
# x=np。array([[1,2,3,4],
# [5,6,7,8]])
# x[1]
# x[:,1]
t=a。copy()
# t[:,::-1]
plt。imshow(t[:,::-1])
# 水平鏡面
# 相當於進行行交換,讓原來第0行,顯示在第n行
t=a。copy()
plt。imshow(t[::-1])
Out[91]:
左右旋轉
將影象向左旋轉90 / 180度。
將影象向右旋轉90 / 180度。
In [100]:
# 對於二維陣列來說,行變列,列變行
x=np。array([[1,2,3],[4,5,6]])
print(x)
x。transpose()
# 向左旋轉90度
# (1)先tranpose
#(2)再做水平鏡面
# t=a。copy()
# r=t。transpose(1,0,2)
# plt。imshow(r[::-1])
# 右旋轉90
# (1)轉置
#(2)做垂直鏡面
t=a。copy()
# t。transpose(1,0,2)
r=t。swapaxes(0,1)
plt。imshow(r[:,::-1])
[[1 2 3]
[4 5 6]]
Out[100]:
顏色轉換
在影象中,用綠色值代替以前的紅色值,用藍色值代替以前的綠色值,用紅色值代替以前的藍色值。
顏色遮擋 / 疊加
在指定的區域使用特定的純色去遮擋影象。
在指定的區域使用隨機生成的影象去遮擋影象。
使用小影象放在大影象上。
影象分塊亂序
將影象分成若干塊子影象(例如10 * 10),然後打亂各子影象順序(拼圖)。
如果你覺得文章還不錯,請大家點贊分享下。你的肯定是我最大的鼓勵和支援。
▼
更多幹貨分享,請關注公眾號Python爬蟲與大資料分析呀!
▼