最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用Pillow與OpenCV進行圖像處理實戰(zhàn)

 更新時間:2026年05月27日 08:54:21   作者:生當鼎食死封侯  
本文詳細介紹了Python圖像處理的兩大工具Pillow與OpenCV的基本概念、功能及使用技巧,涵蓋圖像讀寫、處理、濾鏡、顏色調整等目標檢測等,并并對比了兩者的優(yōu)勢與應用場景,助你輕松應對各種圖像處理需求,需要的朋友可以參考下

前言

在日常開發(fā)中,圖像處理是一個非常實用的技能。無論是給照片加水印、批量調整圖片尺寸,還是做人臉識別、圖像分類,Python 都有對應的工具庫。

Python 圖像處理主要有兩大工具:

對比維度PillowOpenCV
定位通用圖像處理計算機視覺
優(yōu)勢簡單易用、功能豐富高性能、算法豐富
安裝pip install pillowpip install opencv-python
顏色順序RGBBGR (注意!)
視頻支持
GPU加速
學習難度中高

本文將從 Pillow 開始,循序漸進地介紹圖像處理的方方面面。

第一章:Pillow —— Python 圖像處理入門

1.1 Pillow 是什么

Pillow 是 Python Imaging Library (PIL) 的一個活躍分支。PIL 原版已經停止維護,Pillow 繼承了 PIL 的所有功能并持續(xù)更新。

Pillow 支持:

  • 讀寫 30+ 種圖像格式(PNG、JPEG、BMP、GIF、TIFF、WebP 等)
  • 圖像縮放、旋轉、裁剪、翻轉
  • 色彩模式轉換(RGB、RGBA、灰度、L、1 等)
  • 濾鏡效果(模糊、銳化、邊緣檢測、浮雕等)
  • 圖像增強(亮度、對比度、色彩飽和度)
  • 在圖像上繪制文字和圖形
  • 圖像合成與疊加
pip install pillow
from PIL import Image, ImageDraw, ImageFont, ImageFilter, ImageEnhance

1.2 圖像基礎概念

在學習圖像處理之前,需要理解幾個核心概念:

像素(Pixel)

像素是圖像的最小單位。每張圖片都是由大量像素排列組成的網格:

顏色模式

模式說明每像素字節(jié)數(shù)用途
1黑白(1-bit)1/8位圖
L灰度1黑白照片
RGB紅綠藍三通道3彩色 圖片
RGBARGB + 透明度4需要透明的圖片
CMYK印刷四色4印刷輸出
P調色板模式1GIF 動畫

圖像尺寸與分辨率

# 圖片尺寸 = 寬 × 高 (單位:像素)
# 1920 × 1080 = 2,073,600 像素 (約200萬像素,即 2MP)

# DPI (Dots Per Inch) = 每英寸的像素數(shù)
# 72 DPI: 屏幕顯示標準
# 150 DPI: 普通打印
# 300 DPI: 高質量打印

1.3 圖像的打開與創(chuàng)建

打開已有圖片

from PIL import Image

# 打開圖片
img = Image.open('photo.jpg')

# 查看圖片信息
print(f"格式: {img.format}")      # JPEG, PNG 等
print(f"模式: {img.mode}")        # RGB, RGBA, L 等
print(f"尺寸: {img.size}")        # (寬度, 高度)
print(f"寬度: {img.width} 像素")
print(f"高度: {img.height} 像素")

# 查看 EXIF 信息(相機參數(shù)等)
exif = img._getexif()
if exif:
    for tag_id, value in exif.items():
        print(f"  {tag_id}: {value}")

創(chuàng)建新圖片

# 創(chuàng)建空白圖片
img = Image.new('RGB', (800, 400), color='#2c3e50')

# 創(chuàng)建透明圖片
img = Image.new('RGBA', (400, 300), (0, 0, 0, 0))

# 從像素數(shù)據創(chuàng)建
pixels = [(255, 0, 0), (0, 255, 0), (0, 0, 255)]
img = Image.new('RGB', (3, 1))
img.putdata(pixels)

運行效果 —— 創(chuàng)建自定義圖形:

1.4 圖像的保存與格式轉換

Pillow 支持在不同格式之間自由轉換:

