1. 程式人生 > >用python進行圖片處理和特徵提取

用python進行圖片處理和特徵提取

原文來自:http://www.analyticsvidhya.com/blog/2015/01/basics-image-processing-feature-extraction-python/


毫無疑問,上面的那副圖畫看起來像一幅電腦背景圖片。這些都歸功於我的妹妹,她能夠將一些看上去奇怪的東西變得十分吸引眼球。然而,我們生活在數字圖片的年代,我們也很少去想這些圖片是在怎麼儲存在儲存器上的或者去想這些圖片是如何通過各種變化生成的。

在這篇文章中,我將帶著你瞭解一些基本的圖片特徵處理。data massaging 依然是一樣的:特徵提取,但是這裡我們還需要對跟多的密集資料進行處理,但同時資料清理是在資料庫、表、文字等中進行。這是如何對圖片進行處理的呢?我們將看到圖片是怎麼儲存在硬碟中的,同時我們可以通過使用基本的操作來處理圖片。

匯入圖片

在python中匯入圖片是非常容易的。下面的程式碼就是python如何匯入程式碼的:


程式碼解釋: 這幅圖片有一些顏色和許多畫素組成,為了形象這幅圖片是如何儲存的,把每一個畫素想象成矩陣中的每一個元素。現在這些元素包含三個不同的密度資訊,分別為顏色紅、綠、藍(RGB)。所以一個RGB的圖片就變成了三維的矩陣。每一個數字就是顏色的密度(RGB) 讓我們來看看一些轉化:
就像你在上面看到的一樣,我們對三個顏色維度進行了一些操作轉變。黃色不是一種直接表示的顏色,它是紅色和綠色的組合色。我們通過設定其他顏色密度值為零而得到了這些變化。 將影象轉換為二維矩陣 處理影象的三維色有時可能是很複雜和冗餘的。如果我們壓縮影象為二維矩陣,
在特徵提取後,它將變得更簡單。這是通過灰度影象或二值化(Binarizing)影象。當圖片顯示為不同灰色強度組合時灰度影象比二值化(Binarizing)影象顏色更加飽滿,而二值化(binarzing)只是簡單的構建一個充滿0和1的二維矩陣而已。
這裡將叫你如何將RGB圖片轉變成灰度影象:
就如你所見,圖片的維度已經降為了兩種灰度值了,然而圖片的特徵在兩幅圖片中依然清晰可見。這就是為什麼灰色影象在硬碟上存貯更加節約空間。 現在讓我們來二值化灰色影象,這是通過找到閥值和灰色度畫素標誌(flagging the pixels of Grayscale)。在這篇文章中我已經通過
Otsu‘s方法來找到閥值的,Otsu‘s方法是通過最大化兩類不同畫素點之間的距離來計算最優閥值的,也就是說這個閥值最小化了同類間的變數值。

模糊化圖片 本文最後部分我們將介紹更多有關特徵提取的內容:影象模糊。灰度或二值影象有時需要捕獲更多的影象而模糊影象在這樣的場景下是非常方便的。例如,在這張圖片如果鐵路軌道比鞋子更加重要,模糊處理將會新增跟多的值。從這個例子中我們對模糊處理變得更清晰。模糊演算法需要將鄰近畫素的加權平均值加到周圍每個顏色畫素中。下面是一個模糊處理的例子:

對上面的照片模糊處理後,我們清楚地看到鞋已經與鐵路軌道具有相同的密度等級。因此,在許多場景中這種技術非常方便。 讓我們看一個實際例子。我們想在一個小鎮的照片上統計的人數。但是照片上還有一些建築影象。現在建築背後的人的顏色強度會低於建築本身。因此,這些人我們就難以計數。模糊處理場景後才能平衡建築和人在影象中的顏色強度。 完整的程式碼:
  1. image = imread(r"C:\Users\Tavish\Desktop\7.jpg")  
  2. show_img(image)  
  3. red, yellow =   image.copy(), image.copy()  
  4. red[:,:,(1,2)] = 0
  5. yellow[:,:,2]=0
  6. show_images(images=[red,yellow], titles=['Red Intensity','Yellow Intensity'])  
  7. from skimage.color import rgb2gray  
  8. gray_image = rgb2gray(image)  
  9. show_images(images=[image,gray_image],titles=["Color","Grayscale"])  
  10. print"Colored image shape:", image.shape  
  11. print"Grayscale image shape:", gray_image.shape  
  12. from skimage.filter import threshold_otsu  
  13. thresh = threshold_otsu(gray_image)  
  14. binary = gray_image > thresh  
  15. show_images(images=[gray_image,binary_image,binary],titles=["Grayscale","Otsu Binary"])  
  16. from skimage.filter import gaussian_filter  
  17. blurred_image = gaussian_filter(gray_image,sigma=20)  
  18. show_images(images=[gray_image,blurred_image],titles=["Gray Image","20 Sigma Blur"])