Python圖像灰度變換及圖像數組操作
作者:MingChaoSun 字體:[增加?減小] 類型:轉載 時間:2016-01-27?我要評論
使用python以及numpy通過直接操作圖像數組完成一系列基本的圖像處理
numpy簡介:
NumPy是一個非常有名的 Python 科學計算工具包,其中包含了大量有用的工具,比如數組對象(用來表示向量、矩陣、圖像等)以及線性代數函數。
數組對象可以實現數組中重要的操作,比如矩陣乘積、轉置、解方程系統、向量乘積和歸一化。這為圖像變形、對變化進行建模、圖像分類、圖像聚類等提供了基礎。
在上一篇python基本圖像操作中,當載入圖像時,通過調用 array() 方法將圖像轉換成NumPy的數組對象。NumPy 中的數組對象是多維的,可以用來表示向量、矩陣和圖像。通過對圖像的數組進行直接操作,就可以完成很多圖像處理。
numpy的相關知識網上有很多資料,作為python科學計算的基礎,還是非常值得認真學習的。
使用圖像數組進行基本圖像操作:
認識圖像數組:
通過下面這幾個程序我們看一下圖像與灰度圖的圖像數組,以及numpy數組的切片。
1 2 3 4 5 6 7 8 9 10 11 12 | # -*- coding: utf-8 -*- from PIL import Image from pylab import * #讀取圖片并轉為數組 im = array(Image. open ( "./source/test.jpg" )) #輸出數組的各維度長度以及類型 print im.shape,im.dtype #輸出位于坐標100,100,顏色通道為r的像素值 print im[ 100 , 100 , 0 ] #輸出坐標100,100的rgb值 print im[ 100 , 100 ]及類型 print im.shape,im.dtype |
運行結果:
(600, 500, 3) uint8
64
[ 64 117 195]
我們看到的是一個三維數組,分別代表橫坐標,縱坐標和顏色通道。
我們可以通過數組把紅藍通道交換
1 2 3 4 5 6 7 8 9 10 11 12 | # -*- 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的資料網上有很多,就不過多敘述了。
運行結果:
?
在轉為數組的過程中我們可以設定數據類型,同時灰度圖的圖像數組也是有意義的:
1 2 3 4 5 6 7 8 9 | # -*- coding: utf-8 -*- from PIL import Image from pylab import * #讀取圖片,灰度化,并轉為數組 im = array(Image. open ( "./source/test.jpg" ).convert( 'L' ), 'f' ) #輸出數組的各維度長度以及類型 print im.shape,im.dtype #輸出坐標100,100的值 print im[ 100 , 100 ] |
運行結果:
(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 區間)映射到自身。
下面程序中有一些簡單的灰度變換:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #-*- 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) #輸出圖中的最大和最小像素值 print int (im. min ()), int (im. max ()) print int (im2. min ()), int (im2. max ()) print int (im3. min ()), int (im3. max ()) print int (im4. min ()), int (im4. max ()) show() |
運行結果:
?
0 255
0 255
100 200
0 255
可以比較明顯的看到灰度變換的結果,,第二張圖被反相顯示,第三張圖像的暗部變亮,亮部變暗,其值被限制在100到200之間,其中最后一張圖像通過二次函數變換使較暗的像素值變得更暗。
結語:
本篇博客介紹了python使用圖像數組去進行圖像操作的過程,包括幾個簡單的實例,通過數組我們可以對圖像進行任意數學操作,是圖像變形、圖像分類、圖像聚類等的基礎,希望我的博客對大家有所幫助~