一文教你如何利用 Python 進(jìn)行圖像處理
圖像處理是計(jì)算機(jī)視覺(jué)領(lǐng)域的一個(gè)重要分支,廣泛應(yīng)用于各種場(chǎng)景,如社交媒體濾鏡、醫(yī)療影像分析、自動(dòng)駕駛等。Python 作為一門(mén)強(qiáng)大的編程語(yǔ)言,提供了多種庫(kù)來(lái)幫助我們輕松地進(jìn)行圖像處理。今天,我們就一起來(lái)學(xué)習(xí)如何使用 Python 進(jìn)行圖像處理。
1. 安裝必要的庫(kù)
首先,我們需要安裝一些常用的圖像處理庫(kù)。最常用的是 Pillow 和 OpenCV。你可以使用以下命令來(lái)安裝它們:
pip install pillow opencv-python
2. 使用 Pillow 庫(kù)讀取和顯示圖像
Pillow 是 Python Imaging Library (PIL) 的一個(gè)分支,提供了豐富的圖像處理功能。我們先來(lái)看如何使用 Pillow 讀取和顯示圖像。
from PIL import Image
# 讀取圖像
image = Image.open('example.jpg')
# 顯示圖像
image.show()
這段代碼首先導(dǎo)入了 Image 模塊,然后使用 Image.open() 方法讀取圖像文件,最后使用 image.show() 方法顯示圖像。
3. 圖像的基本操作
(1) 裁剪圖像
裁剪圖像是一個(gè)常見(jiàn)的操作,可以通過(guò)指定坐標(biāo)來(lái)實(shí)現(xiàn)。
# 裁剪圖像
cropped_image = image.crop((50, 50, 200, 200))
cropped_image.show()
這里,crop() 方法接受一個(gè)元組 (left, upper, right, lower),表示裁剪區(qū)域的左上角和右下角坐標(biāo)。
(2) 調(diào)整圖像大小
調(diào)整圖像大小可以使用 resize() 方法。
# 調(diào)整圖像大小
resized_image = image.resize((300, 300))
resized_image.show()
resize() 方法接受一個(gè)元組 (width, height),表示新的寬度和高度。
(3) 旋轉(zhuǎn)圖像
旋轉(zhuǎn)圖像是另一個(gè)常見(jiàn)的操作。
# 旋轉(zhuǎn)圖像
rotated_image = image.rotate(90)
rotated_image.show()
rotate() 方法接受一個(gè)角度值,表示旋轉(zhuǎn)的角度。
4. 使用 OpenCV 進(jìn)行圖像處理
OpenCV 是一個(gè)強(qiáng)大的計(jì)算機(jī)視覺(jué)庫(kù),提供了更多的圖像處理功能。我們來(lái)看一些基本的操作。
(1) 讀取和顯示圖像
import cv2
# 讀取圖像
image = cv2.imread('example.jpg')
# 顯示圖像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
這里,cv2.imread() 用于讀取圖像,cv2.imshow() 用于顯示圖像,cv2.waitKey(0) 用于等待用戶按鍵,cv2.destroyAllWindows() 用于關(guān)閉所有窗口。
(2) 轉(zhuǎn)換為灰度圖像
將彩色圖像轉(zhuǎn)換為灰度圖像是一個(gè)常見(jiàn)的操作。
# 轉(zhuǎn)換為灰度圖像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.cvtColor() 方法用于顏色空間轉(zhuǎn)換,cv2.COLOR_BGR2GRAY 表示將 BGR 顏色空間轉(zhuǎn)換為灰度。
(3) 邊緣檢測(cè)
邊緣檢測(cè)是計(jì)算機(jī)視覺(jué)中的一個(gè)重要任務(wù)。
# 邊緣檢測(cè)
edges = cv2.Canny(gray_image, 100, 200)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.Canny() 方法用于邊緣檢測(cè),接受兩個(gè)閾值參數(shù),分別表示低閾值和高閾值。
5. 實(shí)戰(zhàn)案例:圖像分類(lèi)
假設(shè)我們有一個(gè)簡(jiǎn)單的圖像分類(lèi)任務(wù),需要識(shí)別圖像中的貓和狗。我們可以使用預(yù)訓(xùn)練的深度學(xué)習(xí)模型來(lái)完成這個(gè)任務(wù)。這里我們使用 Keras 和 TensorFlow。
import tensorflow as tf
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions
from tensorflow.keras.preprocessing import image
import numpy as np
# 加載預(yù)訓(xùn)練模型
model = ResNet50(weights='imagenet')
# 讀取圖像
img_path = 'cat_or_dog.jpg'
img = image.load_img(img_path, target_size=(224, 224))
# 預(yù)處理圖像
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
# 預(yù)測(cè)
preds = model.predict(x)
print('Predicted:', decode_predictions(preds, top=3)[0])
這段代碼首先加載了一個(gè)預(yù)訓(xùn)練的 ResNet50 模型,然后讀取并預(yù)處理圖像,最后進(jìn)行預(yù)測(cè)并輸出結(jié)果。