img = Image.open('source.png')

# 保存為不同格式
img.save('output.jpg', 'JPEG', quality=95)   # JPEG, 質量95%
img.save('output.bmp', 'BMP')                # BMP 無損
img.save('output.webp', 'WEBP')              # WebP 現(xiàn)代格式
img.save('output.gif', 'GIF')                # GIF
img.save('output.tiff', 'TIFF')              # TIFF 專業(yè)格式

各格式的文件大小對比(同一張圖片):

格式測試輸出:
  PNG: .png → 1.9 KB     ← 無損壓縮,體積中等
  JPEG: .jpg → 6.5 KB    ← 有損壓縮,體積較大
  BMP: .bmp → 351.6 KB   ← 無壓縮,體積巨大
  WEBP: .webp → 0.9 KB   ← 新一代格式,體積最小
格式特點適用場景透明支持
PNG無損壓縮網頁圖標、截圖支持
JPEG有損壓縮、高壓縮率照片存儲不支持
BMP無壓縮、原始數(shù)據需要無損的場景不支持
WebP高壓縮率、現(xiàn)代格式網頁優(yōu)化支持
GIF動畫、256色限制表情包、動畫支持
TIFF無損、多頁印刷、醫(yī)療影像支持

1.5 圖像裁剪與縮放

運行效果:

裁剪

img = Image.open('photo.jpg')

# 裁剪區(qū)域: (左, 上, 右, 下)
cropped = img.crop((100, 50, 500, 350))
cropped.save('cropped.jpg')

裁剪坐標示意:

縮放

# 指定尺寸縮放(可能變形)
resized = img.resize((400, 300))

# 高質量縮放(使用 LANCZOS 濾波器)
resized = img.resize((400, 300), Image.LANCZOS)

# 等比縮放(保持寬高比)
img.thumbnail((800, 800))  # 最大邊不超過800

# 放大 2 倍
enlarged = img.resize((img.width * 2, img.height * 2), Image.LANCZOS)

縮放質量對比:

方法說明速度質量
NEAREST最近鄰插值最快最差(鋸齒)
BILINEAR雙線性插值較快一般
BICUBIC雙三次插值較慢較好
LANCZOSLanczos 重采樣最慢最好

1.6 旋轉與翻轉

運行效果:

img = Image.open('photo.jpg')

# 旋轉
rotated_45 = img.rotate(45)                    # 逆時針旋轉45度
rotated_90 = img.rotate(90, expand=True)       # 旋轉90度,擴展畫布
rotated_free = img.rotate(30, expand=True, fillcolor='#2c3e50')  # 自定義背景色

# 翻轉
flipped_h = img.transpose(Image.FLIP_LEFT_RIGHT)  # 水平翻轉
flipped_v = img.transpose(Image.FLIP_TOP_BOTTOM)  # 垂直翻轉

1.7 繪圖與文字

Pillow 提供了 ImageDraw 模塊,可以在圖片上繪制各種圖形和文字:

from PIL import Image, ImageDraw, ImageFont

img = Image.new('RGB', (800, 400), '#ecf0f1')
draw = ImageDraw.Draw(img)

# 繪制矩形
draw.rectangle([50, 50, 200, 200], fill='#e74c3c', outline='white', width=3)

# 繪制橢圓
draw.ellipse([250, 50, 400, 200], fill='#3498db', outline='white', width=3)

# 繪制三角形
draw.polygon([(500, 200), (450, 50), (550, 50)], fill='#2ecc71', outline='white')

# 繪制圓角矩形
draw.rounded_rectangle([600, 50, 750, 200], radius=20, fill='#f39c12')

# 繪制線條
draw.line([(50, 250), (750, 250)], fill='#2c3e50', width=3)

# 繪制文字
font = ImageFont.truetype("msyh.ttc", 36)  # 微軟雅黑36號
draw.text((200, 300), 'Hello Pillow!', fill='#2c3e50', font=font)

繪制函數(shù)速查:

