一、原理與思路
圖像由無數的像數構成,python讀取圖檔每一像數點的灰階值,從黑-白的灰階值為0~255,即越黑的地方灰階值越小,越白的地方灰階值越大。顯然,我們希望越黑的地方灰階值越大,是以需要做一個反轉,即用255減去各個像數點灰階值。接着,将所有非條帶部分的像數點灰階值改為0,而蛋白條帶部分灰階值保持不變。最後,隻要識别出每個蛋白條帶的區域,将其中所有像數點灰階值和。

圖1 示例圖像
二、python代碼
# 導入子產品
from numpy import *
from PIL import Image
# 建構一個函數讀取灰階值圖像
def pictureRead(path): # path為圖檔檔案路徑
im = array(Image.open(path).convert('L'))
im = 255 - im # 黑白灰階值轉換
# 白色部分灰階值轉換為0,黑色部分保持原值
row, col = im.shape
for i in range(row):
for j in range(col):
if im[i,j] < 128:
im[i,j] = 0
return im
# 建構一個函數識别蛋白條帶區域
def discern(array):
list = []
array = 1 * (array > 128) # 轉換為二值圖像,白色為0,黑色為1
# 對每一列像素值求和,若與前一列結果不一緻則判斷為條帶邊緣
row, col = array.shape
for i in range(col):
if (sum(array[:,i]) == 0) != (sum(array[:,i-1])==0):
list.append(i)
return list
# 建構一個函數求和各條帶灰階值
def greySum(array, list):
sumlist = []
for i in range(len(list)):
if i % 2 ==0:
sum = array[:,list[i]:list[i+1]].sum()
sumlist.append(sum)
return sumlist
# 運作
if __name__ == '__main__':
path = r'C:\test.png'
im = pictureRead(path)
list = discern(im)
area = greySum(im,list)
print(area)
三、代碼解析
1)導入子產品
程式運作需要導入numpy和PIL子產品,如果你的python還未安裝這兩個子產品,程式出錯。
2)pictureRead()函數
pictureRead()函數用于讀取圖像,并進行一些轉換操作。這個函數需要您提供一個圖像檔案路徑的字元串參數path(如示例所示),經這一步處理後圖像如下:
圖2
圖2中,蛋白條帶輪廓清晰可見,但是示例圖像中第一條很淺的條帶消失了,這是函數中把灰階值小于128的像數點都改為0了,是以太淺的條帶,此程式可能無法掃描,或者您可以試着把128調低,看看能否把較淺的條帶識别出來。
3)discern()函數
discern()函數先将灰階圖像轉換成二值圖像,用于識别條帶左右邊緣,轉換後的二值圖像如下:
圖3
此函數傳回一個清單,此例為:[76, 128, 134, 183, 194, 245, 249, 302],第1、2個值為第一個條帶左右邊緣的列下标,第3、4個為第二個條帶左右邊緣的列下标,依次類推。
4)greySum()函數
根據discern()函數獲得的清單資訊,對圖2的灰階圖像的蛋白條帶區域灰階值求和。
最後結果傳回一個清單:[166251, 100107, 129382, 158781]即表示各條帶灰階值
四、局限性
1)掃描灰階值的圖像,蛋白條帶間不要連在一塊,否則将視為一個條帶。
2)蛋白條帶灰階太低無法識别,需做修改。
3)結果可靠性有待評價,可與其他工具相比較。