首頁 > 軟體

educoder之Python數值計算庫Numpy影象處理詳解

2023-09-12 18:01:39

NumPy   Python數值計算重要庫

在影象處理領域,NumPy可以幫助我們高效地對影象進行處理。通過使用NumPy中的陣列操作,我們可以快速地完成各種基本的影象處理任務,例如影象的裁剪、縮放、翻轉、色彩模式轉換等

讀取和顯示影象

首先,在處理影象之前,我們需要將影象載入到Python程式中。在Python中,可以使用PIL(Python Imaging Library)或OpenCV等庫來讀取影象。下面是使用PIL庫讀取一張圖片並在視窗中顯示的範例程式碼:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
# 讀入圖片
img = Image.open('test.jpg') 
# 顯示圖片
plt.imshow(np.asarray(img))
plt.show()

影象的大小調整

接下來,我們看一下如何通過NumPy來調整影象的大小。有時候,我們需要將一個大尺寸的影象縮放成小尺寸的影象。在這裡,我們將使用ndarray物件的resize()方法以及scipy.interpolate中的interpolate()方法實現影象的縮放。

from scipy import interpolate
# 將影象放大兩倍
scale_factor = 2
image_arr = np.array(img)
width, height = image_arr.shape[:2]
new_width, new_height = int(scale_factor * width), int(scale_factor * height)
# 採用scipy.interpolate的interpolate()方法實現縮放
a, b = np.linspace(0, width, width), np.linspace(0, height, height)
x, y = np.meshgrid(a,b)
f = interpolate.interp2d(x, y, image_arr, kind='cubic')
new_x, new_y = np.linspace(0, width, new_width), np.linspace(0, height, new_height)
new_image_arr = f(new_x, new_y)
# 重新轉為影象格式,顯示出來觀察。
new_image = Image.fromarray(np.uint8(new_image_arr))
plt.imshow(np.asarray(new_image))
plt.show()

影象的翻轉

在有些場景下,我們需要將影象水平或垂直翻轉。NumPy中提供了flip()方法來實現影象的翻轉操作。

# 將影象水平翻轉
img_flip_horizontal = np.fliplr(image_arr)
# 將影象垂直翻轉
img_flip_vertical = np.flipud(image_arr)

影象縮放和裁剪

調整影象大小是常見的影象處理任務,除此之外,您還可能需要對影象進行裁剪或者縮放的同時進行裁剪。在這裡,我們使用與之前一樣的方法,即resize()實現影象縮放,並且結合crop()方法對圖片進行裁剪。

# 影象縮放並裁剪
scale_factor = 2
crop_area = (50, 100, 250, 350)
image_arr = np.array(img)
width, height = image_arr.shape[1], image_arr.shape[0]
new_width, new_height = int(scale_factor * width), int(scale_factor * height)
new_image_arr = np.asarray(Image.fromarray(image_arr).resize((new_width, new_height)))
# 裁剪影象
left, upper, right, lower = crop_area
cropped_image_arr = new_image_arr[upper:lower, left:right]
# 顯示處理過的圖片
plt.imshow(np.asarray(Image.fromarray(cropped_image_arr)))

顏色通道處理

在一些情況下,我們需要進行影象顏色通道處理。例如,我們可能需要將影象轉換為灰度影象或對三個顏色通道分別進行操作,這可以用於實現許多視覺處理等演演算法中。

# 灰度化
gray_image_arr = np.dot(image_arr, [0.2989, 0.5870, 0.1140])
gray_image = Image.fromarray(np.uint8(gray_image_arr))
plt.imshow(np.asarray(gray_image))
# 顏色通道處理
red_channel_arr = np.zeros_like(image_arr)
red_channel_arr[:, :, 0] = image_arr[:, :, 0]
red_channel_image = Image.fromarray(np.uint8(red_channel_arr))
plt.imshow(np.asarray(red_channel_image))
green_channel_arr = np.zeros_like(image_arr)
green_channel_arr[:, :, 1] = image_arr[:, :, 1]
green_channel_image = Image.fromarray(np.uint8(green_channel_arr))
plt.imshow(np.asarray(green_channel_image))
blue_channel_arr = np.zeros_like(image_arr)
blue_channel_arr[:, :, 2] = image_arr[:, :, 2]
blue_channel_image = Image.fromarray(np.uint8(blue_channel_arr))
plt.imshow(np.asarray(blue_channel_image))

影象濾波

影象濾波是另一個有用的影象處理任務。NumPy中提供了多種影象濾波的方法,其中之一是折積操作。下面的程式碼演示如何使用3x3折積核進行影象平滑化。

# 影象平滑化
kernel = np.ones((3, 3), np.float32) / 9
smooth_image_arr = cv2.filter2D(image_arr, -1, kernel)
# 顯示濾波過後的圖片
plt.imshow(smooth_image_arr)

以上就是educoder之Python數值計算庫Numpy影象處理詳解的詳細內容,更多關於Python 數值計算庫 Numpy的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com