方法說明參數(shù)
rectangle(xy, fill, outline, width)矩形(左,上,右,下)
ellipse(xy, fill, outline, width)橢圓/圓(左,上,右,下)
polygon(points, fill, outline)多邊形[(x1,y1), (x2,y2), ...]
line(xy, fill, width)線段(x1,y1,x2,y2)
text(xy, text, fill, font)文字(x,y), 文本, 字體
arc(xy, start, end, fill, width)弧線角度(度)
chord(xy, start, end, fill, outline)角度
pieslice(xy, start, end, fill)扇形角度
rounded_rectangle圓角矩形半徑參數(shù)

1.8 濾鏡效果大全

運行效果:

Pillow 內置了多種濾鏡:

from PIL import ImageFilter

img = Image.open('photo.jpg')

# 模糊
img_blur = img.filter(ImageFilter.GaussianBlur(radius=5))
img_blur = img.filter(ImageFilter.BLUR)           # 默認模糊

# 銳化
img_sharpen = img.filter(ImageFilter.SHARPEN)
img_sharpen = img.filter(ImageFilter.UnsharpMask(radius=2, percent=150))

# 邊緣檢測
img_edges = img.filter(ImageFilter.FIND_EDGES)

# 浮雕
img_emboss = img.filter(ImageFilter.EMBOSS)

# 輪廓
img_contour = img.filter(ImageFilter.CONTOUR)

# 細節(jié)增強
img_detail = img.filter(ImageFilter.DETAIL)

# 平滑
img_smooth = img.filter(ImageFilter.SMOOTH)
img_smooth_more = img.filter(ImageFilter.SMOOTH_MORE)

# 多重濾鏡疊加
result = img.filter(ImageFilter.GaussianBlur(2)).filter(ImageFilter.SHARPEN)

所有內置濾鏡一覽:

濾鏡效果適用場景
BLUR模糊背景虛化、隱私保護
CONTOUR輪廓素描效果
DETAIL細節(jié)增強照片銳化
EDGE_ENHANCE邊緣增強圖像增強
EDGE_ENHANCE_MORE強邊緣增強更強的增強
EMBOSS浮雕藝術效果
FIND_EDGES邊緣檢測圖像分析
SHARPEN銳化照片修復
SMOOTH平滑降噪
SMOOTH_MORE更強平滑更強降噪
GaussianBlur(n)高斯模糊可控模糊程度
UnsharpMask反銳化蒙版專業(yè)銳化

1.9 顏色調整與增強

運行效果:

from PIL import ImageEnhance

img = Image.open('photo.jpg')

# 亮度調整 (1.0=原始, >1增強, <1減弱)
enhancer = ImageEnhance.Brightness(img)
bright = enhancer.enhance(1.5)  # 亮度提高50%

# 對比度調整
enhancer = ImageEnhance.Contrast(img)
contrast = enhancer.enhance(1.8)  # 對比度提高80%

# 色彩飽和度調整
enhancer = ImageEnhance.Color(img)
color = enhancer.enhance(2.0)  # 飽和度翻倍

# 銳度調整
enhancer = ImageEnhance.Sharpness(img)
sharp = enhancer.enhance(2.0)  # 銳度翻倍

# 綜合調整
from PIL import ImageOps
img_auto = ImageOps.autocontrast(img)    # 自動對比度
img_equalize = ImageOps.equalize(img)    # 直方圖均衡化
img_invert = ImageOps.invert(img.convert('RGB'))  # 反色
img_gray = ImageOps.grayscale(img)       # 轉灰度

顏色調整效果表:

方法調整值范圍效果典型值
Brightness0.0 ~ ∞明暗1.2~1.5
Contrast0.0 ~ ∞對比1.3~1.8
Color0.0 ~ ∞飽和度1.5~2.5
Sharpness0.0 ~ ∞清晰度1.5~3.0

1.10 水印與合成

運行效果:

文字水印

from PIL import Image, ImageDraw, ImageFont

def add_text_watermark(image_path, text, output_path, opacity=128):
    img = Image.open(image_path).convert('RGBA')
    watermark = Image.new('RGBA', img.size, (0, 0, 0, 0))
    draw = ImageDraw.Draw(watermark)

    font = ImageFont.truetype("msyh.ttc", 36)
    # 在右下角添加水印
    bbox = draw.textbbox((0, 0), text, font=font)
    x = img.width - bbox[2] - 20
    y = img.height - bbox[3] - 20
    draw.text((x, y), text, fill=(128, 128, 128, opacity), font=font)

    result = Image.alpha_composite(img, watermark)
    result.convert('RGB').save(output_path)

