Python实现图片分割的多种方法总结

2025-04-23 17:50

本文主要是介绍Python实现图片分割的多种方法总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择...

图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,例如分割出物体、前景背景或特定的部分。在 python 中,常用的图片分割方法包括传统的图像处理技术(例如阈值分割、区域生长等)和深度学习技术(例如基于预训练模型的语义分割或实例分割)。以下是详细介绍和示例代码:

1. 基于传统图像处理的分割方法

(1) 使用固定阈值分割图片

使用 OpenCV 的阈值处理来将前景和背景分离。适合简单的二值图像。

import cv2
import numpy as np
# 加载图片
image = cv2.imread('image.jpg', 0)  # 以灰度加载图片
# 应用二值化阈值分割
_, binary = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY)

# 显示分割结果
cv2.imshow('Original Image', image)
cv2.imshow('Binary Image', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

参数说明:

128 是阈值,低于此值的像素设置为 0,高于阈值的设置为 255。

cv2.THRESH_BINARY 是二值化模式。

(2) 自适应阈值分割

适合光照不均的情况,使用局部区域的像素值计算阈值。

import cv2

# 加载图片
image = cv2.imread('image.jpg', 0)
# 自适应阈值分割
binary_adaptive = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 11, 2)
# 显示分割结果
cv2.imshow('Adaptive Threshold', binary_adaptive)
cv2.waitKey(0)
cv2.destroyAllWindows()

参数说明:

cv2.ADAPTIVE_THRESH_GAUSSIAN_C 使用高斯加权的邻域计算阈值。

11 是邻域大小。

2 是阈值偏移。

(3) 使用图像边缘检测分割

通过检测图像的边缘将不同的区域分离。

import cv2

