使用python以及numpy通過直接操作圖像數組完成一系列基本的圖像處理
numpy簡介:
NumPy是一個非常有名的 Python 科學計算工具包,其中包含了大量有用的工具,比如數組對象(用來表示向量、矩陣、圖像等)以及線性代數函數。
數組對象可以實現數組中重要的操作,比如矩陣乘積、轉置、解方程系統、向量乘積和歸一化。這為圖像變形、對變化進行建模、圖像分類、圖像聚類等提供了基礎。
在上一篇python基本圖像操作中,當載入圖像時,通過調用 array() 方法將圖像轉換成NumPy的數組對象。NumPy 中的數組對象是的,可以用來表示向量、矩陣和圖像。通過對圖像的數組進行直接操作,就可以完成很多圖像處理。
numpy的相關知識網上有很多資料,作為python科學計算的基礎,還是非常值得認真學習的。
使用圖像數組進行基本圖像操作:
認識圖像數組:
通過下面這幾個程序我們看一下圖像與灰度圖的圖像數組,以及numpy數組的切片。
# -*- coding: utf-8 -*- from PIL import Image from pylab import * #讀取圖片并轉為數組 im = array(Image.open("./source/test.jpg")) #
運行結果:
(600, 500, 3) uint8
[ 117 195]
我們看到的是一個三維數組,分別代表橫坐標,縱坐標和顏色通道。
我們可以通過數組把紅藍通道交換
# -*- coding: utf-8 -*- from PIL import Image from pylab import * #讀取圖片并轉為數組 im = array(Image.open("./source/test.jpg")) #紅色通道 r = im[:,:,0] #交換紅藍通道并顯示 im[:,:,0] = im[:,:,2] im[:,:,2] = r imshow(im) show()
這里用到了numpy數組的切片方式,關于numpy的資料網上有很多,就不過多敘述了。
運行結果:
在轉為數組的過程中我們可以設定數據類型,同時灰度圖的圖像數組也是有意義的:
# -*- coding: utf-8 -*- from PIL import Image from pylab import * #讀取圖片,灰度化,并轉為數組 im = array(Image.open("./source/test.jpg").convert('L'),'f') #
運行結果:
(600, 500) float32
110.0
額外的參數‘f'將數組的數據類型轉為浮點數
由于灰度圖沒有顏色信息,所以形狀元組只有兩個數值
*array()變換的相反操作可以使用PIL的fromarray()完成,如im = Image.fromarray(im)
圖像數組的簡單應用——灰度變換:
灰度圖像:
灰度數字圖像是每個像素只有一個采樣顏色的圖像。這類圖像通常顯示為從最暗黑色到最亮的白色的灰度。
可以通過下面幾種方法,將圖像轉換為灰度:
1.浮點算法:Gray=R*0.3+G*0.59+B*0.11
2.整數方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*76+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.僅取綠色:Gray=G;
通過上述任一種方法求得Gray后,將原來的RGB(R,G,B)中的R,G,B統一用Gray替換,形成新的顏色RGB(Gray,Gray,Gray),用它替換原來的RGB(R,G,B)就是灰度圖了。
之前已經使用過很多次了,使用python可以通過使用convert(‘L')來獲得灰度圖
灰度變換:
將圖像讀入 NumPy 數組對象后,我們可以對它們執行任意數學操作。一個簡單的例子就是圖像的灰度變換。即任意函數 f ,它將 0…255 區間(或者 0…1 區間)映射到自身。
下面程序中有一些簡單的灰度變換:
#-*- coding: utf-8 -*- from PIL import Image from pylab import * #讀取圖片,灰度化,并轉為數組 im = array(Image.open("./source/test.jpg").convert('L')) im2 = 255 - im # 對圖像進行反相處理 im3 = (100.0/255) * im + 100 # 將圖像像素值變換到 100...200 區間 im4 = 255.0 * (im/255.0)**2 # 對圖像像素值求平方后得到的圖像(二次函數變換,使較暗的像素值變得更小) #2x2顯示結果 使用第一個顯示原灰度圖 subplot(221) title('f(x) = x') gray() imshow(im) #2x2顯示結果 使用第二個顯示反相圖 subplot(222) title('f(x) = 255 - x') gray() imshow(im2) #2x2顯示結果 使用第三個顯示100-200圖 subplot(223) title('f(x) = (100/255)*x + 100') gray() imshow(im3) #2x2顯示結果 使用第四個顯示二次函數變換圖 subplot(224) title('f(x) =255 *(x/255)^2') gray() imshow(im4) #
運行結果:
0 255
0 255
100 200
0 255
可以比較明顯的看到灰度變換的結果,,第二張圖被反相顯示,第三張圖像的暗部變亮,亮部變暗,其值被在100到200之間,其中最后一張圖像通過二次函數變換使較暗的像素值變得更暗。
結語:
本篇博客介紹了python使用圖像數組去進行圖像操作的過程,包括幾個簡單的實例,通過數組我們可以對圖像進行任意數學操作,是圖像變形、圖像分類、圖像聚類等的基礎,希望我的博客對大家有所幫助~
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com