Python映像灰階變換及映像數組操作

來源:互聯網
上載者:User
使用python以及numpy通過直接操作映像數組完成一系列基本的影像處理

numpy簡介:

NumPy是一個非常有名的 Python 科學計算工具包,其中包含了大量有用的工具,比如數組對象(用來表示向量、矩陣、映像等)以及線性代數函數。

數組對象可以實現數組中重要的操作,比如矩陣乘積、轉置、解方程系統、向量乘積和歸一化。這為映像變形、對變化進行建模、映像分類、映像聚類等提供了基礎。

在上一篇python基本映像操作中,當載入映像時,通過調用 array() 方法將映像轉換成NumPy的數組對象。NumPy 中的數組對象是多維的,可以用來表示向量、矩陣和映像。通過對映像的數組進行直接操作,就可以完成很多影像處理。

numpy的相關知識網上有很多資料,作為python科學計算的基礎,還是非常值得認真學習的。

使用映像數組進行基本映像操作:

認識映像數組:

通過下面這幾個程式我們看一像與灰階圖的映像數組,以及numpy數組的切片。

# -*- coding: utf-8 -*-from PIL import Imagefrom 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]

我們看到的是一個三維數組,分別代表橫座標,縱座標和色彩通道。

我們可以通過數組把紅藍通道交換

# -*- coding: utf-8 -*-from PIL import Imagefrom pylab import *#讀取圖片並轉為數組im = array(Image.open("./source/test.jpg"))#紅色通道r = im[:,:,0]#交換紅藍通道並顯示im[:,:,0] = im[:,:,2]im[:,:,2] = rimshow(im)show()

這裡用到了numpy數組的切片方式,關於numpy的資料網上有很多,就不過多敘述了。

運行結果:

在轉為數組的過程中我們可以設定資料類型,同時灰階圖的映像數組也是有意義的:

# -*- coding: utf-8 -*-from PIL import Imagefrom 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 區間)映射到自身。

下面程式中有一些簡單的灰階變換:

#-*- coding: utf-8 -*-from PIL import Imagefrom 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使用映像數組去進行映像操作的過程,包括幾個簡單的執行個體,通過數組我們可以對映像進行任意數學操作,是映像變形、映像分類、映像聚類等的基礎,希望我的部落格對大家有所協助~

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.