计算机视觉实验五——图像分割

计算机视觉实验五——图像分割

  • 一、实验目标
  • 二、实验内容
    • 1.了解图割操作,实现用户交互式分割,通过在一幅图像上为前景和背景提供一些标记或利用边界框选择一个包含前景的区域,实现分割
      • ①图片准备
      • ②代码
      • ③运行结果
      • ④代码说明
    • 2.采用聚类法实现图像的分割(K-means方法)
      • ①代码
      • ②运行结果
      • ③代码说明

一、实验目标

  1. 了解图割操作,实现用户交互式分割,通过在一幅图像上为前景和背景提供一些标记或利用边界框选择一个包含前景的区域,实现分割。
  2. 采用聚类法实现图像的分割(K-means方法)。

二、实验内容

1.了解图割操作,实现用户交互式分割,通过在一幅图像上为前景和背景提供一些标记或利用边界框选择一个包含前景的区域,实现分割

①图片准备

博主选择了一张前景与背景区分明显的图片,和一张前景与背景区分不明显的图片:
在这里插入图片描述
在这里插入图片描述

②代码

import cv2
import numpy as npimg = cv2.imread('building.jpg')
img = cv2.resize(img, (960, 720))# 创建一个和图像大小相同的掩码,用于存储分割结果
mask = np.zeros(img.shape[:2], np.uint8)bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)# 定义鼠标回调函数,用于获取用户画出的矩形框
def draw_rect(event, x, y, flags, param):global ix, iy, drawing, rect_overif event == cv2.EVENT_LBUTTONDOWN:drawing = Trueix, iy = x, yelif event == cv2.EVENT_MOUSEMOVE:if drawing == True:img_copy = img.copy()cv2.rectangle(img_copy, (ix, iy), (x, y), (0, 255, 0), 2)cv2.imshow('image', img_copy)# 调用grabCut算法进行分割elif event == cv2.EVENT_LBUTTONUP:drawing = Falserect_over = Truecv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 2)rect = (min(ix, x), min(iy, y), abs(ix - x), abs(iy - y))cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)cv2.imshow('image', img)# 创建一个窗口,绑定鼠标回调函数
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_rect)drawing = False  # 是否正在画矩形框
ix, iy = -1, -1  # 矩形框的起始坐标
rect_over = False  # 是否画完矩形框while True:cv2.imshow('image', img)k = cv2.waitKey(1) & 0xFF# 如果画完矩形框,根据掩码显示分割结果if rect_over == True:mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')img_cut = img * mask2[:, :, np.newaxis]cv2.imshow('result', img_cut)if k == 27:breakcv2.destroyAllWindows()

③运行结果

(1)前景与背景区分明显的图片
用鼠标画出矩形框:
在这里插入图片描述
分割结果:
在这里插入图片描述
(2)前景与背景区分不明显的图片
用鼠标画出矩形框:
在这里插入图片描述
分割结果:
在这里插入图片描述

④代码说明

使用了OpenCV库中的grabCut算法。此算法的原理是基于图割(graph cut)的思想,根据颜色信息和空间信息,将图像划分为四个部分:确定的背景、可能的背景、可能的前景和确定的前景。它会迭代地更新这四个部分,直到收敛为止。

  • 首先,读取一张图像,并创建一个和图像大小相同的掩码,用于存储分割结果。
  • 创建grabCut算法需要的背景和前景模型,用于存储颜色信息。
  • 定义一个鼠标回调函数,用于获取用户画出的矩形框(矩形框表示要分割出来的前景对象)。
  • 在这个函数中,当用户按下鼠标左键时,开始画矩形框,并记录起始坐标。当用户移动鼠标时,更新矩形框,并在图像上显示。当用户松开鼠标左键时,结束画矩形框,并调用grabCut算法进行分割。

2.采用聚类法实现图像的分割(K-means方法)

①代码

