溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

用python對圖片進行簡單的處理

發布時間:2021-06-23 09:02:49 來源:億速云 閱讀:294 作者:chen 欄目:開發技術
# 用Python對圖片進行簡單的處理

在數字時代,圖像處理已成為編程中的常見需求。Python憑借豐富的第三方庫(如Pillow、OpenCV等),為圖像處理提供了強大支持。本文將介紹如何使用Python完成裁剪、縮放、濾鏡應用等基礎操作,并附完整代碼示例。

## 一、環境準備

### 1.1 安裝必要庫
```bash
pip install pillow opencv-python numpy matplotlib

1.2 導入庫

from PIL import Image, ImageFilter, ImageEnhance
import cv2
import numpy as np
import matplotlib.pyplot as plt

二、基礎操作

2.1 圖片讀取與顯示

# 使用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()

2.2 圖片保存

img_pil.save("output.jpg", quality=95)  # Pillow保存
cv2.imwrite("output.jpg", img_cv)      # OpenCV保存

三、幾何變換

3.1 調整大小

# 等比例縮放(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))

3.2 圖片裁剪

# 矩形裁剪(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

3.3 旋轉與翻轉

# 旋轉45度(Pillow)
rotated_img = img_pil.rotate(45, expand=True)

# 水平翻轉(OpenCV)
flipped_img = cv2.flip(img_cv, 1)

四、色彩處理

4.1 顏色模式轉換

# 轉灰度圖(Pillow)
gray_img = img_pil.convert("L")

# BGR轉RGB(OpenCV)
rgb_img = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)

4.2 調整亮度/對比度

# 亮度增強(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)

五、濾鏡效果

5.1 模糊效果

# 高斯模糊(Pillow)
blur_img = img_pil.filter(ImageFilter.GaussianBlur(radius=5))

# 中值模糊(OpenCV)
blur_img = cv2.medianBlur(img_cv, 5)

5.2 邊緣檢測

# Sobel算子(OpenCV)
gray = cv2.cvtColor(img_cv, cv2.COLOR_BGR2GRAY)
sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5)

5.3 素描效果

# 生成素描(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)

六、高級應用

6.1 添加文字水印

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)

6.2 圖片合成

# 透明度混合(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)

6.3 人臉檢測

# 使用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)

七、批量處理

7.1 目錄遍歷處理

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))

7.2 多線程加速

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))

八、性能優化技巧

  1. 減少I/O操作:盡量在內存中完成多次操作后再保存
  2. 適當降低分辨率:處理前先縮小尺寸,完成后再還原
  3. 使用Numpy向量化:OpenCV矩陣運算比Pillow像素級操作更快
  4. 選擇正確庫
    • Pillow適合簡單操作和格式轉換
    • OpenCV適合計算機視覺任務
    • scikit-image適合科研級處理

九、完整示例:制作縮略圖并添加水印

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閱讀器查看格式效果。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女