微网站建设报价方案,电子商务网站建设与维护题库,枣庄手机网站建设公司,wordpress mp4 插件计算机视觉实验五——图像分割 一、实验目标二、实验内容1.了解图割操作#xff0c;实现用户交互式分割#xff0c;通过在一幅图像上为前景和背景提供一些标记或利用边界框选择一个包含前景的区域#xff0c;实现分割①图片准备②代码③运行结果④代码说明 2.采用聚类法实现… 计算机视觉实验五——图像分割 一、实验目标二、实验内容1.了解图割操作实现用户交互式分割通过在一幅图像上为前景和背景提供一些标记或利用边界框选择一个包含前景的区域实现分割①图片准备②代码③运行结果④代码说明 2.采用聚类法实现图像的分割K-means方法①代码②运行结果③代码说明 一、实验目标
了解图割操作实现用户交互式分割通过在一幅图像上为前景和背景提供一些标记或利用边界框选择一个包含前景的区域实现分割。采用聚类法实现图像的分割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_clusters3, random_state0)
kmeans.fit(data)# 获取聚类标签和中心点
labels kmeans.labels_
centers kmeans.cluster_centers_# 将聚类标签转换为图像数据
labels labels.reshape((h, w))
result np.zeros((h, w, c), dtypenp.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类来进行聚类并对数据进行拟合。拟合后可以获取聚类标签和中心点再将聚类标签转换为图像数据根据聚类中心给每个像素赋予相应的颜色得到分割后的图像。最后显示原始图像和分割后的图像。