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 = cv2.kmeans(Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_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 模块加载预训练的 DeepLabV3+ 模型
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,否则保持原值。

主要用途:
图像二值化(将物体与背景分离)。
特定场景下的简单图像分割。

  1. cv2.adaptiveThreshold()
    作用:图像局部自适应二值化,根据局部区域内的灰度值确定阈值。这种方法在光照条件不均匀的情况下很有优势。
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

参数说明:
src: 输入图像,必须是灰度图。
maxValue: 满足阈值条件的像素的赋值。
adaptiveMethod: 自适应阈值算法,有以下两种:
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。

主要用途:
图像自适应二值化。
光照不均情况下的前景分离。

  1. cv2.Canny()
    作用:边缘检测,采用 Canny 算法从图像中提取显著边缘。
dst = cv2.Canny(image, threshold1, threshold2[, apertureSize[, L2gradient]])

参数说明:
image: 输入图像,需为灰度图。
threshold1: 较小的阈值,用于边缘连接。
threshold2: 较大的阈值,用于检测显著边缘。
apertureSize: Sobel 算子的核大小,默认值为 3。通常是 3, 5, 7。
L2gradient: 是否使用更精确的 L2 范数计算梯度,默认为 False

主要用途:
图像边缘提取。
准备图像分割的轮廓信息。

  1. 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() 是 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)。

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

常用的变换操作:
在这里插入图片描述
组合数据增强处理示例:

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 的高级操作,用于批量构造灵活的数据增强和标准化流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/48082.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32嵌入式

一、创建工程项目 1、进入软件首页 2、新建项目,【file】->【new project】 3、选择需要的芯片 4、系统内核部分设置 ① 选择晶振(使用外部的高速晶振) ② 选择debug形式(SW类型) 5、时钟设置 6、选择自己需要的引脚设置&a…

7.QT-常用控件-QWidget|font|toolTip|focusPolicy|styleSheet(C++)

