Python圖像處理介紹--Python中的圖像表示
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
使用Python進行圖像處理是理解如何通過數(shù)學和代碼表示圖片的有趣方法,希望這篇文章能讓您了解計算機是如何理解圖像數(shù)據(jù)的。
讓我們從導入需要的庫開始吧!
# First import the required Python Librariesimport numpy as npimport matplotlib.pyplot as pltfrom skimage import img_as_uintfrom skimage.io import imshow, imreadfrom skimage.color import rgb2hsvfrom skimage.color import rgb2gray
一個圖像可以被認為是一個矩陣,其中每個像素的顏色是由一個尺度上的數(shù)字表示。
array_1 = np.array([[255, 0],[]])imshow(array_1, cmap = 'gray');

上面的輸出是我們剛剛創(chuàng)建的矩陣的直觀表示。注意,我們不限于簡單的2x2矩陣。以下是3x3矩陣的示例。
array_2 = np.array([[255, 0, 255],[],[]])imshow(array_2, cmap = 'gray');

我們的示例選擇的是光譜中最極端的顏色,但我們也可以訪問介于兩者之間的任何顏色。
array_spectrum = np.array([np.arange(0,255,17),np.arange(255,0,-17),np.arange(0,255,17),np.arange(255,0,-17)])fig, ax = plt.subplots(1, 2, figsize=(12,4))ax[0].imshow(array_spectrum, cmap = 'gray')ax[0].set_title('Arange Generation')ax[1].imshow(array_spectrum.T, cmap = 'gray')ax[1].set_title('Transpose Generation');

下面的圖像是使用NumPy的arange函數(shù)構造的,并通過獲取第一個圖像的轉置來創(chuàng)建了另一個圖像。
為了簡單起見,我們一直使用灰度,但請記住,計算機實際上理解的顏色是紅色,綠色和藍色的組合。因此,我們可以將圖像表示為三維矩陣。每個像素被表示為一個Python列表,用于指定它們的顏色組合。
array_colors = np.array([[[255, 0, 0],[],[]]])imshow(array_colors);

讓我們嘗試處理真實圖像,下面是一只可愛的小狗的圖片。
doggo = imread('doggo.png')imshow(doggo);

doggo.shape檢查圖像的大小,我們看到它是一個390x385x3矩陣。使用Python我們可以對這個矩陣進行切片,并將每個部分表示為它自己的圖像。
fig, ax = plt.subplots(1, 3,figsize=(6,4),sharey= True)ax[0].imshow(doggo[:, 0:130])ax[0].set_title('First Split')ax[1].imshow(doggo[:, 130:260])ax[1].set_title('Second Split')ax[2].imshow(doggo[:, 260:390])ax[2].set_title('Third Split');

而且我們也可以顯示圖像的任意部分,下面就是小狗的臉部顯示。
imshow(doggo[95:250, 130:275]);
現(xiàn)在讓我們做點有意思的事情~
前面我們說過,一個圖像可以由一個三維矩陣表示,因此我們可以通過以下操作,將圖像分解成紅色、綠色和藍色來分別顯示。
fig, ax = plt.subplots(1, 3, figsize=(12,4), sharey = True)ax[0].imshow(doggo[:,:,0], cmap='Reds')ax[0].set_title('Red')ax[1].imshow(doggo[:,:,1], cmap='Greens')ax[1].set_title('Green')ax[2].imshow(doggo[:,:,2], cmap='Blues')ax[2].set_title('Blue');

此外,我們可以將圖像從RGB(紅,綠,藍)轉換為HSV(色相,飽和度,值)。
doggo_hsv = rgb2hsv(doggo)fig, ax = plt.subplots(1, 3, figsize=(12,4), sharey = True)ax[0].imshow(doggo_hsv[:,:,0], cmap='hsv')ax[0].set_title('Hue')ax[1].imshow(doggo_hsv[:,:,1], cmap='gray')ax[1].set_title('Saturation')ax[2].imshow(doggo_hsv[:,:,2], cmap='gray')ax[2].set_title('Value');

最后,我們還可以將圖像矩陣轉換為灰度。通過將圖像轉換為簡單的二維矩陣,這使我們能夠輕松地根據(jù)每個像素與指定值的關系來過濾圖像。
doggo_gray = rgb2gray(doggo)fig, ax = plt.subplots(1, 5, figsize=(17,6), sharey = True)ax[0].imshow(doggo_gray, cmap = 'gray')ax[0].set_title('Grayscale Original')ax[1].imshow(img_as_uint(doggo_gray > 0.25),cmap = 'gray')ax[1].set_title('Greater than 0.25')ax[2].imshow(img_as_uint(doggo_gray > 0.50),cmap = 'gray')ax[2].set_title('Greater than 0.50');ax[3].imshow(img_as_uint(doggo_gray > 0.75),cmap = 'gray')ax[3].set_title('Greater than 0.75');ax[4].imshow(img_as_uint(doggo_gray > np.mean(doggo_gray)),cmap = 'gray')ax[4].set_title('Greater than Mean');