# 加载图片
image = cv2.imread('image.jpg', 0)
# 使用Canny边缘检测
edges = cv2.Canny(image, 100, 200)
# 显示边缘分割结果
cv2.imshow('Edge Detection', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

参数说明:

100 是低阈值,200 是高阈值,用于检测边缘。

(4) 基于 K-Means 的聚类分割

可以将图像的颜色或亮度聚类为K个类别,适合彩色图像分割。

import cv2
import numpy as np

# 加载图片
image = cv2.imread('image.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
Z = image.reshape((-1, 3))  # 将图像从二维展开为一维

# 使用 K-Means 聚类
Z = np.float32(Z)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 3  # 聚类数
_, labels, centers javascript= cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDBvSmDSEqOM_CENTERS)
# 将聚类结果映射回图像
centers = np.uint8(centers)
segmented_image = centers[labels.flatten()]
segmented_image = segmented_image.reshape(image.shape)
# 显示分割结果
import matplotlib.pyplot as plt
plt.imshow(segmented_image)
plt.show()

参数说明:

K 是分割的颜色聚类数,譬如设置为3会将图像分割成3种颜色区域。

2. 深度学习分割方法

对于复杂分割任务,深度学习可以提供更高的精度。典型方法包括使用预训练的分割模型(如 DeepLab、Mask R-CNN 等)。

(1) 使用 OpenCV DNN 模块加载预训练的 DeeandroidpLabV3+ 模型

DeepLabV3+ 是一种流行的语义分割模型。

import cv2
import numpy as np

# 加载 DeepLabV3+ 模型
net = cv2.dnn.readNetFromTensorflow('deeplabv3.pb')

# 加载图像
image = cv2.imread('image.jpg')
blob = cv2.dnn.blobFromImage(image, scalefactor=1.0/255, size=(513, 513),
                             mean=(127.5, 127.5, 127.5), swapRB=True, crop=False)

# 推理
net.setInput(blob)
output = net.forward()
# 解析结果
segmentation_map = np.argmax(output[0], axis=0)
# 显示分割结果
segmentation_map = cv2.resize(segmentation_map.astype(np.uint8), (image.shape[1], image.shape[0]))
cv2.imshow("Segmentation Map", segmentation_map)
cv2.waitKey(0)
cv2.destroyAllWindows()

(2) 使用 PyTorch 或 TensorFlow 加载分割模型

如果需要灵活的操作,可以使用深度学习框架加载分割模型进行推理。

import torch
from torchvision import models
from torchvision import transforms
from PIL import Image
import matplotlib.pyplot as plt

​​​​​​​# 加载预训练的 DeepLabV3 模型
model = models.segmentation.deeplabv3_resnet101(pretrained=True)
model.eval()
# 加载图片并预处理
image = Image.open("image.jpg")
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Resize((520, 520)),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
input_image = transform(image).unsqueeze(0)
# 推理
output = model(input_image)['out'][0]
segmentation_map = torch.argmax(output, dim=0).numpy()
# 显示分割结果
plt.imshow(segmentation_map)
plt.show()

cv2.threshold(), cv2.adaptiveThreshold(), cv2.Canny(),cv2.kmeans() 函数详解

1.cv2.threshold()

作用:图像二值化,将灰度图像转为黑白图像或多级阈值图像。

retval, dst = cv2.threshold(src, thresh, maxval, type)

参数说明:

src: 输入图像,必须是灰度图(单通道,uint8 类型)。

thresh: 阈值,将灰度图中的像素值与该阈值进行比较。

maxval: 如果满足阈值规则,输出像素值将设置为该值。

type: 阈值类型,有以下几种:

  • 1、cv2.THRESH_BINARY: 大于阈值的像素置为 maxval,否则置为 0。
  • 2、cv2.THRESH_BINARY_INV: 小于阈值的像素置为 maxval,否则置为 0。
  • 3、cv2.THRESH_TRUNC: 大于阈值的像素置为阈值,否则保持原值。
  • 4、cv2.THRESH_TOZERO: 小于阈值的像素置为 0,否则保持原值。
  • 5、cv2.THRESH_TOZERO_INV: 大于阈值的像素置为 0,否则保持原值。

主要用途:

图像二值化(将物体与背景分离)。

特定场景下的简单图像分割。

2.cv2.adaptiveThreshold()

作用:图像局部自适应二值化,根据局部区域内的灰度值确定阈值。这种方法在光照条件不均匀的情况下很有优势。

dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

参数说明:

src: 输入图像,必须是灰度图。

maxValue: 满足阈值条件的像素的赋值。

adaptiveMethophpd: 自适应阈值算法,有以下两种:

cv2.ADAPTIVE_THRESH_MEAN_C: 阈值是局部窗口的平均值减去 C。

cv2.ADAPTIVE_THRESH_GAUSSIAN_C: 阈值是局部窗口的加权平均值减去 C。

thresholdType: 阈值类型(通常为 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV)。

blockSize: 局部区域的尺寸,必须为奇数(如 3、5、11)。

C: 从局部平均值中减去常数 C。

主要用途:

  • 图像自适应二值化。
  • 光照不均情况下的前景分离。

3.cv2.Canny()

作用:边缘检测,采用 Canny 算法从图像中提取显著边缘。

dst = cv2.Canny(image, threshold1, threshold2[, apertureSize[, L2gradient]])

参数说明:

image: 输入图像,需为灰度图。

threshold1: 较小的阈值,用于边缘连接。

threshold2: 较大的阈值,用于检测显著边缘。

apertureSize: Sobel 算子的核大小,默认值为 3。通常是 3, 5, 7。

L2gradient: 是否使用更精确的 L2 范数计算梯度,默认为 False

主要用途:

图像边缘提取。

准备图像分割的轮廓信息。

4.cv2.kmeans()

作用:基于 K-Means 算法对输入数据进行聚类,适合图像颜色分割或亮度分割。

retval, labels, centers = cv2.kmeans(data, K, bestLabels, criteria, attempts, flags)

参数说明:

data: 输入数据(通常是图像的像素值矩阵,需转换为 np.float32)。

K: 聚类数,即分割的类别数量。

bestLabels: 初始标签(通常为 None)。

criteria: K-Means 的终止条件,例如迭代次数或误差:

(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, max_iter, epsilon)。

max_iter 是最大迭代次数,epsilon 是误差容忍度。

attempts: 尝试执行 K-Means 聚类的次数,输出至少达到局部最优解。

flags: 初始化中心的方法,常用:

cv2.KMEANS_PP_CENTERS: 使用 K-Means++ 初始化中心点。

cv2.KMEANS_RANDOM_CENTERS: 使用随机选择初始化中心点。

cv2.dnn.blobFromImage(),transforms.Compose()函数详解

1.cv2.dnn.blobFromImage()

功能:

cv2.dnn.blobFromImage() http://www.chinasem.cn是 OpenCV 的 DNN(深度学习)模块中的方法,用于将输入图像转换为深度学习模型可以接受的标准化张量(“blob”)。具体包括:

重新调整图像大小。

归一化图像像素(例如缩放到 [0,1] 或减去均值)。

转换通道顺序(例如将图片从 BGR 转换为 RGB)。

转换维度顺序(从 HWC -> CHW,即 [高度, 宽度, 通道] -> [通道, 高度, 宽度])。

cv2.dnn.blobFromImage(image, scalefactor=1.0, size=(width, height),
                      mean=(meanR, meanG, meanB), swapRB=True, crop=False)

参数说明:

  • image: 输入图像,通常是三通道(BGR)图像或单通道图像。
  • scalefactor: 缩放因子,用于将像素值归一化。例如,设置 scalefactor=1/255 将像素值从 [0,255] 缩放到 [0,1]。
  • size: 重新调整后的图像尺寸,通常根据模型的输入需求设置(如 (224, 224))。
  • mean: 均值,用于归一化(针对每个通道减去均值)。例如:(meanR, meanG, meanB)。
  • swapRB: 是否交换 R 和 B 通道(将 BGR 转为 RGB),默认为 True。
  • crop: 是否在调整大小后裁剪图像,如果为 True,会将图像裁剪到目标大小。

返回值:

返回一个预处理后的 blob,即一个多维的 numpy 数组,形状通常为:

[BATch_size, channels, height, width]

对单张图像而言,batch_size = 1。

import cv2
# 读取图像(通常是 BGR 格式)
image = cv2.imread('image.jpg')
# 创建 blob
blob = cv2.dnn.blobFromImage(image, scalefactor=1/255.0, size=(224, 224),
                             mean=(0, 0, 0), swapRB=True, crop=False)

# 输出 blob 的形状:通常为 (1, 3, 224, 224),对应 [batch, channels, height, width]
print("Blob shape:", blob.shape)
# 将 blob 传入模型
# net.setInput(blob)
# output = net.forward()

常见参数设置:

  • 归一化:如果模型输入要求的像素范围是 [0, 1],可以通过 scalefactor = 1/255 实现归一化。
  • 均值减法:一些预训练模型会要求每个通道的均值为特定值,如 (123.68, 116.78, 103.94)(VGG 或 ResNet 等常用)。
  • 图像尺寸:目标模型的输入尺寸通常固定,如 (224, 224) 或 (300, 300)。

2.transforms.Compose()

功能:

transforms.Compose() 是 PyTorch 的 torchvision.transforms 模块中的方法,用来对图像数据进行多步组合式处理,例如裁剪、缩放、归一化等。它允许将多个图像变换操作(transforms)链接在一起。

transforms.Compose([transform1, transform2, ..., transformN])

参数说明:

  • transform1, transform2, …, transformN:每个变换操作都是一个 torchvision.transforms 的实例。 例如:
  • transforms.Resize(size): 缩放图像到指定大小。
  • transforms.CenterCrop(size): 从图像中央裁剪到指定大小。
  • transforms.Normalize(mean, std): 标准化张量,减去均值并除以标准差。
  • transforms.ToTensor(): 将图像从 PIL 格式转换为 PyTorch 张量,并归一化到 [0, 1] 范围。
  • transforms.RandomHorizontalFlip§: 随机水平翻转,概率为 p。

使用场景:

用于对图像数据的批量预处理,尤其是在训练深度学习模型前对数据进行标准化和增强处理。

import torch
from torchvision import transforms
from PIL import Image

# 加载图像
image = Image.open("image.jpg")
# 定义数据变换
data_transforms = transforms.Compose([
    transforms.Resize((224, 224)),                 # 调整大小到 (224, 224)
    transforms.ToTensor(),                         # 转为 PyTorch 张量
    transforms.Normalize(mean=[0.485, 0.456, 0.406],  # 按通道归一化 (均值减去)
                         std=[0.229, 0.224, 0.225]) # 按通道归一化 (标准差除以)
])

​​​​​​​# 对图像应用变换
tensor_image = data_transforms(image)
# 检查结果
print("Tensor shape:", tensor_image.shape)  # 通常为 (3, 224, 224)
print("Tensor values (normalized):", tensor_image)

常用的变换操作:

Python实现图片分割的多种方法总结

组合数据增强处理示例:

import torchvision.transforms as transforms
from PIL import Image

​​​​​​​# 加载图像
image = Image.open("image.jpg")
# 定义数据增强变换
data_transforms = transforms.Compose([
    transforms.RandomRotation(30),                      # 随机旋转 30 度
    transforms.RandomHorizontalFlip(p=0.5),             # 随机水平翻转 50% 概率
    transforms.ColorJitter(brightness=0.2, contrast=0.3),  # 随机调整亮度和对比度
    transforms.Resize((224, 224)),                      # 调整大小到 (224, 224)
    transforms.ToTensor(),                              # 转为 PyTorch 张量
])
# 应用变换
tensor_image = data_transforms(image)
print("Augmented Tensor Shape:", tensor_image.shape)

cv2.dnn.blobFromImage() vs transforms.Compose()

这两者主要是针对不同框架的图像预处理功能:

cv2.dnn.blobFromImage() :主要用于 OpenCV DNN 模型,侧重于将输入格式标准化为深度学习模型的张量。

transforms.Compose() :是 PyTorch 的高级操作,用于批量构造灵活的数据增强和标准化流程。

到此这篇关于Python实现图片分割的多种方法总结的文章就介绍到这了,更多相关Python图片分割内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Python实现图片分割的多种方法总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154343

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局