圖片水印

def add_image_watermark(image_path, watermark_path, output_path, position='bottom-right'):
    img = Image.open(image_path).convert('RGBA')
    watermark = Image.open(watermark_path).convert('RGBA')

    # 縮放水印
    wm_size = (img.width // 5, img.height // 5)
    watermark = watermark.resize(wm_size, Image.LANCZOS)

    # 計算位置
    if position == 'bottom-right':
        x = img.width - wm_size[0] - 20
        y = img.height - wm_size[1] - 20
    elif position == 'center':
        x = (img.width - wm_size[0]) // 2
        y = (img.height - wm_size[1]) // 2

    # 調整透明度
    watermark.putalpha(watermark.split()[3])

    # 合成
    img.paste(watermark, (x, y), watermark)
    img.convert('RGB').save(output_path)

圖片拼接

def combine_images(images, cols=2, padding=10, bg_color='#2c3e50'):
    rows_count = (len(images) + cols - 1) // cols
    max_w = max(img.width for img in images)
    max_h = max(img.height for img in images)

    combined_w = cols * max_w + (cols + 1) * padding
    combined_h = rows_count * max_h + (rows_count + 1) * padding

    combined = Image.new('RGB', (combined_w, combined_h), bg_color)

    for i, img in enumerate(images):
        row = i // cols
        col = i % cols
        x = padding + col * (max_w + padding)
        y = padding + row * (max_h + padding)
        combined.paste(img, (x, y))

    return combined

1.11 實戰(zhàn)案例:批量處理圖片

將前面學的技術組合起來,做一個實用的批量處理腳本:

"""
批量處理圖片:調整大小 + 加水印 + 轉換格式
"""
from PIL import Image, ImageDraw, ImageFont, ImageEnhance, ImageFilter
import os

def batch_process(input_dir, output_dir, max_size=(1920, 1080),
                  watermark_text=None, output_format='JPEG'):
    """批量處理圖片"""
    os.makedirs(output_dir, exist_ok=True)

    supported = {'.jpg', '.jpeg', '.png', '.bmp', '.webp', '.tiff'}

    for filename in os.listdir(input_dir):
        ext = os.path.splitext(filename)[1].lower()
        if ext not in supported:
            continue

        filepath = os.path.join(input_dir, filename)
        try:
            img = Image.open(filepath)
        except Exception:
            print(f"跳過無法打開的文件: {filename}")
            continue

        # 1. 轉為 RGB(去除透明通道)
        if img.mode in ('RGBA', 'P'):
            img = img.convert('RGB')

        # 2. 縮放到最大尺寸
        img.thumbnail(max_size, Image.LANCZOS)

        # 3. 輕微銳化
        img = img.filter(ImageFilter.SHARPEN)

        # 4. 自動對比度
        from PIL import ImageOps
        img = ImageOps.autocontrast(img)

        # 5. 添加水印
        if watermark_text:
            draw = ImageDraw.Draw(img)
            try:
                font = ImageFont.truetype("msyh.ttc", max(20, img.width // 30))
            except:
                font = ImageFont.load_default()
            text = watermark_text
            bbox = draw.textbbox((0, 0), text, font=font)
            x = img.width - (bbox[2] - bbox[0]) - 20
            y = img.height - (bbox[3] - bbox[1]) - 20
            draw.text((x, y), text, fill=(255, 255, 255), font=font)

        # 6. 保存
        name = os.path.splitext(filename)[0]
        output_path = os.path.join(output_dir, f"{name}.{output_format.lower()}")
        img.save(output_path, output_format, quality=90)
        print(f"已處理: {filename} → {output_path}")

# 使用
batch_process(
    input_dir='./photos',
    output_dir='./photos_processed',
    max_size=(1920, 1080),
    watermark_text='? 2025 MyBlog'
)

第二章:OpenCV —— 計算機視覺利器

2.1 OpenCV 簡介

OpenCV(Open Source Computer Vision Library)是世界上最大的計算機視覺庫,支持 2500+ 種算法,覆蓋圖像處理、物體檢測、人臉識別、OCR、姿態(tài)估計等領域。

pip install opencv-python
pip install opencv-contrib-python  # 包含額外模塊
import cv2
import numpy as np

重要區(qū)別:OpenCV 使用 BGR 順序(藍-綠-紅),而不是 PIL 的 RGB 順序。這是一個常見的坑!

2.2 圖像讀取與基本操作

import cv2

# 讀取圖片 (BGR 格式)
img = cv2.imread('photo.jpg')
img_color = cv2.imread('photo.jpg', cv2.IMREAD_COLOR)     # 彩色(默認)
img_gray = cv2.imread('photo.jpg', cv2.IMREAD_GRAYSCALE)  # 灰度

# 查看信息
print(f"形狀: {img.shape}")       # (高度, 寬度, 通道數(shù))
print(f"數(shù)據類型: {img.dtype}")   # uint8
print(f"像素總數(shù): {img.size}")    # 高 × 寬 × 通道

# 顯示圖片
cv2.imshow('Image', img)
cv2.waitKey(0)       # 按任意鍵關閉
cv2.destroyAllWindows()

# 保存圖片
cv2.imwrite('output.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 95])

像素操作

# 讀取單個像素 (BGR)
pixel = img[100, 200]    # [B, G, R] 值

# 修改像素
img[100, 200] = [255, 0, 0]  # 藍色

# ROI(感興趣區(qū)域)
roi = img[50:200, 100:300]   # (y1:y2, x1:x2)
img[50:200, 100:300] = 0     # 將該區(qū)域涂黑

# 使用掩碼
mask = np.zeros(img.shape[:2], dtype=np.uint8)
mask[50:200, 100:300] = 255
result = cv2.bitwise_and(img, img, mask=mask)

2.3 圖像變換

import cv2
import numpy as np

img = cv2.imread('photo.jpg')

# 縮放
resized = cv2.resize(img, (400, 300))                    # 指定尺寸
scaled = cv2.resize(img, None, fx=0.5, fy=0.5)           # 按比例

# 旋轉
h, w = img.shape[:2]
center = (w // 2, h // 2)
matrix = cv2.getRotationMatrix2D(center, angle=45, scale=1.0)
rotated = cv2.warpAffine(img, matrix, (w, h))

# 仿射變換
pts1 = np.float32([[0, 0], [w-1, 0], [0, h-1]])     # 原始3個點
pts2 = np.float32([[0, 0], [w-1, 0], [int(w*0.33), h-1]])  # 目標3個點
matrix = cv2.getAffineTransform(pts1, pts2)
warped = cv2.warpAffine(img, matrix, (w, h))

# 透視變換
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])
matrix = cv2.getPerspectiveTransform(pts1, pts2)
perspective = cv2.warpPerspective(img, matrix, (300, 300))

2.4 圖像濾波

img = cv2.imread('photo.jpg')

# 均值模糊
blur = cv2.blur(img, (5, 5))

# 高斯模糊(更自然的模糊效果)
gaussian = cv2.GaussianBlur(img, (5, 5), 0)

# 中值濾波(去除椒鹽噪聲效果最好)
median = cv2.medianBlur(img, 5)

# 雙邊濾波(保邊去噪)
bilateral = cv2.bilateralFilter(img, 9, 75, 75)

濾波效果對比:

方法效果噪聲類型邊緣保留
均值模糊整體模糊高斯噪聲
高斯模糊平滑模糊高斯噪聲一般
中值濾波清晰保留細節(jié)椒鹽噪聲
雙邊濾波邊緣清晰所有噪聲最好

2.5 邊緣檢測

img = cv2.imread('photo.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Canny 邊緣檢測(最常用)
edges = cv2.Canny(gray, threshold1=50, threshold2=150)

# Sobel 算子
sobel_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)
sobel = cv2.magnitude(sobel_x, sobel_y)

# Laplacian 算子
laplacian = cv2.Laplacian(gray, cv2.CV_64F)

# 邊緣檢測 + 二值化
_, binary = cv2.threshold(edges, 127, 255, cv2.THRESH_BINARY)

Canny 邊緣檢測的兩個閾值參數(shù):

  • threshold1: 低閾值 —— 弱邊緣
  • threshold2: 高閾值 —— 強邊緣
  • 兩者之間的像素如果與強邊緣相連,也會被保留

2.6 顏色空間轉換

img = cv2.imread('photo.jpg')

# BGR → 灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# BGR → RGB(與PIL互轉時需要)
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# BGR → HSV(色相-飽和度-明度,顏色分割常用)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# BGR → LAB(感知均勻的顏色空間)
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)

# HSV 顏色分割示例
lower_red = np.array([0, 100, 100])
upper_red = np.array([10, 255, 255])
mask = cv2.inRange(hsv, lower_red, upper_red)
red_only = cv2.bitwise_and(img, img, mask=mask)

常用顏色空間:

顏色空間組成優(yōu)勢適用場景
BGR藍-綠-紅OpenCV 默認通用
RGB紅-綠-藍通用標準PIL/Web 互轉
HSV色相-飽和度-明值顏色分割方便顏色檢測
Grayscale灰度單通道、計算快邊緣檢測、OCR
LAB明度-紅綠-藍黃感知均勻顏色對比
YCrCb亮度-紅差-藍差膚色檢測人臉識別

2.7 形態(tài)學操作

形態(tài)學操作基于數(shù)學形態(tài)學理論,常用于二值圖像處理:

import cv2
import numpy as np

# 先二值化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 定義結構元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# 也可用圓形: cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))

# 腐蝕 —— 收縮白色區(qū)域
eroded = cv2.erode(binary, kernel, iterations=1)

# 膨脹 —— 擴張白色區(qū)域
dilated = cv2.dilate(binary, kernel, iterations=1)

# 開運算 —— 先腐蝕后膨脹(去噪點)
opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)

# 閉運算 —— 先膨脹后腐蝕(填孔洞)
closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)

# 形態(tài)學梯度 —— 膨脹 - 腐蝕(提取邊緣)
gradient = cv2.morphologyEx(binary, cv2.MORPH_GRADIENT, kernel)

# 頂帽 —— 原圖 - 開運算(提取小亮區(qū)域)
tophat = cv2.morphologyEx(binary, cv2.MORPH_TOPHAT, kernel)

# 黑帽 —— 閉運算 - 原圖(提取小暗區(qū)域)
blackhat = cv2.morphologyEx(binary, cv2.MORPH_BLACKHAT, kernel)

形態(tài)學操作效果圖解:

2.8 輪廓檢測

import cv2

img = cv2.imread('shapes.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 查找輪廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE,
                                         cv2.CHAIN_APPROX_SIMPLE)

# 繪制所有輪廓
result = img.copy()
cv2.drawContours(result, contours, -1, (0, 255, 0), 2)

# 分析每個輪廓
for i, contour in enumerate(contours):
    # 面積
    area = cv2.contourArea(contour)
    # 周長
    perimeter = cv2.arcLength(contour, True)
    # 多邊形近似
    epsilon = 0.02 * perimeter
    approx = cv2.approxPolyDP(contour, epsilon, True)
    # 外接矩形
    x, y, w, h = cv2.boundingRect(contour)
    # 外接圓
    (cx, cy), radius = cv2.minEnclosingCircle(contour)

    print(f"輪廓 {i}: 面積={area:.0f}, 周長={perimeter:.0f}, "
          f"頂點數(shù)={len(approx)}, 類形={'矩形' if len(approx)==4 else '其他'}")

    # 繪制外接矩形和圓
    cv2.rectangle(result, (x, y), (x+w, y+h), (255, 0, 0), 2)
    cv2.circle(result, (int(cx), int(cy)), int(radius), (0, 0, 255), 2)

