首頁  >  文章  >  後端開發  >  Python影像灰階變換及影像陣列操作方法

Python影像灰階變換及影像陣列操作方法

高洛峰
高洛峰原創
2017-03-13 18:14:492205瀏覽

這篇文章主要介紹了Python圖像灰階變換及圖像陣列操作的相關資料,需要的朋友可以參考下

使用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"))
#输出数组的各维度长度以及类型
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 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的資料網路上有很多,就不過多敘述了。

運行結果:

 Python影像灰階變換及影像陣列操作方法

在轉為陣列的過程中我們可以設定資料型別,同時灰階圖的圖片陣列也是有意義的:


# -*- 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 區間)映射到自身。

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



#

#-*- 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()


##運行結果:

 

Python影像灰階變換及影像陣列操作方法0 255

0 255

100 200
0 255

可以比較明顯的看到灰階轉換的結果,,第二張圖被反相顯示,第三張影像的暗部變亮,亮部變暗,其值被限制在100到200之間,其中最後一張影像透過二次函數變換使較暗的像素值變得更暗。

結語:

本篇部落格介紹了python使用圖像數組去進行圖像操作的過程,包括幾個簡單​​的實例,透過數組我們可以對圖像進行任意數學操作,是圖像變形、圖像分類、圖像聚類等的基礎,希望我的部落格對大家有幫助~

以上是Python影像灰階變換及影像陣列操作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn