初學者福利!三種用Python從圖像數據中提取特徵的技術

2021-01-07 讀芯術

全文共4073字,預計學習時長8分鐘

你之前是否使用過圖像數據?也許你想建立自己的物體檢測模型,或者僅僅是想統計走進某棟建築物的人數,使用計算機視覺技術處理圖像擁有無窮無盡的可能性。

但數據科學家最近有這樣一種研究趨勢,他們堅信,在處理非結構化數據(尤其是圖像數據)時,深度學習模型是不斷向前發展的。毫無疑問,深度學習技術表現得非常好,但這是處理圖像的唯一方法嗎?

並非所有人都擁有像Google和Facebook等大型技術巨頭那樣無限的資源,那麼,如果不透過深度學習,要如何處理圖像數據呢?

可以利用機器學習的力量!沒錯,可以使用簡單的機器學習模型,如決策樹或支持向量機( SVM )。如果能提供正確的數據和功能,這些機器學習模型可以充分發揮作用,甚至可以用作基準解決方案。

所以在這篇適合初學者的文章中,你將了解到從圖像中生成特徵的不同方法,而後,可以將這些方法應用到自己喜歡的機器學習算法中。

目錄

1.機器是如何存儲圖像的?

2.在Python中讀取圖像數據

3.從圖像數據中提取特徵的方法#1:灰度像素值特徵

4.從圖像數據中提取特徵的方法#2:通道的平均像素值

5.從圖像數據中提取特徵的方法#3:提取邊緣

機器是如何存儲圖像的?

請從這些基礎開始。在查看其他任何內容前,了解如何在計算機上讀取與存儲圖像非常重要。考慮針對圖像的『pd.read_』函數。

筆者將舉一個簡單的例子。請看下圖:

這是一張數字8的圖像,仔細觀察就會發現,圖像是由小方格組成的。這些小方格被稱為像素。

但是要注意,人們是以視覺的形式觀察圖像的,可以輕鬆區分邊緣和顏色,從而識別圖片中的內容。然而機器很難做到這一點,它們以數字的形式存儲圖像。請看下圖:

機器以數字矩陣的形式儲存圖像,矩陣大小取決於任意給定圖像的像素數。

假設圖像的尺寸為180 x 200或n x m,這些尺寸基本上是圖像中的像素數(高x寬)。

這些數字或像素值表示像素的強度或亮度,較小的數字(接近0)表示黑色,較大的數字(接近255)表示白色。通過分析下面的圖像,讀者就會弄懂到目前為止所學到的知識。

下圖的尺寸為22 x 16,讀者可以通過計算像素數來驗證:

圖片源於機器學習應用課程

剛才討論的例子是黑白圖像,如果是生活中更為普遍的彩色呢?你是否認為彩色圖像也以2D矩陣的形式存儲?

彩色圖像通常由多種顏色組成,幾乎所有顏色都可以從三原色(紅色,綠色和藍色)生成。

因此,如果是彩色圖像,則要用到三個矩陣(或通道)——紅、綠、藍。每個矩陣值介於0到255之間,表示該像素的顏色強度。觀察下圖來理解這個概念:

圖片源於機器學習應用課程

左邊有一幅彩色圖像(人類可以看到),而在右邊,紅綠藍三個顏色通道對應三個矩陣,疊加三個通道以形成彩色圖像。

請注意,由於原始矩陣非常大且可視化難度較高,因此這些不是給定圖像的原始像素值。此外,還可以用各種其他的格式來存儲圖像,RGB是最受歡迎的,所以筆者放到這裡。讀者可以在此處閱讀更多關於其他流行格式的信息。

用Python讀取圖像數據

下面開始將理論知識付諸實踐。啟動Python並加載圖像以觀察矩陣:

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

%matplotlib inline

from skimage.io import imread, imshow

image = imread('image_8_original.png', as_gray=True)

imshow(image)

#checking image shape

image.shape, image

(28,28)

矩陣有784個值,而且這只是整個矩陣的一小部分。用一個LIVE編碼窗口,不用離開本文就可以運行上述所有代碼並查看結果。

下面來深入探討本文背後的核心思想,並探索使用像素值作為特徵的各種方法。

方法#1:灰度像素值特徵