輪廓分析速查:

函數(shù)說明返回值
contourArea(c)輪廓面積float
arcLength(c, True)輪廓周長float
approxPolyDP(c, e, True)多邊形近似頂點數(shù)組
boundingRect(c)外接矩形(x, y, w, h)
minEnclosingCircle(c)外接圓(center, radius)
moments(c)圖像矩字典
isContourConvex(c)是否凸多邊形bool

選擇指南

你的需求推薦工具原因
給圖片加水印Pillow簡單幾行代碼
批量調整圖片大小PillowAPI 簡潔、速度快
圖片格式轉換Pillow支持 30+ 格式
給圖片加文字/圖形PillowImageDraw 完美支持
圖片加濾鏡效果Pillow內置豐富濾鏡
人臉識別/檢測OpenCV內置 Haar/DNN 模型
實時視頻處理OpenCVVideoCapture 支持
邊緣檢測/輪廓OpenCVCanny/輪廓檢測算法
圖像分類/目標檢測OpenCV + 深度學習DNN 模塊支持模型推理
OCR 文字識別OpenCV + Tesseract預處理 + OCR

兩者互轉

在實際項目中,經常需要在 Pillow 和 OpenCV 之間轉換:

from PIL import Image
import cv2
import numpy as np

# Pillow → OpenCV
pil_img = Image.open('photo.jpg')
cv_img = np.array(pil_img)[:, :, ::-1]  # RGB → BGR

