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

2020-11-22 讀芯術

全文共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爬蟲」技術抓取網頁數據?
    在當今社會,網際網路上充斥著許多有用的數據。我們只需要耐心觀察並添加一些技術手段即可獲得大量有價值的數據。而這裡的「技術手段」就是指網絡爬蟲。 今天,小編將與您分享一個爬蟲的基本知識和入門教程:什麼是爬蟲?
  • 從手工提取特徵到深度學習的三種圖像檢索方法
    前言圖片檢索是計算機視覺,數字圖像處理等領域常見的話題,在我學習相關知識的過程中,圖像檢索算是我第一個學習的 demo,該過程都記錄在 利用python進行識別相似圖片(一) 和 利用python進行識別相似圖片(二) 兩篇文章,分別記錄了直方圖匹配,phash/average hash/dhash 三種基於哈希的方法。
  • 常用的十大 python 圖像處理工具
    圖片來自 Pexels 的Luriko Yamaguchi今天,在我們的世界裡充滿了數據,圖像成為構成這些數據的重要組成部分。但無論是用於何種用途,這些圖像都需要進行處理。圖像處理就是分析和處理數字圖像的過程,主要旨在提高其質量或從中提取一些信息,然後可以將其用於某種用途。圖像處理中的常見任務包括顯示圖像,基本操作如裁剪、翻轉、旋轉等,圖像分割,分類和特徵提取,圖像恢復和圖像識別。
  • 用Python進行Web爬取數據
    我個人發現網絡抓取是一種非常有用的技術,可以從多個網站收集數據。如今,某些網站還為你可能希望使用的許多不同類型的數據提供API,例如Tweets或LinkedIn帖子。但是有時你可能需要從不提供特定API的網站收集數據。這就是web抓取能力派上用場的地方。作為數據科學家,你可以編寫一個簡單的Python腳本並提取所需的數據。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    高級編程(6套課程) 注:零基礎全能篇中,針對windows和liunx系統均有兩套課程可供選擇學習,單純學python,哪個系統都一樣,初學者只需選擇自己熟悉的系統學習相應課程即可。 1-1課程導學 1-2 數據分析概述 2-1數據倉庫 2-2監視與抓取 2-3填寫,埋點,日誌,計算 2-4 數據學習網站 3-01數據案例介紹 3-02集中趨勢,離中趨勢 3-03數據分布-偏態與峰度 3-04抽樣理論 3-05編碼實現
  • 如何 提取圖片中的文字?這款Python 庫 4行代碼搞定!
    這算是生活裡最常見、最有用的AI應用技術之一。OCR本質是圖像識別,其包含兩大關鍵技術:文本檢測和文字識別。先將圖像中的特徵的提取並檢測目標區域,之後對目標區域的的字符進行分割和分類。關於EasyOCRPython中有一個不錯的OCR庫-EasyOCR,在GitHub已有9700star。它可以在python中調用,用來識別圖像中的文字,並輸出為文本。
  • 如何使用特徵提取技術降低數據集維度
    如果這些特徵數量與數據集中存儲的觀察值數量相差無幾(或者前者比後者更多)的話,很可能會導致機器學習模型過度擬合。為避免此類問題的發生,需採用正則化或降維技術(特徵提取)。在機器學習中,數據集的維數等於用來表示它的變量數。
  • 使用DeepWalk從圖中提取特徵
    目錄數據的圖示不同類型的基於圖的特徵 節點屬性 局部結構特徵 節點嵌入DeepWalk簡介在Python中實施DeepWalk以查找相似的Wikipedia頁面數據的圖示當你想到「網絡」時,會想到什麼?通常是諸如社交網絡,網際網路,已連接的IoT設備,鐵路網絡或電信網絡之類的事物。在圖論中,這些網絡稱為圖。網絡是互連節點的集合。
  • 計算機視覺(圖像)技術:視覺圖像搜索綜述
    一個簡單的例子是通過圖像中像素強度的平均值,標準偏差和偏度來表徵圖像的顏色。(如果只是構建一個簡單的圖像搜尋引擎,在許多情況下,這種方法實際效果很好)  對於給定的圖像數據集,將數據集中的所有圖像都計算出特徵值,並將其存儲在磁碟上。當我們量化圖像時,我們描述圖像並提取圖像特徵。這些圖像特徵是圖像的抽象,並用於表徵圖像內容,從圖像集合中提取特徵的過程稱為索引。
  • 一文總結數據科學家常用的Python庫(下)
    但是你知道他們在Python中也有一個模型可解釋性庫嗎?H2O的無人駕駛AI提供簡單的數據可視化技術,用於表示高度特徵交互和非線性模型行為。它通過可視化提供機器學習可解釋性(MLI),闡明建模結果和模型中特徵的影響。通過以下連結閱讀有關H2O的無人駕駛AI執行MLI的更多信息。
  • Python十大工具,讓圖像簡潔直觀有魅力!
    ,圖像則是數據的重要組成部分。但圖像無論有何用途,都要經過處理。因此,圖像處理就是對數字圖像進行分析、操作的過程,其主要目的是為改善圖像質量或從中提取一些有用信息。圖像處理的常見任務包括圖像顯示、圖像基本操作(裁剪、翻轉、旋轉等)、圖像分割、分類及特徵提取、圖像修復和圖像識別。
  • 數據工程師需要掌握的 18 個 Python 庫
    我們可以啟用選擇器(例如XPath,CSS)從網頁中提取數據。我們需要先安裝Twisted,因為直接安裝scrapy的話,安裝會失敗。數據清洗NumPyNumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。對數組執行數學運算和邏輯運算時,NumPy 是非常有用的。在用 Python 對 n 維數組和矩陣進行運算時,NumPy 提供了大量有用特徵。
  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    共4天8節,講解機器學習和深度學習的模型理論和代碼實踐,梳理機器學習、深度學習、計算機視覺的技術框架,從根本上解決如何使用模型、優化模型的問題;每次課中,首先闡述算法理論和少量公式推導,然後使用真實數據做數據挖掘、機器學習、深度學習的數據分析、特徵選擇、調參和結果比較。
  • 資源|用Python和NumPy學習《深度學習》中的線性代數基礎
    本文系巴黎高等師範學院在讀博士 Hadrien Jean 的一篇基礎學習博客,其目的是幫助初學者/高級初學者基於深度學習和機器學習來掌握線性代數的概念。掌握這些技能可以提高你理解和應用各種數據科學算法的能力。
  • Python數據類型串講(中)
    #正序提取x[8]#逆序提取x[-4]以上代碼執行結果為:切片(sliceing)使用索引提取序列元素不需要新創建變量,非常方便,但使用索引每次只能提取字符串中的單個字符,而實際運用中往往需要一次提取多個字符,這時便可以使用序列的另一特性:切片。切片是指通過序列的索引提取出指定範圍內的元素作為新的序列。
  • 數據科學的Python軟體包
    儘管標準Python並沒有提供太多功能,但其數量眾多的開放原始碼和第三方庫在開發人員中頗受歡迎。您只需命名域,Python就會為您提供最佳的軟體包和庫。數據科學和機器學習是這個時代的兩項苛刻技術,而Python在這兩個領域的表現要好於優。除Python之外,R是數據科學項目中經常使用的另一種程式語言。
  • 圖像特徵點|SIFT特徵點之圖像金字塔
    小白學視覺公眾號開始有償徵稿啦~~~,有興趣的小夥伴可以查看徵稿啟事計算機視覺中的特徵點提取算法比較多,但SIFT除了計算比較耗時以外,其他方面的優點讓其成為特徵點提取算法中的一顆璀璨的明珠。後來,不知哪位學者發現,可以使用分離的高斯卷積(即先用1xN的模板沿著X方向對圖像卷積一次,然後用Nx1的模板沿著Y方向對圖像再卷積一次,其中N=[(6σ+1)]且向上取最鄰近奇數),這樣既省時也減小了直接卷積對圖像邊緣信息的嚴重損失。
  • python|圖像識別
    影響力之大和最吸引人的技術就是圖像識別,圖像識別技術是人工智慧的一個重要領域,它是指利用計算機對圖像進行處理、分析和理解,以識別各種不同模式的目標和對象的技術。今天以女神宋慧喬的兩張不同照片為例,利用python識別其相似度,從而判定是否是同一人,同時讓我們對圖像識別有個初步的了解,什麼?照片可以換蒼老師和波老師嗎?我懷疑你們在開車,可是我沒有證據!
  • ImagePy——UI界面支持開放插件的Python開源圖像處理框架
    簡介ImagePy 是用 python 編寫的開源圖像處理框架。它的 UI 接口、圖像數據結構和表數據結構分別是基於 wxpython、numpy 和 pandas 的。此外,它支持任何基於 numpy 和 pandas 的插件,這些插件可以輕鬆地在 scipy.ndimage、scikit-image、simpleitk、opencv 和其他圖像處理庫之間進行通信。
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。