首页 > 编程语言 >Python OpenCV按照像素点图片切割

Python OpenCV按照像素点图片切割

时间:2024-12-11 22:54:19浏览次数:6  
标签:分割 plt 阈值 Python cv2 像素 OpenCV 图像 像素点

图像分割是从图像处理到图像分析的关键步骤,在目标检测、特征提取、图像识别等领域具有广泛应用。OpenCV是一个强大的计算机视觉库,提供了多种图像分割方法。本文将详细介绍如何使用Python和OpenCV进行基于像素点的图像分割,包括阈值分割、自适应阈值分割、Otsu's二值化、分水岭算法、GrabCut算法、SLIC超像素分割和基于深度学习的分割方法。

一、图像分割的理论概述

  1. 阈值分割

    阈值分割是最基础的图像分割方法之一,通过设定一个阈值将像素分为两组:前景和背景。该方法假设图像中的目标和背景的灰度值差异较大,存在一个合适的阈值,使得灰度值高于该阈值的像素被划分为目标,灰度值低于该阈值的像素被划分为背景。

  2. 自适应阈值分割

    自适应阈值分割能够根据图像的不同区域自动调整阈值,适用于光照不均的场景。该方法将图像划分为多个小区域(子块),每个子块分别计算阈值进行分割。

  3. Otsu's二值化

    Otsu's二值化是一种自动寻找最佳阈值的方法,特别适合于单峰分布的图像。它遍历所有可能的阈值,计算类间方差,当类间方差最大时的阈值即为最佳阈值。

  4. 分水岭算法

    分水岭算法常用于分割紧密相连的对象,通过模拟水流汇聚过程找到图像中的边界。该方法首先计算图像的距离变换,然后通过形态学操作找到局部最大值,最后应用分水岭算法得到分割结果。

  5. GrabCut算法

    GrabCut是一种半自动的图像分割方法,需要用户给出初步的前景和背景区域。该方法通过迭代优化算法不断调整前景和背景的掩膜,最终得到分割结果。

  6. SLIC超像素分割

    SLIC(Simple Linear Iterative Clustering)是一种快速的超像素分割方法,能将图像划分为多个小的、连贯的区域。该方法基于聚类算法,将图像像素聚类成多个超像素块。

  7. 基于深度学习的分割方法

    基于深度学习的分割方法可以实现更高级的图像分割任务,如语义分割和实例分割。这些方法通常使用卷积神经网络(CNN)进行训练,能够自动学习图像特征并进行像素级别的分类。

二、代码示例

以下是使用Python和OpenCV进行图像分割的详细代码示例。

import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.segmentation import slic
import tensorflow as tf
 
# 读取图像并转换为灰度
img = cv2.imread('image.jpg', 0)
 
# 1. 阈值分割
ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
plt.imshow(thresh, cmap='gray')
plt.title('Thresholding')
plt.show()
 
# 2. 自适应阈值分割
adaptive_thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
plt.imshow(adaptive_thresh, cmap='gray')
plt.title('Adaptive Thresholding')
plt.show()
 
# 3. Otsu's二值化
ret, otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
plt.imshow(otsu, cmap='gray')
plt.title('Otsu\'s Binarization')
plt.show()
 
# 4. 分水岭算法
D = cv2.distanceTransform(img, cv2.DIST_L2, 5)
localMax = cv2.dilate(D, None, iterations=2)
markers = cv2.watershed(cv2.cvtColor(img, cv2.COLOR_GRAY2BGR), localMax)
markers = cv2.cvtColor(markers, cv2.COLOR_BGR2RGB)
plt.imshow(markers)
plt.title('Watershed Segmentation')
plt.show()
 
# 5. GrabCut算法
mask = np.zeros(img.shape[:2], np.uint8)
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)
rect = (50, 50, 450, 290)
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
img = img * mask2[:, :, np.newaxis]
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('GrabCut')
plt.show()
 
# 6. SLIC超像素分割
segments_slic = slic(img, n_segments=200, compactness=10, sigma=1)
plt.imshow(segments_slic)
plt.title('SLIC Superpixels')
plt.show()
 
# 7. 基于深度学习的分割方法(示例代码简化,实际应用需安装并配置相关深度学习框架)
# model = tf.keras.models.load_model('your_model.h5')
# predictions = model.predict(img[np.newaxis, :, :, np.newaxis])  # 注意输入形状可能需要调整
# plt.imshow(predictions[0, :, :, 0], cmap='gray')  # 假设输出是单通道图像
# plt.title('Deep Learning Segmentation')
# plt.show()

三、注意事项和后续处理

  1. 自动阈值选择

    在处理光照变化较大的场景时,尝试使用Otsu's二值化或自适应阈值分割,以获得更好的分割效果。

  2. 噪声处理

    在应用阈值分割前,使用高斯模糊或中值滤波去除图像噪声,提高分割精度。

  3. 标记初始化

    分水岭算法的效果很大程度上取决于初始标记的设置。尝试使用形态学运算或边缘检测结果作为初始标记,可以显著提高分割质量。

  4. 后处理

    分割后的结果可能包含一些小的噪声区域,可以通过开闭运算进行清理。

  5. 精细调整

    GrabCut的结果可以通过手动调整前景和背景的掩膜来进一步优化,尤其在对象边界不清晰的情况下。

  6. 迭代次数

    增加迭代次数可以提高分割精度,但也会增加计算时间,需要根据具体需求权衡。

  7. 参数选择

    SLIC超像素分割中的n_segmentscompactness参数直接影响超像素的数量和大小。较小的n_segments值会生成更大的超像素,而较高的compactness值会使超像素更接近圆形。

  8. 后续处理

    超像素分割可以作为后续图像处理任务的基础,如颜色直方图计算或特征提取。

  9. 数据增强和迁移学习

    在训练深度学习模型时,使用数据增强技术(如旋转、翻转、缩放)可以增加模型的泛化能力。利用预训练的模型进行迁移学习,可以大大减少训练时间和所需的标注数据量。

