在上一節中,主要是介紹了圖像的基本知識以及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()
注意圖像的路徑問題.之後需要考慮轉儲這個顯示的圖像。假設對于任何情況,我們都想要濾除掉低于某值的所有像素值,并假設該門檻值設定為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()
掩膜
圖像掩膜是一種圖像處理技術,被廣泛用于去除具有模糊邊緣、透明或毛刺部分的照片背景,看起來類似于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()
衛星圖像處理
作為edX的公開課之一,下面将介紹一些衛星圖像及其處理方法,這部分内容是十分有用的,下面對其進行一些處理,做一些分析任務。
# 加載圖像
pic=imageio.imread('F:\satimg.jpg')
plt.figure(figsize=(10,10))
plt.imshow(pic)
plt.show()
下面看看它的一些基本資訊:
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)
數十款阿裡雲産品限時折扣中,趕緊點選領劵開始雲上實踐吧!
作者資訊
Mohammed Innat,機器學習和資料科學研究者
本文由阿裡雲雲栖社群組織翻譯。
文章原标題《Basic Image Data Analysis Using Numpy and OpenCV – Part 2》,譯者:海棠,審校:Uncle_LLD。
文章為簡譯,更為詳細的内容,
請檢視原文。