# OpenCV → Pillow
cv_img = cv2.imread('photo.jpg')
pil_img = Image.fromarray(cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB))

以上就是Python使用Pillow與OpenCV進行圖像處理實戰(zhàn)的詳細內容,更多關于Python Pillow與OpenCV圖像處理的資料請關注腳本之家其它相關文章!

相關文章

  • 深入淺析pycharm中 Make available to all projects的含義

    深入淺析pycharm中 Make available to all projects的含義

    這篇文章主要介紹了pycharm中 Make available to all projects的含義,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • python檢測服務器是否正常

    python檢測服務器是否正常

    本文介紹使用python檢測服務器是否正常,程序的端口是否正常,需要的朋友可以參考下
    2014-02-02
  • Python .py生成.pyd文件并打包.exe 的注意事項說明

    Python .py生成.pyd文件并打包.exe 的注意事項說明

    這篇文章主要介紹了Python .py生成.pyd文件并打包.exe 的注意事項說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python:slice與indices的用法

    Python:slice與indices的用法

    今天小編就為大家分享一篇Python:slice與indices的用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python讀寫csv文件的方法

    python讀寫csv文件的方法

    這篇文章主要介紹了python讀寫csv文件的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-08-08
  • python執(zhí)行系統(tǒng)命令4種方法與比較

    python執(zhí)行系統(tǒng)命令4種方法與比較

    這篇文章主要介紹了python執(zhí)行系統(tǒng)命令4種方法與比較,需要的朋友可以參考下
    2021-04-04
  • python實現(xiàn)二維數(shù)組的對角線遍歷

    python實現(xiàn)二維數(shù)組的對角線遍歷

    這篇文章主要為大家詳細介紹了python實現(xiàn)二維數(shù)組的對角線遍歷,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • request基本使用及各種請求方式參數(shù)的示例

    request基本使用及各種請求方式參數(shù)的示例

    這篇文章主要為大家介紹了request的基本使用及各種請求方式參數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • python如何實現(xiàn)遞歸轉非遞歸

    python如何實現(xiàn)遞歸轉非遞歸

    這篇文章主要介紹了python如何實現(xiàn)遞歸轉非遞歸,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-02-02
  • 用Flask實現(xiàn)token登錄校驗的解決方案

    用Flask實現(xiàn)token登錄校驗的解決方案

    網站、小程序、APP 是否已經登錄所代表的狀態(tài),代表一個概念是登錄態(tài), 我們常用的登錄態(tài)驗證方式有cookie,session,token,token提供了另外一種不需要緩存賬戶和密碼的登錄狀態(tài)驗證方式,本文給大家介紹了用Flask實現(xiàn)token登錄校驗的解決方案,需要的朋友可以參考下
    2024-03-03

最新評論

洪湖市| 开阳县| 阿克陶县| 上饶市| 黄骅市| 汾西县| 清河县| 新建县| 武平县| 柳河县| 二连浩特市| 沿河| 盈江县| 新邵县| 灌南县| 本溪| 天水市| 罗城| 安丘市| 大同市| 陆川县| 山阴县| 达州市| 呼和浩特市| 寿宁县| 射洪县| 凉城县| 岑溪市| 安图县| 日土县| 临武县| 西昌市| 金平| 新郑市| 临澧县| 黎平县| 北辰区| 海兴县| 土默特右旗| 武宁县| 枞阳县|