font API说明font()获取当前widget的字体信息.返回QFont对象.setFont(const QFont& font)设置当前widget的字体信息. 属性说明family字体家族.⽐如"楷体",“宋体”,"微软雅⿊"等.pointSize字体⼤⼩weight字体粗细.以数值⽅式表⽰粗细程度取值范围为[…

蓝桥杯之前缀和

一维前缀 解题思路 看到“区间之和”问题,直接想到“前缀和” 前缀和的核心公式: sum[i]sum[i−1]a[i] 利用前缀和求区间和 [l,r] 的公式: 区间和sum[r]−sum[l−1] 解题步骤模板 输入数组: 读取数组长度 n 和查询次数 m。 读…

⭐ Unity 使用Odin Inspector增强编辑器的功能:UIManager脚本实例

先看一下测试效果: 在Unity开发中,Odin Inspector已经成为了一个非常受欢迎的工具,它通过增强编辑器的功能,使得开发者在工作中更加高效,尤其是在处理复杂数据和自定义编辑器方面。今天,我们将通过一个简…

JBoss + WildFly 本地开发环境完全指南

JBoss WildFly 本地开发环境完全指南 本篇笔记主要实现在本地通过 docker 创建 JBoss 和 WildFly 服务器这一功能,基于红帽的禁制 EAP 版本的重新分发,所以我这里没办法放 JBoss EAP 的 zip 文件。WildFly 是免费开源的版本,可以在红帽官网找…

IDEA使用jclasslib Bytecode Viewer查看jvm字节码

学习jvm的时候,想查看字节码和局部变量表,可以使用idea安装jclasslib Bytecode View插件查看。 (1)安装工具: 安装完成后需要重启idea. (2)准备一段代码,编译运行 package com.te…

STM32控制DRV8825驱动42BYGH34步进电机

最近想玩一下人工智能,然后买了个步进电机想玩一下,刚到了一脸懵逼,发现驱动器20多块,有点超预算,然后整了个驱动板,方便自己画线路板,经过各种搜索,终于转起来了,记录一…

第十四节:实战场景-何实现全局状态管理?

React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案(轻量级首选) // 创建全局 Context 对象 const GlobalContext createConte…

QT网络拓扑图绘制实验

前言 在网络通讯中,我qt常用的是TCP或者UDP协议,就比方说TCP吧,一台服务器有时可能会和多台客户端相连接,我之前都是处理单链接情况,最近研究图结构的时候,突然就想到了这个问题。那么如何解决这个问题呢&…

【深度学习—李宏毅教程笔记】各式各样的 Attention

目录 一、普通 Self-Attention 的痛点 二、对 Self-Attention 的优化方式 1、Local Attention / Truncated Attention 2、Stride Attention 3、Global Attention 4、知名的 Self-Attention 的变形的应用 (1)Longformer (2&#xff09…

OceanBases数据库单机社区版保姆级安装

目录 背景 简介 安装 OceanBase 下载地址 上传解压安装包 ​编辑 执行安装命令 ​编辑 应用环境配置 执行以下命令,快速部署 OceanBase 数据库(仅用于简单使用,不应用于生产)。 查看一下数据库状态 ​编辑连接数据库 用户创建 使用工具Navi…

Linux守护进程

一、相关概念 QQ邮箱关于三种协议的解释:SMTP/IMAP服务 1.SMTP协议 SMTP(​​Simple Mail Transfer Protocol​​,简单邮件传输协议)是一种用于发送电子邮件的互联网标准。它在TCP/IP协议族中,通常使用25端口进行通…

Java【网络原理】(4)HTTP协议

目录 1.前言 2.正文 2.1自定义协议 2.2HTTP协议 2.2.1抓包工具 2.2.2请求响应格式 2.2.2.1URL 2.2.2.2urlencode 2.2.3认识方法 2.2.3.1GET与POST 2.2.3.2PUT与DELETE 2.2.4请求头关键属性 3.小结 1.前言 哈喽大家好啊,今天来继续给大家带来Java中网络…

【版本控制】idea中使用git

大家好,我是jstart千语。接下来继续对git的内容进行讲解。也是在开发中最常使用,最重要的部分,在idea中操作git。目录在右侧哦。 如果需要git命令的详解: 【版本控制】git命令使用大全-CSDN博客 一、配置git 要先关闭项目&#xf…

【中间件】redis使用

一、redis介绍 redis是一种NoSQL类型的数据库,其数据存储在内存中,因此其数据查询效率很高,很快。常被用作数据缓存,分布式锁 等。SpringBoot集成了Redis,可查看开发文档Redis开发文档。Redis有自己的可视化工具Redis …

一文粗通 Celery 分布式任务队列

目录 简介什么是 CeleryCelery 的基本组成Celery 的应用场景快速开始 设置热重载开发脚本基本任务管理绑定任务本身设置任务的执行超时时间允许任务重试自定义任务名称实现任务优先级 高级任务管理任务延迟执行指定时间执行任务超时自动取消任务优先级重试任务 任务链与工作流简…

知识了解03——怎么解决使用npm包下载慢的问题?

1、为什么使用npm下载包会下载的慢 因为使用npm下载包时,默认使用国外服务器进行下载,此时的网络传输需要经过漫长的海底电缆,因此下载速度会变慢 2、怎么解决?(切换镜像源) (1)方…

系统思考与理性决策

汉诺贝克在《逆向投资心理学:引发市场波动的非技术因素分析》书中提到:“心理造就90%的行情。投资者利用别人的愚蠢所获得的利益,往往比靠自己得到智慧来得多。避免跟风,我觉得可以降低或者识别绝大部分的陷阱和风险。”这一观点深…

IP数据报

IP数据报组成 IP数据报(IP Datagram)是网络中传输数据的基本单位。 IP数据报头部 版本(Version) 4bit 告诉我们使用的是哪种IP协议。IPv4版本是“4”,IPv6版本是“6”。 头部长度(IHL,Intern…

卡洛诗以“中式西餐”为锚点

意大利的浪漫与中国的烟火气,看似相隔万里,却在卡洛诗的餐桌上碰撞出令人惊艳的火花。 西餐曾是中国餐饮市场的“奢侈品”——复杂的工艺、高昂的定价,让它与普通人的日常餐桌格格不入。卡洛诗创始人敏锐地捕捉到这一矛盾:“西餐…