前面的一些例子中,我們都是利用Image.open()來打開一幅圖像钮孵,然后直接對這個PIL對象進(jìn)行操作骂倘。如果只是簡單的操作還可以,但是如果操作稍微復(fù)雜一些油猫,就比較吃力了稠茂。因此,通常我們加載完圖片后情妖,都是把圖片轉(zhuǎn)換成矩陣來進(jìn)行更加復(fù)雜的操作睬关。
python中利用numpy庫和scipy庫來進(jìn)行各種數(shù)據(jù)操作和科學(xué)計算。我們可以通過pip來直接安裝這兩個庫
pip install numpy
pip install scipy
以后毡证,只要是在python中進(jìn)行數(shù)字圖像處理电爹,我們都需要導(dǎo)入這些包:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
打開圖像并轉(zhuǎn)化為矩陣,并顯示:
fromPILimport Imageimport numpy as npimport matplotlib.pyplot as plt
img=np.array(Image.open('d:/lena.jpg')) #打開圖像并轉(zhuǎn)化為數(shù)字矩陣
plt.figure("dog")
plt.imshow(img)
plt.axis('off')
plt.show()
調(diào)用numpy中的array()函數(shù)就可以將PIL對象轉(zhuǎn)換為數(shù)組對象料睛。
查看圖片信息丐箩,可用如下的方法:
**print img.shape **
**print img.dtype **
**print img.size **
printtype(img)
如果是RGB圖片,那么轉(zhuǎn)換為array之后恤煞,就變成了一個rowscolschannels的三維矩陣,因此屎勘,我們可以使用
img[i,j,k]
來訪問像素值。
例1:打開圖片居扒,并隨機(jī)添加一些椒鹽噪聲
fromPILimport Imageimport numpy as npimport matplotlib.pyplot as plt
img=np.array(Image.open('d:/ex.jpg'))#隨機(jī)生成5000個椒鹽rows,cols,dims=img.shapeforiinrange(5000):
** x=np.random.randint(0,rows)**
** y=np.random.randint(0,cols)**
** img[x,y,:]=255 **
plt.figure("beauty")
plt.imshow(img)
plt.axis('off')
plt.show()
例2:將lena圖像二值化概漱,像素值大于128的變?yōu)?,否則變?yōu)?
fromPILimport Imageimport numpy as npimport matplotlib.pyplot as plt
img=np.array(Image.open('d:/pic/lena.jpg').convert('L'))
rows,cols=img.shapeforiin range(rows):
** forjin range(cols):**
** if(img[i,j]<=128):**
** img[i,j]=0**
** else:**
** img[i,j]=1 **
plt.figure("lena")
plt.imshow(img,cmap='gray')
plt.axis('off')
plt.show()
plt.savefig("./11.jpg")
如果要對多個像素點(diǎn)進(jìn)行操作喜喂,可以使用數(shù)組切片方式訪問瓤摧。切片方式返回的是以指定間隔下標(biāo)訪問 該數(shù)組的像素值。下面是有關(guān)灰度圖像的一些例子:
img[i,:] = im[j,:]# 將第 j 行的數(shù)值賦值給第 i 行
img[:,i] = 100# 將第 i 列的所有數(shù)值設(shè)為 100
img[:100,:50].sum()# 計算前 100 行玉吁、前 50 列所有數(shù)值的和
img[50:100,50:100]# 50~100 行照弥,50~100 列(不包括第 100 行和第 100 列)
img[i].mean() # 第 i 行所有數(shù)值的平均值
img[:,-1]# 最后一列
img[-2,:] (orim[-2])# 倒數(shù)第二行