從圖像創建特徵最簡單的方法就是將原始的像素用作單獨的特徵。

考慮相同的示例,就是上面那張圖(數字『8』),圖像尺寸為28×28。

能猜出這張圖片的特徵數量嗎?答案是與像素數相同!也就是有784個。

那麼問題來了,如何安排這784個像素作為特徵呢?這樣,可以簡單地依次追加每個像素值從而生成特徵向量。如下圖所示:

下面來用Python繪製圖像,並為該圖像創建這些特徵:

image = imread('puppy.jpeg', as_gray=True)

image.shape, imshow(image)

(650,450)

該圖像尺寸為650×450,因此特徵數量應為297,000。可以使用NumPy中的reshape函數生成,在其中指定圖像尺寸:

#pixel features

features = np.reshape(image, (660*450))

features.shape, features

(297000,)

array([0.96470588, 0.96470588, 0.96470588, ..., 0.96862745, 0.96470588,

0.96470588])

這裡就得到了特徵——長度為297,000的一維數組。很簡單吧?在實時編碼窗口中嘗試使用此方法提取特徵。

但結果只有一個通道或灰度圖像,對於彩色圖像是否也可以這樣呢?來看看吧!

方法#2:通道的平均像素值

在讀取上一節中的圖像時,設置了參數『as_gray = True』,因此在圖像中只有一個通道,可以輕鬆附加像素值。下面刪除參數並再次加載圖像:

image = imread('puppy.jpeg')

image.shape

(660, 450, 3)

這次,圖像尺寸為(660,450,3),其中3為通道數量。可以像之前一樣繼續創建特徵,此時特徵數量將是660*450*3 = 891,000。

或者,可以使用另一種方法:

生成一個新矩陣,這個矩陣具有來自三個通道的像素平均值,而不是分別使用三個通道中的像素值。

下圖可以讓讀者更清楚地了解這一思路:

這樣一來,特徵數量保持不變,並且還能考慮來自圖像全部三個通道的像素值。

image = imread('puppy.jpeg')

feature_matrix = np.zeros((660,450))

feature_matrix.shape

(660, 450)

現有一個尺寸為(660×450×3)的三維矩陣,其中660為高度,450為寬度,3是通道數。為獲取平均像素值,要使用for循環:

for i in range(0,iimage.shape[0]):

for j in range(0,image.shape[1]):

feature_matrix[i][j] = ((int(image[i,j,0]) + int(image[i,j,1]) + int(image[i,j,2]))/3)

新矩陣具有相同的高度和寬度,但只有一個通道。現在,可以按照與上一節相同的步驟進行操作。依次附加像素值以獲得一維數組:

features = np.reshape(feature_matrix, (660*450))

features.shape

(297000,)

方法#3:提取邊緣特徵

請思考,在下圖中,如何識別其中存在的對象:

識別出圖中的對象很容易——狗、汽車、還有貓,那麼在區分的時候要考慮哪些特徵呢?形狀是一個重要因素,其次是顏色,或者大小。如果機器也能像這樣識別形狀會怎麼樣?

類似的想法是提取邊緣作為特徵並將其作為模型的輸入。稍微考慮一下,要如何識別圖像中的邊緣呢?邊緣一般都是顏色急劇變化的地方,請看下圖:

筆者在這裡突出了兩個邊緣。這兩處邊緣之所以可以被識別是因為在圖中,可以分別看到顏色從白色變為棕色,或者由棕色變為黑色。如你所知,圖像以數字的形式表示,因此就要尋找哪些像素值發生了劇烈變化。

假設圖像矩陣如下:

圖片源於機器學習應用課程

該像素兩側的像素值差異很大,於是可以得出結論,該像素處存在顯著的轉變,因此其為邊緣。現在問題又來了,是否一定要手動執行此步驟?

當然不!有各種可用於突出顯示圖像邊緣的內核,剛才討論的方法也可以使用Prewitt內核(在x方向上)來實現。以下是Prewitt內核:

獲取所選像素周圍的值,並將其與所選內核(Prewitt內核)相乘,然後可以添加結果值以獲得最終值。由於±1已經分別存在於兩列之中,因此添加這些值就相當於獲取差異。

還有其他各種內核,下面是四種最常用的內核:

