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

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

  • 一、实验目标
  • 二、实验内容
    • 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.mzph.cn/diannao/22.shtml

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

相关文章

科目一笔记

扣分 目前只有 12 9 6 3 1分。 扣1分的 会车 不按照规定会车, 普倒掉(普通路上不按规定掉头,倒车) ​ 高速、城市快速路…以外的道路 普通路 ​ 校车…以外的道车 普通车 使用灯光 ​ 需要注意的是只有不按规定使用灯光&…

单调队列(C/C++)

引言: 单调队列和单调栈都是一种数据结构,应用十分广泛,在蓝桥杯、ICPC、CCPC等著名编程赛事都是重点的算法,今天博主将自己对单调栈与单调队列的理解以及刷题的经验,用一篇博客分享给大家,希望对大家有所…

在线拍卖系统|基于Springboot的在线拍卖系统设计与实现(源码+数据库+文档)

在线拍卖系统目录 基于Springboot的在线拍卖系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台: 2、后台 用户功能模块 5.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a…

使用脚本部署openstack平台

两台虚拟机,compute和controller 建议两台虚拟机都配置,内存4G,硬盘60G,网络要在虚拟机设置这里添加一个网络适配器,第一个是主机模式192.168.10.0,第二个是NAT模192.168.20.0, 可以在此处了解一…

Unity Standalone File Browser,Unity打开文件选择器

Unity Standalone File Browser,Unity打开文件选择器 下载地址:GitHub链接: https://github.com/gkngkc/UnityStandaloneFileBrowser简单的示例代码 using SFB; using System; using System.IO; using UnityEngine; using UnityEngine.UI;…

从三大层次学习企业架构框架TOGAF

目录 前言 掌握TOGAF的三个层次 层次1:怎么学? 层次2:怎么用? 层次3:怎么思? 结束语 前言 对于一名架构师来讲,如果说编程语言是知识库层次中的入门石,那么企业架构框架则相当…

CCF PTA 2022年7月C++研究生入学考试

【问题描述】 一年一度的研究生入学考试结束了,招生办的老师打算对所有的考生进行 成绩排名,从而确定复试的名单。排名的规则如下: (1)以入学考试的平均成绩 作为排名的依据(分数均为整数); (2)对于考生…

cesium加载倾斜影像数据(模拟雨、雪、雾、无人机飞行、测距、箭头标绘、电子围栏等)

实现效果如下: 功能菜单如下: 加载倾斜影像核心代码: var palaceTileset new Cesium.Cesium3DTileset({url: http://127.0.0.1:9002/tileset.json,//控制切片视角显示的数量,可调整性能maximumScreenSpaceError: 0.1,maximumNum…

问题:如何避免子组件传入相同对象时更新

场景 我有一个父组件,里面包含一个子组件,子组件传入了一个对象,假设对象是字面量。当我的父组件更新时,子组件也会更新。导致不必要的渲染。 一些尝试 1.通过使用React.memo包裹子组件,作用是父组件更新&#xff0…

python/pygame 挑战魂斗罗 笔记(三)

感觉最难的部分已经解决了,下面开始发射子弹。 一、建立ContraBullet.py文件,Bullit类: 1、设定子弹速度 Config.py中设定子弹移动速度为常量Constant.BULLET_SPEED 8。 2、载入子弹图片: 图片也是6张,子弹发出后…

【MySQL面试题pro版-8】

MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据…

Swagger3 使用示例

Swagger3 使用示例 GET 请求,传递 query-string 参数 Operation(summary "GET 请求", description "GET 请求传递 query-string 参数", tags {"用户管理"}) GetMapping(value "/get-query-string", produces "…

2236: 【数学】 回文质数

题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的)&#xff0c;所以 151 是回文质数。 写一个程序来找出范围[a,b](5 < a < b < 10,000,000)间的所有回文质数; 输入 二个整数 a 和 b . 输出 输出一个回文质数的列表&#xff0c;一行一…

成为程序员后你都明白了什么?

成为程序员后你都明白了什么&#xff1f; 自成为一名程序员以来&#xff0c;我的职业生涯就如同一段充满挑战与收获的旅程。在这段长达七年的时光里&#xff0c;我从一名初出茅庐的新手&#xff0c;历经多次角色转换&#xff0c;直至现在成为一家创业公司的技术负责人&#xf…

OceanBase数据库日常运维快速上手

这里为大家汇总了从租户创建、连接数据库&#xff0c;到数据库的备份、归档、资源配置调整等&#xff0c;在OceanBase数据库日常运维中的操作指南。 创建租户 方法一&#xff1a;通过OCP 创建 确认可分配资源 想要了解具体可分配的内存量&#xff0c;可以通过【资源管理】功…

Unity 对APK签名

关键代码 PS D:\UnityProject\YueJie> jarsigner -verbose -keystore D:\UnityProject\YueJie\user.keystore -signedjar D:\UnityProject\YueJie\meizuemptyapk-release-signed.apk D:\UnityProject\YueJie\MeizuEmpty-release-unsigned.apk 1 示例 # jarsigner的命令格…

【C++从练气到飞升】08---模板

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 一、泛型编程 什么是泛型编程: 二、函数模板 1. 函数模板概念 2. 函数模板格式 3. 函数模板的原理 4. 函数模板的实例…

JAVA学习-并发.线程状态

一、Java中的线程状态可以分为以下五类&#xff1a; 1. 新建&#xff08;New&#xff09;状态&#xff1a; 当我们创建一个Thread对象时&#xff0c;它的状态是新建状态&#xff0c;表示该线程对象已被创建但还没有启动执行。 2. 运行&#xff08;Runnable&#xff09;状态&…

❤ vue 使用原生组件

❤ vue 使用原生组件 1、input输入框 ① 想让我们的input输入框类型为时间&#xff0c;只需要为我们的输入框简单的加一个类型的type即可 <input type"date" id"birthday" name"birthday" placeholder"年/月/日"> 我们还可以…

Ubuntu 传输文件

scp [选项] 源文件 目标路径 以下是一些常用的 scp 命令选项&#xff1a; -r&#xff1a;递归复制目录和子目录。 -P&#xff1a;指定远程 SSH 服务器的端口号。 -i&#xff1a;指定用于身份验证的私钥文件。 -p&#xff1a;保留源文件的时间戳、权限和所有者。 -v&#x…