天天看點

使用Numpy和Opencv完成圖像的基本資料分析(Part II)

       在上一節中,主要是介紹了圖像的基本知識以及OpenCV的基本操作,具體内容參見“ 使用Numpy和Opencv完成基本圖像的資料分析(Part I) ”。這部分内容是接着上一節的内容,主要介紹一些其它的操作。

使用邏輯操作處理像素值

       可以使用邏輯運算符建立相同大小的數組。但是,邏輯運算操作并不會建立出任何新的數組,隻是将True傳回給主機變量(host variable)。例如:假設在RGB圖像中過濾掉一些像素值低的像素或像素值高的像素(以及其它任何條件),将RGB轉換為灰階圖看起來不錯,但是我們目前不會對彩色圖像進行這樣的處理。

       首先加載圖像,并将其顯示在螢幕上:

pic=imageio.imread('F:/demo_1.jpg')
plt.figure(figsize=(10,10))
plt.imshow(pic)
plt.show()           
使用Numpy和Opencv完成圖像的基本資料分析(Part II)

       注意圖像的路徑問題.之後需要考慮轉儲這個顯示的圖像。假設對于任何情況,我們都想要濾除掉低于某值的所有像素值,并假設該門檻值設定為20。為此,我們将使用邏輯運算符來執行此任務,最終結果将傳回所有索引的真值。

low_pixel=pic<20 
# 檢查所有值在低像素中是否正确
iflow_pixel.any()==True:
print(low_pixel.shape)

# 輸出結果
(1079, 1293, 3)           

       正如之前所說,主機變量,一般并不使用這個名稱,但在本文中引用它,這是因為它的行為隻保留真值,而不是其他任何形式的值。是以,如果展示low_pixel和pic的形狀,我們就會發現它們其實具有相同的形狀。

print(pic.shape)
print(low_pixel.shape) 

# 輸出
(1079,1293,3)
(1079,1293,3)           

       我們使用全局比較運算符為所有像素值小于200的像素點生成低值濾波器。但是,我們也可以使用此low_pixel數組作為索引将這些低值設定為某些特定值,這些值可能高于或低于先前的像素值。

# 随機選擇一個值
import random 
# 加載原始圖像
pic=imageio.imread('F:/demo_1.jpg') 
# 随機設定一個值,取值範圍25~225
choosenpic[low_pixel]=random.randint(25,225) 
# 展示圖像
plt.figure(figsize=(10,10))
plt.imshow(pic)plt.show()           
使用Numpy和Opencv完成圖像的基本資料分析(Part II)

掩膜

       圖像掩膜是一種圖像處理技術,被廣泛用于去除具有模糊邊緣、透明或毛刺部分的照片背景,看起來類似于PS中的一項技術。

       下面将帶領讀者一起建立一個圓盤形狀的掩膜。首先,我們測量從圖像中心到每個邊界像素值的距離,在這裡采用應用比較友善的半徑,然後使用邏輯運算符建立一個圓盤。這個過程很簡單,如下面的代碼所示:

if__name__=='__main__': 
# 加載圖像
pic=imageio.imread('F:/demo_1.jpg') 
# 分離行和列
total_row,total_col,layers=pic.shape 
''' 建立矢量,Ogrid 是一個不錯的方法method of creating a 
比如
>>>ogrid[0:5,0:5]   
輸出: 
[array([[0],[1],[2],[3],[4]]), 
array([[0, 1, 2, 3, 4]])]    
'''
x,y=np.ogrid[:total_row,:total_col] 
# 擷取圖像的中心值
cen_x,cen_y=total_row/2,total_col/2  
'''   
測量從中心到每個邊界像素的距離--> s**2 = (Y-y)**2 + (X-x)**2 
 '''
distance_from_the_center=np.sqrt((x-cen_x)**2+(y-cen_y)**2) 
# 選擇半徑值
radius=(total_row/2) 
# 使用邏輯操作符 '>' 
circular_pic=distance_from_the_center>radius 
'''
給所有半徑外的像素值配置設定零值,即黑色
'''
pic[circular_pic]=0
plt.figure(figsize=(10,10))
plt.imshow(pic)
plt.show()           
使用Numpy和Opencv完成圖像的基本資料分析(Part II)

衛星圖像處理

       作為edX的公開課之一,下面将介紹一些衛星圖像及其處理方法,這部分内容是十分有用的,下面對其進行一些處理,做一些分析任務。

# 加載圖像
pic=imageio.imread('F:\satimg.jpg')
plt.figure(figsize=(10,10))
plt.imshow(pic)
plt.show()           
使用Numpy和Opencv完成圖像的基本資料分析(Part II)

       下面看看它的一些基本資訊:

print(f'Shape of the image {pic.shape}')

print(f'hieght {pic.shape[0]} pixels')

print(f'width {pic.shape[1]} pixels') 

# 輸出
Shapeoftheimage(3725,4797,3)

height 3725 pixels

width 4797 pixels           

       從中可以發現一些有趣的東西,像許多其他可視化結果一樣,每個rgb層中的顔色都表示對應的内容。例如,紅色強弱表示像素中地理資料點的高度,藍色強弱表示方位的度量,而綠色表示斜率,這些顔色将有助于我們以更快、更有效的方式傳達資訊,而不僅是顯示數字。

  • 紅色像素表示:高度
  • 藍色像素表示:方位
  • 綠色像素表示:斜率

           隻需看一下這張彩色圖像,訓練有素的眼睛就能分辨出海拔是多少,斜率是多少,方位在哪裡,是以為這些顔色加載更多含義能夠表示更科學的東西,一個好的想法!

檢測每個通道的高像素

# 隻有紅色通道值,像素值高于180

pic=imageio.imread('F:\satimg.jpg')

red_mask=pic[:,:,0]<180 

pic[red_mask]=0

plt.figure(figsize=(15,15))

plt.imshow(pic)  

# 隻有綠色通道像素值,像素值高于180

pic=imageio.imread('F:\satimg.jpg')

green_mask=pic[:,:,1]<180 

pic[green_mask]=0

plt.figure(figsize=(15,15))

plt.imshow(pic)  

# 隻有藍色通道像素值,像素值高于180

pic=imageio.imread('F:\satimg.jpg')

blue_mask=pic[:,:,2]<180 

pic[blue_mask]=0

plt.figure(figsize=(15,15))

plt.imshow(pic) 

# 使用邏輯與的組合掩膜

pic=imageio.imread('F:\satimg.jpg')

final_mask=np.logical_and(red_mask,green_mask,blue_mask)

pic[final_mask]=40

plt.figure(figsize=(15,15))

plt.imshow(pic)           
使用Numpy和Opencv完成圖像的基本資料分析(Part II)

數十款阿裡雲産品限時折扣中,趕緊點選領劵開始雲上實踐吧!

作者資訊

Mohammed Innat,機器學習和資料科學研究者

本文由阿裡雲雲栖社群組織翻譯。

文章原标題《Basic Image Data Analysis Using Numpy and OpenCV – Part 2》,譯者:海棠,審校:Uncle_LLD。

文章為簡譯,更為詳細的内容,

請檢視原文

繼續閱讀