# 用Python對圖片進行簡單的處理
在數字時代,圖像處理已成為編程中的常見需求。Python憑借豐富的第三方庫(如Pillow、OpenCV等),為圖像處理提供了強大支持。本文將介紹如何使用Python完成裁剪、縮放、濾鏡應用等基礎操作,并附完整代碼示例。
## 一、環境準備
### 1.1 安裝必要庫
```bash
pip install pillow opencv-python numpy matplotlib
from PIL import Image, ImageFilter, ImageEnhance
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 使用Pillow讀取
img_pil = Image.open("input.jpg")
# 使用OpenCV讀取
img_cv = cv2.imread("input.jpg")
# 顯示圖片(Pillow)
img_pil.show()
# 顯示圖片(Matplotlib)
plt.imshow(cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
img_pil.save("output.jpg", quality=95) # Pillow保存
cv2.imwrite("output.jpg", img_cv) # OpenCV保存
# 等比例縮放(Pillow)
width, height = img_pil.size
new_width = 800
new_height = int(height * (new_width / width))
resized_img = img_pil.resize((new_width, new_height))
# 指定尺寸縮放(OpenCV)
resized_img = cv2.resize(img_cv, (800, 600))
# 矩形裁剪(Pillow)
box = (100, 100, 500, 400) # (left, top, right, bottom)
cropped_img = img_pil.crop(box)
# 區域裁剪(OpenCV)
roi = img_cv[100:400, 100:500] # y-range, x-range
# 旋轉45度(Pillow)
rotated_img = img_pil.rotate(45, expand=True)
# 水平翻轉(OpenCV)
flipped_img = cv2.flip(img_cv, 1)
# 轉灰度圖(Pillow)
gray_img = img_pil.convert("L")
# BGR轉RGB(OpenCV)
rgb_img = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)
# 亮度增強(Pillow)
enhancer = ImageEnhance.Brightness(img_pil)
bright_img = enhancer.enhance(1.5) # 1.5倍亮度
# 對比度調整(OpenCV)
alpha = 1.5 # 對比度系數
beta = 10 # 亮度增量
adjusted_img = cv2.convertScaleAbs(img_cv, alpha=alpha, beta=beta)
# 高斯模糊(Pillow)
blur_img = img_pil.filter(ImageFilter.GaussianBlur(radius=5))
# 中值模糊(OpenCV)
blur_img = cv2.medianBlur(img_cv, 5)
# Sobel算子(OpenCV)
gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5)
# 生成素描(OpenCV)
gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
inverted = 255 - gray
blurred = cv2.GaussianBlur(inverted, (21, 21), 0)
sketch = cv2.divide(gray, 255 - blurred, scale=256)
from PIL import ImageDraw, ImageFont
draw = ImageDraw.Draw(img_pil)
font = ImageFont.truetype("arial.ttf", 40)
draw.text((10, 10), "Sample Watermark", fill=(255, 0, 0), font=font)
# 透明度混合(Pillow)
foreground = Image.open("watermark.png")
img_pil.paste(foreground, (0, 0), foreground) # 最后一個參數是蒙版
# 加權混合(OpenCV)
blended = cv2.addWeighted(img_cv, 0.7, foreground_cv, 0.3, 0)
# 使用OpenCV Haar級聯
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 繪制檢測框
for (x,y,w,h) in faces:
cv2.rectangle(img_cv, (x,y), (x+w,y+h), (255,0,0), 2)
import os
input_dir = "input_images/"
output_dir = "output_images/"
for filename in os.listdir(input_dir):
if filename.endswith((".jpg", ".png")):
img = Image.open(os.path.join(input_dir, filename))
# 處理操作...
img.save(os.path.join(output_dir, filename))
from concurrent.futures import ThreadPoolExecutor
def process_image(filename):
# 圖像處理邏輯
pass
with ThreadPoolExecutor(max_workers=4) as executor:
executor.map(process_image, os.listdir(input_dir))
def create_thumbnail(input_path, output_path, size=(300, 300)):
"""生成帶水印的縮略圖"""
try:
# 打開原始圖片
img = Image.open(input_path)
# 生成縮略圖(保持比例)
img.thumbnail(size)
# 添加文字水印
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("arial.ttf", 20)
text = "? My Gallery"
textwidth, textheight = draw.textsize(text, font)
# 計算水印位置(右下角)
x = img.width - textwidth - 10
y = img.height - textheight - 10
draw.text((x, y), text, (255, 255, 255), font)
# 保存結果
img.save(output_path)
return True
except Exception as e:
print(f"Error processing {input_path}: {str(e)}")
return False
本文介紹了Python圖像處理的基礎技術棧,涵蓋: - Pillow和OpenCV的核心操作 - 幾何變換與色彩調整 - 常用濾鏡效果實現 - 批量處理與性能優化
建議進一步學習: - 更高級的OpenCV功能(特征檢測、對象識別等) - 使用scikit-image進行科學圖像處理 - 深度學習框架(如TensorFlow/PyTorch)在圖像處理中的應用
通過靈活組合這些技術,可以構建復雜的圖像處理流水線,滿足各種實際需求。
附錄:常用圖像格式對比
格式 | 特點 | 適用場景 |
---|---|---|
JPEG | 有損壓縮,文件小 | 網頁圖片、照片 |
PNG | 無損壓縮,支持透明 | 需要透明底的圖像 |
GIF | 支持動畫 | 簡單動畫、表情包 |
WEBP | 谷歌新格式,壓縮率高 | 現代網頁應用 |
TIFF | 無損高質量 | 印刷、專業攝影 |
”`
注:本文實際約2300字,可根據需要增減具體示例代碼或擴展特定章節內容。建議保存為.md文件后用Markdown閱讀器查看格式效果。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。