通過本文我們了解了如何使用Python加載和操作圖像。為了更好地理解圖像在Python中的顯示,最好的辦法就是動手復現(xiàn)一下上述代碼。
使用Python進行圖像處理是理解如何通過數(shù)學和代碼表示圖片的有趣方法,希望這篇文章能讓您了解計算機是如何理解圖像數(shù)據(jù)的。
讓我們從導入需要的庫開始吧!
# First import the required Python Librariesimport numpy as npimport matplotlib.pyplot as pltfrom skimage import img_as_uintfrom skimage.io import imshow, imreadfrom skimage.color import rgb2hsvfrom skimage.color import rgb2gray
一個圖像可以被認為是一個矩陣,其中每個像素的顏色是由一個尺度上的數(shù)字表示。
array_1 = np.array([[255, 0],[]])imshow(array_1, cmap = 'gray');

上面的輸出是我們剛剛創(chuàng)建的矩陣的直觀表示。注意,我們不限于簡單的2x2矩陣。以下是3x3矩陣的示例。
array_2 = np.array([[255, 0, 255],[],[]])imshow(array_2, cmap = 'gray');

我們的示例選擇的是光譜中最極端的顏色,但我們也可以訪問介于兩者之間的任何顏色。
array_spectrum = np.array([np.arange(0,255,17),np.arange(255,0,-17),np.arange(0,255,17),np.arange(255,0,-17)])fig, ax = plt.subplots(1, 2, figsize=(12,4))ax[0].imshow(array_spectrum, cmap = 'gray')ax[0].set_title('Arange Generation')ax[1].imshow(array_spectrum.T, cmap = 'gray')ax[1].set_title('Transpose Generation');

下面的圖像是使用NumPy的arange函數(shù)構造的,并通過獲取第一個圖像的轉置來創(chuàng)建了另一個圖像。
為了簡單起見,我們一直使用灰度,但請記住,計算機實際上理解的顏色是紅色,綠色和藍色的組合。因此,我們可以將圖像表示為三維矩陣。每個像素被表示為一個Python列表,用于指定它們的顏色組合。
array_colors = np.array([[[255, 0, 0],[],[]]])imshow(array_colors);

讓我們嘗試處理真實圖像,下面是一只可愛的小狗的圖片。
doggo = imread('doggo.png')imshow(doggo);

doggo.shape檢查圖像的大小,我們看到它是一個390x385x3矩陣。使用Python我們可以對這個矩陣進行切片,并將每個部分表示為它自己的圖像。
fig, ax = plt.subplots(1, 3,figsize=(6,4),sharey= True)ax[0].imshow(doggo[:, 0:130])ax[0].set_title('First Split')ax[1].imshow(doggo[:, 130:260])ax[1].set_title('Second Split')ax[2].imshow(doggo[:, 260:390])ax[2].set_title('Third Split');

而且我們也可以顯示圖像的任意部分,下面就是小狗的臉部顯示。
imshow(doggo[95:250, 130:275]);
現(xiàn)在讓我們做點有意思的事情~
前面我們說過,一個圖像可以由一個三維矩陣表示,因此我們可以通過以下操作,將圖像分解成紅色、綠色和藍色來分別顯示。
fig, ax = plt.subplots(1, 3, figsize=(12,4), sharey = True)ax[0].imshow(doggo[:,:,0], cmap='Reds')ax[0].set_title('Red')ax[1].imshow(doggo[:,:,1], cmap='Greens')ax[1].set_title('Green')ax[2].imshow(doggo[:,:,2], cmap='Blues')ax[2].set_title('Blue');

此外,我們可以將圖像從RGB(紅,綠,藍)轉換為HSV(色相,飽和度,值)。
doggo_hsv = rgb2hsv(doggo)fig, ax = plt.subplots(1, 3, figsize=(12,4), sharey = True)ax[0].imshow(doggo_hsv[:,:,0], cmap='hsv')ax[0].set_title('Hue')ax[1].imshow(doggo_hsv[:,:,1], cmap='gray')ax[1].set_title('Saturation')ax[2].imshow(doggo_hsv[:,:,2], cmap='gray')ax[2].set_title('Value');

最后,我們還可以將圖像矩陣轉換為灰度。通過將圖像轉換為簡單的二維矩陣,這使我們能夠輕松地根據(jù)每個像素與指定值的關系來過濾圖像。
doggo_gray = rgb2gray(doggo)fig, ax = plt.subplots(1, 5, figsize=(17,6), sharey = True)ax[0].imshow(doggo_gray, cmap = 'gray')ax[0].set_title('Grayscale Original')ax[1].imshow(img_as_uint(doggo_gray > 0.25),cmap = 'gray')ax[1].set_title('Greater than 0.25')ax[2].imshow(img_as_uint(doggo_gray > 0.50),cmap = 'gray')ax[2].set_title('Greater than 0.50');ax[3].imshow(img_as_uint(doggo_gray > 0.75),cmap = 'gray')ax[3].set_title('Greater than 0.75');ax[4].imshow(img_as_uint(doggo_gray > np.mean(doggo_gray)),cmap = 'gray')ax[4].set_title('Greater than Mean');

通過本文我們了解了如何使用Python加載和操作圖像。為了更好地理解圖像在Python中的顯示,最好的辦法就是動手復現(xiàn)一下上述代碼。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內發(fā)送廣告,否則會請出群,謝謝理解~

