opencv grabCut前景后景分割去除背景

参考:
https://zhuanlan.zhihu.com/p/523954762
https://docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html

环境本次:
python 3.10

在这里插入图片描述

提取前景:
1、需要先把前景物体框出来
需要坐标信息,可以用windows自带的画图简单提取像素
在这里插入图片描述

矩形的格式为 (x, y, width, height)

rect = (118, 120, 732, 835)
定义了一个矩形区域,该区域用于初始化 GrabCut 算法。这个矩形区域的参数表示:

118:矩形左上角的 x 坐标。

120:矩形左上角的 y 坐标。

732:矩形的宽度。

835:矩形的高度。

因此,这个矩形从图像的坐标 (118, 120) 开始,宽度为 732 像素,高度为 835 像素。

2、完整代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread(r"C:\Users***\long.png")

# 创建一个与图像大小相同的掩码
mask = np.zeros(image.shape[:2], np.uint8)

# 创建两个数组,用于存储算法内部使用的临时数组
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)

# 定义一个矩形区域,该区域包含我们想要分割的前景物体
# 矩形的格式为 (x, y, width, height)
rect = (118, 120, 732, 835)

# 应用 GrabCut 算法
cv2.grabCut(image, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)

# 创建一个新的掩码,将可能的前景和确定的前景合并
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')

# 将掩码应用于图像
result = image * mask2[:, :, np.newaxis]

# 显示原始图像和分割结果
plt.subplot(121), plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.title('Segmented Image'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

k-means算法是一种常用的无监督学习算法,用于将数据集划分为K个不同的簇。在彩色图像前景背景分割中,可以使用k-means算法将图像中的像素点分为前景背景两个簇。 以下是一个基于Matlab的k-means彩色图像前景背景分割的简单代码示例: ```matlab % 读取彩色图像 image = imread('image.jpg'); % 转换图像为Lab颜色空间 lab_image = rgb2lab(image); % 从Lab颜色空间中提取a和b通道 ab_channels = lab_image(:, :, 2:3); % 扁平化ab通道,仅保留两个通道的像素信息 ab_channels = reshape(ab_channels, [], 2); % 颜色通道标准化 ab_channels = double(ab_channels) / 255; % 使用k-means算法将像素点分为两个簇,即前景背景 % 这里我们取K=2 k = 2; [cluster_idx, ~] = kmeans(ab_channels, k); % 将像素点重新组织为原始图像的大小 segmented_image = reshape(cluster_idx, size(lab_image, 1), size(lab_image, 2)); % 显示分割结果 figure; subplot(1, 2, 1); imshow(image); title('原始图像'); subplot(1, 2, 2); imagesc(segmented_image); title('分割结果'); colormap jet; % 显示分割结果的前景背景 foreground = segmented_image == 2; background = segmented_image == 1; figure; subplot(1, 3, 1); imshow(image); title('原始图像'); subplot(1, 3, 2); imshow(foreground); title('前景'); subplot(1, 3, 3); imshow(background); title('背景'); ``` 这段代码首先读取彩色图像,并将其转换为Lab颜色空间。然后,将a和b通道从Lab图像中提取出来,并将其扁平化为一个Nx2的矩阵。然后,利用k-means算法将这些像素点分为两个簇,即前景背景。最后,将分割结果重新组织为原始图像的大小,并将其显示出来。同时,将分割结果中的前景背景提取出来,并显示在单独的图像中。 这只是一个简单的示例,实际应用中可能需要对图像进行预处理、调整算法参数以及进行后处理等步骤,以提高分割的准确性和鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loong_XL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值