import numpy as np
import cv2
from sklearn.cluster import KMeans# 读取图像并转换为RGB格式
img = cv2.imread('building.jpg')img = cv2.resize(img, (960, 720))img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 将图像数据转换为二维数组
h, w, c = img.shape
data = img.reshape((h * w, c))# 使用K-means聚类算法对图像数据进行分割,设置聚类数为3
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(data)# 获取聚类标签和中心点
labels = kmeans.labels_
centers = kmeans.cluster_centers_# 将聚类标签转换为图像数据
labels = labels.reshape((h, w))
result = np.zeros((h, w, c), dtype=np.uint8)# 根据聚类中心点给每个像素赋予相应的颜色
for i in range(h):for j in range(w):result[i, j] = centers[labels[i, j]]# 显示原始图像和分割后的图像
cv2.imshow('Original', img)
cv2.imshow('Segmented', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

②运行结果

(1)前景与背景区分明显的图片
在这里插入图片描述
在这里插入图片描述
(2)前景与背景区分不明显的图片
在这里插入图片描述
在这里插入图片描述

③代码说明

使用了K-means方法实现图像的分割,K-means是一种基于划分的聚类算法,它的目标是将数据集划分为K个簇,使得每个数据点属于离它最近的簇中心所代表的簇。

在代码中,首先导入了numpy和cv2两个库,numpy用于处理数组和矩阵,cv2用于处理图像。然后读取了一张图像,并将其转换为RGB格式。接着将图像数据转换为二维数组,再使用sklearn.cluster中的KMeans类来进行聚类并对数据进行拟合。拟合后,可以获取聚类标签和中心点,再将聚类标签转换为图像数据,根据聚类中心给每个像素赋予相应的颜色,得到分割后的图像。最后显示原始图像和分割后的图像。

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

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

相关文章

浅析ARM Contex-CM3内核架构

目录 概述 1. Cortex-M3类型MCU 1.1 MCU 架构 1.2 实时性系统概念 1.3 处理器命名法 1.4 MCU的一些知识 2. Cortex-M3 概览 2.1 Cortex-M3综述 2.2 寄存器组 2.3 操作模式和特权极别 2.4 内建的嵌套向量中断控制器 2.5 存储器映射 2.6 总线接口 2.7 存储器保护单元…

小型CNC数控机床深受到韩国客户青睐

随着公司的快速发展,育菁科研成果的不断突破和自主创新能力的提高,育菁小型CNC机床迎合了国际化大市场的需求,吸引了众多国外客户的眼球,近日,韩国客户工程师和CEO到我司进行实地考察交流 在胡经理和外贸同事陪同下&am…

异构超图嵌入的图分类 笔记

1 Title Heterogeneous Hypergraph Embedding for Graph Classification(Xiangguo Sun , PictureHongzhi Yin , PictureBo Liu , PictureHongxu Chen , PictureJiuxin Cao , PictureYingxia Shao , PictureNguyen Quoc Viet Hung)【WSDM 2021】 2 Co…

哪个品牌蓝牙耳机好?掌握六大选购逻辑,选准不选贵!

​随着科技的不断进步,蓝牙耳机已经成为了我们生活中不可或缺的一部分。它不仅摆脱了有线的束缚,还提供了极大的自由度。然而,面对市场上琳琅满目的蓝牙耳机,挑选一款性价比高的产品确实需要一些技巧。作为一名资深的耳机用户&…

民族运动饮料之父『健力宝』×企企通正式启动SRM项目,打造饮料行业采购数字化应用标杆

近日,为推进采购阳光化、数字化和智能化,提升管理效率与质量,企企通与中国电解质饮料的领军品牌广东健力宝股份有限公司(以下简称“健力宝”)成功签约并召开项目启动会。健力宝行政副总裁赵总、CIO李总、采购本部总监杨…

论文解读:(CoOp)Learning to Prompt for Vision-Language Models

文章汇总 存在的问题 虽然训练类别通常具有文本形式,例如“金鱼”或“卫生纸”,但它们将被转换为离散标签,只是为了简化交叉熵损失的计算,从而使文本中的语义封装在很大程度上未被利用。这样的学习范式将视觉识别系统限制在闭集…

代码随想录阅读笔记-回溯【N皇后】

题目 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 Q 和 . 分别代表…

Java垃圾回收2

垃圾回收的算法有哪些 通过可达性分析算法,我们已经可以找到需要回收的对象。现在需要通过垃圾回收算法,把垃圾回收,释放内存。 1.标记清除算法(使用较少) 标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除。…

FreeRTOS任务管理

1. 任务状态理论讲解 定时器职中断周期此处的1000Hz表示的是没次间隔1毫秒就记一次数(在FreeConfig.h)文件中进行配置 #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) 判断是否需要任务切换在FreeRTOS里面每次间隔1毫秒切换一次(程序…

【iOS开发】(二)react Native基础语法+样式+布局20240417

【IOS开发】 前言:(一)我们已经搭建好了基础环境,和iOS环境,并创建和在模拟器上成功运行了一个app,mywdm。 目录标题 一, 如何进行模拟器调试二,基础语法:1 掌握reactjs…

网站创建的流程是什么

网站的创建过程包括几个主要的步骤,其中涉及到一系列的决策和实践操作。下面我将详细介绍网站创建的流程,帮助读者了解如何创建一个成功的网站。 第一步:确定网站目标和功能 在创建网站之前,你需要明确自己网站的目标和功能。是用…

AT32F415CBT7 封装LQFP-48 单片机微控制器IC芯片

ARM Cortex-M4 内核:AT32F415CBT7 采用 32 位 ARM Cortex-M4 内核,工作频率高达 200 MHz,具有较高的处理能力和响应速度。 大容量闪存存储器:该单片机内置 256KB 的闪存存储器(Flash),可以存储…

Hadoop中的MapReduce流程(图解)

一、MapReduce流程图: 二、MapReduce流程步骤: 1.文件上传到HDFS中,默认以128M切分为一个block块 2.每个block块对数据进行逻辑上的切片,切片大小为128M,与block块大小一致 3.之后根据切片产生Map任务 4.Map任务会进入环形缓冲区&…

Linux 操作系统指令和Vscdoe安装

1、Linux系统介绍 Linux系统的背景介绍我就不介绍了,有兴趣的可以去看看其发展史。 1.1 Linux操作系统的主要特点 Linux操作系统的重要思想:一切皆文件 Linux操作系统的特性: 完全免费 支持多平台 支持多用户、多任务 有良好的界面 完美兼容…

引导过程与故障修复

一、Linux操作系统引导过程 1、引导过程总览 开机自检 检查硬件设备,检测出第一个能够引导系统的设备,比如硬盘或者光驱 MBR 引导 运行MBR扇区里的主引导程序GRUB 启动GRUB菜单 统读取GRUB配置文件(/boot/grub2/grub.cfg)获取内核的设置和位置&#xf…

如何进行数据库的迁移与同步——【DBA 从入门到实践】第四期

在日常的数据库运维工作中,我们时常会面临数据库替换、机房搬迁、业务测试以及数据库升级等任务,这些任务都需要对数据进行迁移和同步操作。【DBA 从入门到实践】第4期,将引导大家深入了解数据库迁移的流程,并探讨在迁移过程中可用…

CTFHUB RCE作业

题目地址:CTFHub 完成情况如图: 知识点: preg_match_all 函数 正则匹配函数 int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags PREG_PATTERN_ORDER [, int $offset 0 ]]] )搜索 subject 中…

Django第三方功能的使用

Django第三方功能的使用 Django REST framework前言1、Django--Restframework--coreapi版文档BUG:AssertionError: coreapi must be installed for schema support.How to run Django with Uvicorn webserver?2、序列化类 Serializer的使用模型序列化类 ModelSerializer的使用…

linux 安装openjdk-1.8

安装命令 yum install java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64查看安装路径 find / -name java 默认的安装路径 /usr/lib/jvm 查看到jre 以及java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64 配置环境变量 vim /etc/profile 添加的内容 export JAVA_HOME/usr/li…

【面试经典 150 | 二分查找】寻找两个正序数组的中位数

文章目录 写在前面Tag题目来源题目解读方法一:朴素方法二:二分查找【寻找第k小元素】 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附…