圖片源於機器學習應用課程

現在回到筆記本,為同一圖像生成邊緣特徵:

#importing the required libraries

import numpy as np

from skimage.io import imread, imshow

from skimage.filters import prewitt_h,prewitt_v

import matplotlib.pyplot as plt

%matplotlib inline

#reading the image

image = imread('puppy.jpeg',as_gray=True)

#calculating horizontal edges using prewitt kernel

edges_prewitt_horizontal = prewitt_h(image)

#calculating vertical edges using prewitt kernel

edges_prewitt_vertical = prewitt_v(image)

imshow(edges_prewitt_vertical, cmap='gray')

留言 點讚 關注

我們一起分享AI學習與發展的乾貨

編譯組:李世琛、餘書敏

相關連結:

https://www.analyticsvidhya.com/blog/2019/08/3-techniques-extract-features-from-image-data-machine-learning-python/

如需轉載,請後臺留言,遵守轉載規範

相關焦點

  • 如何檢測並提取圖像中的聖誕樹,可以用 Python 來實現 !
    圖中的聖誕樹的外輪廓都用紅線給標記出來了,效果看起來還不錯吧~,下面是算法實現的整體思路,分為三個部分1,提取圖片特徵點(根據圖像明亮度,色調,飽和度)根據上面提到的思路先對聖誕樹上特徵點進行提取,這裡對圖像分別以亮度、色調、飽和度三個角度對圖像做了條件篩選,篩選出圖像中目標特徵點集,篩選標準如下1,做亮度篩選時,先將RGB 轉化為灰度圖
  • python 基於opencv 繪製圖像輪廓
    這篇文章主要介紹了python 基於opencv 繪製圖像輪廓的示例,幫助大家更好的利用python的opencv庫處理圖像,感興趣的朋友可以了解下
  • 想用Python做數據可視化?先邁過這個「坎」
    python的人都會面臨一個問題,尤其是初學者:我應該選哪個來實現數據可視化? 以下就是將要用來創建繪製數據的示例: ·Pandas ·Seaborn ·Ggplot 在示例中,我將使用pandas進行數據處理並使用它來完成可視化的效果。
  • 基於陰影重建形狀的視覺技術:一種重要的圖像形狀提取技術及其應用
    常規的2D算法通常擅長處理某些特徵清晰且定義明確的應用,因此檢測更加可靠。 換句話說,目標特徵必須穩定並且清晰一致地呈現,檢測和識別才會比較可靠。基於陰影重建形狀(Shape from Shading)技術則是一種經過驗證的更可靠方法,能夠應付這些複雜的檢測任務。本文中一下兩個應用案例,顯示陰影重建形狀(SFS)技術如何提高目標物體的反差並儘可能地抑制背景噪聲,使得更容易地檢測出缺陷並成功讀取字符。
  • 教程:使用Python進行基本圖像數據分析!
    矢量圖形是一種有點不同的存儲圖像方法,旨在避免與像素相關的問題。但是,即使是矢量圖像,最終也會顯示為像素一樣的馬賽克。顏色像素表示圖像元素,描述每個像素的簡單方法是使用三種顏色的組合,即紅色,綠色,藍色,這就是我們所說的RGB圖像。  在RGB圖像中,每個像素分別與紅色,綠色,藍色的值相關聯的三個8比特數字表示。
  • 10行代碼實現python人臉識別
    ↑ 關注 + 星標 ~ 有趣的不像個技術號什麼是人臉識別人臉識別,是基於人的臉部特徵信息進行身份識別的一種生物識別技術。用攝像機或攝像頭採集含有人臉的圖像或視頻流,並自動在圖像中檢測和跟蹤人臉,進而對檢測到的人臉進行臉部識別的一系列相關技術,通常也叫做人像識別、面部識別。目前的人臉識別技術已經非常成熟了,還發展成3D人臉識別。
  • 2019 必知的 10 大頂級 python 庫
    在本文中,我們將討論一些 python 中的頂級庫,開發人員可以使用這些庫在現有的應用程式中應用、清洗和表示數據,並進行機器學習研究。無監督學習算法:同樣,在產品中有大量的算法——從聚類、因子分析、主成分分析到無監督神經網絡特徵提取:用於從圖像和文本中提取特徵(例如一段文字)Scikit Learn 被用在哪裡?
  • python圖像處理-濾鏡處理
    前言很多時候用手機拍完照,為了讓照片看上去更好看,我們都會對照片做一些處理,而這裡用的最多的方法就是濾鏡了,常用的濾鏡一般有模糊濾鏡,其它的就是一些風格的變換了,比如黑白老照片,懷舊復古風,素描鉛筆藝術風等。
  • Python 初學者進階的九大技能
    初學者與中級程式設計師那麼,對於Python程式設計師而言,初學者和進階者有什麼區別呢?XY問題:「我需要從字符串中提取最後3個字符。」「不,你不需要。只需文件擴展名。」XY問題很有趣。你有個X問題,當你調用服務中心時,會尋求Y問題的解決方案,以解決X問題。上面的案例就是極好的例子。
  • python圖像處理-gif動圖
    圖片合成動圖導入os庫,利用listdir方法將lion文件夾中的圖片全部讀取出來,循環打開每一張圖片,接著將圖片對象添加到frames列表中,最後利用save方法,保存為一張動圖。python圖像處理-1
  • Python編程學了有用嗎?
    Python編程學了有用嗎?眾所周知,目前家長對於孩子的教育越來越重視,培養孩子的編程思維也是大家關心的話題,孩子學習Python語言,需要使用精確到標點、分號等特殊字符,可以提高孩子的編程能力和邏輯思維能力。作為成成年人學python編程可以大大提高工作效率。
  • 用Python 訓練自己的語音識別系統,這波操作穩了
    作者 | 李秋鍵責編 | Carol封圖 | CSDN 付費下載自視覺中國近幾年來語音識別技術得到了迅速發展,從手機中的Siri語音智能助手、微軟的小娜以及各種平臺的智能音箱等等,各種語音識別的項目得到了廣泛應用。
  • python數據挖掘常用工具有哪幾種?
    python有強大的第三方庫,廣泛用於數據分析,數據挖掘、機器學習等領域,下面小編整理了python數據挖掘的一些常用庫,希望對各位小夥伴學習python數據挖掘有所幫助。1. Numpy能夠提供數組支持,進行矢量運算,並且高效地處理函數,線性代數處理等。
  • 換臉技術,用 Python — OpenCV 來實現!
    1,Face Swap 技術介紹好了,下面將詳細介紹 人臉替換技術並用 OpenCV  來實現;介紹到這裡,如果沒有看過之前寫的幾篇文章實現人臉識別、人臉68個特徵點提取,或許這個 Python 庫能幫到你!
  • 卸下技術債務!數據科學家需要簡潔的Python代碼
    一方面,有一些數據工程師非常看重高度可靠,穩固的代碼,這些代碼承擔的技術債務少。另一方面,有些數據科學家非常重視概念驗證(e.g.設置)中想法和算法的快速原型設計。最近,我寫了一篇關於為什麼數據科學家的代碼傾向於遭受平庸之苦的評論文章,在這篇文章中,我希望介紹一些方法供新手數據科學家編寫更清晰的Python代碼並更好地構建小型項目,以及闡明減少技術債務在不經意間給你和所在團隊帶來的負作用。下面的內容既不詳盡也不足夠嚴謹,旨在以淺顯的方式介紹深層次建立數據科學項目的方式。
  • Power Query結構數據中的數據提取方法
    Power Query中的基本結構數據:list:列表record:記錄table:表格這三種結構數據之間是什麼關係?表格可以看作是列表與記錄的結合體,在table中列用方括號,那麼列就相當於是記錄行用大括號,行就相當於是列表Power Query中要提取指定位置的數據應該怎麼做?
  • 以鳶尾花數據集為例,用Python對決策樹進行分類
    分類樹到三種花種之一的分類(鳶尾花數據集)如何使用分類樹要使用分類樹,請從根節點(棕色)開始,然後一直進行分類,直到到達葉(終端)節點。使用下圖中的分類樹,想像有一朵花,花瓣長4.5釐米,然後對其進行分類。從根節點開始,首先設置第一個問題,「花瓣長度(cm)是否≤2.45」?長度若大於2.45,則為假。