四、总结

本文详细介绍了使用Python和OpenCV进行基于像素点的图像分割的方法,包括阈值分割、自适应阈值分割、Otsu's二值化、分水岭算法、GrabCut算法、SLIC超像素分割和基于深度学习的分割方法。不同的分割方法有其适用场景,选择最适合当前问题的技术是关键。在处理实时视频流或大规模数据集时,效率和速度变得尤为重要,需要对算法进行适当的优化。

标签:分割,plt,阈值,Python,cv2,像素,OpenCV,图像,像素点
From: https://www.cnblogs.com/TS86/p/18601128

相关文章

  • 《Python 爬取上海软科中国大学排名并存入表格:详解与速通指南》
     大家好啊!我是NiJiMingCheng我的博客:NiJiMingCheng上一节我们分享了安装selenium的内容,这一节我们继续来实战,这一节我们主要学习爬取上海软科中国大学排名并存入表格,本文仅以办学层次进行演示,其他数据同理可得,加油Selenium各浏览器驱动下载与配置使用(详细流程)目录结......
  • 【2024年华为秋招-12月11日-第二题(200分)- 服务器训练任务调度】(题目+思路+Java&C++&Py
    题目内容团队申请了一组服务器,用于机器学习训练,为了充分利用资源,需要你来完成任务调度算法的实现。一台服务器同一时间只能执行一个训练任务,每个训练任务有训练时间和优先级。当空闲服务器不足时,优先执行高优先级的训练任务;如果多个训练任务的优先级相同,优先执行训练时......
  • python中的反射
    cProfile.run('re.compile("foo|bar")','restats')https://docs.python.org/3/library/profile.htmlimportcProfileimportrecProfile.run('re.compile("foo|bar")') 这段python的闪耀点是环境感知能力 exec查看实现,其调用的是pyt......
  • Python单元测试:构建稳健代码的关键
    引言在软件开发中,测试是确保代码质量和可靠性的必要环节。单元测试是验证单个组件或模块是否按预期工作的测试方法。它通过自动化测试来检验每个功能模块的正确性,帮助团队及早发现和修复潜在的问题。本文将深入探讨Python中的单元测试,包括如何编写和运行测试、常用的测试框架......
  • Python社区邻里互助便民平台 16gm(Pycharm Flask Django Vue mysql)
    文章目录项目介绍具体实现截图开发技术设计思路开发与测试:核心代码部分展示文章目录/协作提纲源码/演示视频获取方式项目介绍社区互助平台的功能分为管理员和用户两个部分,系统的主要功能包括首页,个人中心,用户管理,租房信息管理,失物招领管理,宠物代遛管理,停车位出租管......
  • OpenCV的简单函数
    一、二值化(threshold)1.二值化图二值化图:就是将图像中的像素改成只有两种值,其操作的图像必须是灰度图。2.实现方法,函数阈值法(THRESH_BINARY)反阈值法(THRESH_BINARY_INV)截断阈值法(THRESH_TRUNC):低阈值零处理(THRESH_TOZERO)超阈值零处理(THRESH_TOZERO_INV)OTSU阈......
  • 基于yolov8的车牌检测与识别系统,支持图像、视频和摄像实时检测【pytorch框架、python
       更多目标检测、图像分类识别、目标追踪等项目可看我主页其他文章功能演示:基于yolov8的车牌检测与识别系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili(一)简介基于yolov8的车牌检测与识别系统在pytorch框架下实现的,这是一个完整的项目......
  • VSCode中Python文件的自动格式化
    Python文件的自动格式化首先随便打开一个项目,创建一个[[Python]]文件按Shift+Alt+F,会进行格式化,不出意外会出现下图:那么就去安装坑点就在这,会出现很长一串,然后发现都不是是一个叫BlackFormatter的插件,装完之后再Shift+Alt+F会出现下面这个点击配置出现这个,选就OK了如果......
  • 【最新原创毕设】基于SpringBoot的学生选课管理系统+56695(免费领源码)可做计算机毕业设
    基于Springboot和Vue的学生选课管理系统的设计与实现摘 要本文介绍了一种基于SpringBoot和Vue的学生选课管理系统的设计与实现。该系统旨在提供一个高效、可靠的选课平台,使学生和教职工能够方便地进行课程选择和管理。在系统设计上,我们采用了SpringBoot作为后端框架,利用......
  • (2024最新毕设合集)基于的同城学校二手交易平台|可做计算机毕业设计JAVA、PHP、爬虫、AP
    同城学校二手交易平台设计与实现摘 要利用SpringBoot框架和相关Uni-app技术,设计和实现一个高效、可靠的同城学校二手交易平台。该系统将提供闲置、发布、求购等主要功能,旨在促进二手交易平台的便捷和透明化。本研究首先介绍了同城学校二手交易平台的研究背景和现状,包括同城......