YOLOv8 图像分割 单目标 多目标抠图

为了扣出一张图上的多个目标,代码不会写,怎么办?

这是原图

话不多说,直接上代码,里面注释很全。

from ultralytics import YOLO  # 导入YOLO模型类
from matplotlib import pyplot as plt
import numpy as np
import cv2  # 导入OpenCV库

# 加载预训练的模型
model = YOLO('best_fenge.pt')

# 读取图片并调整其大小以匹配模型训练时的输入尺寸
orig_img = cv2.imread('mushroom144.jpg')  # 使用cv2读取图片
# 这里特别注意,因为使用yolov8训练的时候默认会把图片resize成448*640的尺寸,所以这里也得改成你训练的尺寸
orig_img_resized = cv2.resize(orig_img, (640, 448))  # 调整图片大小

# 使用模型对调整后的图片进行推理
results = model(orig_img_resized, save=True)

# 初始化一个布尔数组掩码,用于合并所有检测到的物体掩码
combined_mask = np.zeros(orig_img_resized.shape[:2], dtype=np.bool_)

# 遍历检测到的所有掩码
for mask in results[0].masks.data:
    mask_bool = mask.cpu().numpy().astype(np.bool_)  # 将掩码转换为布尔数组
    combined_mask |= mask_bool  # 使用逻辑或操作合并掩码

# 使用合并后的掩码创建抠图
masked_image = np.zeros_like(orig_img_resized)  # 初始化一个全黑的图片数组
masked_image[combined_mask] = orig_img_resized[combined_mask]  # 应用掩码

# 创建一个带有透明背景的RGBA图像
alpha_channel = np.ones(combined_mask.shape, dtype=orig_img.dtype) * 255  # 创建全白的alpha通道
masked_image_rgba = np.dstack((masked_image, alpha_channel))  # 将RGB图像和alpha通道合并
masked_image_rgba[~combined_mask] = (0, 0, 0, 0)  # 设置背景为透明

# 保存两种处理后的图像
cv2.imwrite('masked_image_all_objects.jpg', masked_image)  # 保存带黑色背景的图像
cv2.imwrite('masked_image_all_objects.png', masked_image_rgba)  # 保存带透明背景的图像

# 显示第一张处理后的图像
masked_image = cv2.resize(masked_image, (1200, 950))  # 调整图像大小
cv2.imshow("YOLOv8 Inference", masked_image)  # 显示图像

cv2.waitKey(0)  # 等待用户按键
cv2.destroyAllWindows()  # 关闭所有OpenCV窗口

其中替换自己的模型和自己的图片就不用说了,我的模型和图片直接在我的工程中,可以直接调用,如果在其他位置,可以用绝对路径的形式。那结果就出来了。这张是黑色的背景图,背景颜色是可以改的。

这张是扣除背景的图,实现效果均在代码中体现了。

改背景的代码我写在这里,注意看,自定义背景色,上代码。

from ultralytics import YOLO  # 导入YOLO模型类
import numpy as np
import cv2  # 导入OpenCV库

# 加载预训练的模型
model = YOLO('best_fenge.pt')

# 读取图片并调整其大小以匹配模型训练时的输入尺寸
orig_img = cv2.imread('mushroom144.jpg')  # 使用cv2读取图片
# 这里特别注意,因为使用yolov8训练的时候默认会把图片resize成448*640的尺寸,所以这里也得改成你训练的尺寸
orig_img_resized = cv2.resize(orig_img, (640, 448))  # 调整图片大小

# 使用模型对调整后的图片进行推理
results = model(orig_img_resized, save=True)

# 初始化一个布尔数组掩码,用于合并所有检测到的物体掩码
combined_mask = np.zeros(orig_img_resized.shape[:2], dtype=np.bool_)

# 遍历检测到的所有掩码
for mask in results[0].masks.data:
    mask_bool = mask.cpu().numpy().astype(np.bool_)  # 将掩码转换为布尔数组
    combined_mask |= mask_bool  # 使用逻辑或操作合并掩码

# 定义自定义背景颜色,例如浅蓝色 (B, G, R)
background_color = (255, 210, 160)

# 创建一个和原始调整后图像相同大小,且为自定义背景颜色的背景图像
background_image = np.full_like(orig_img_resized, background_color, dtype=np.uint8)

# 使用合并后的掩码创建带有自定义背景颜色的图像
custom_bg_image = np.where(combined_mask[:,:,None], orig_img_resized, background_image)

# 创建一个带有透明背景的RGBA图像
alpha_channel = np.ones(combined_mask.shape, dtype=orig_img.dtype) * 255  # 创建全白的alpha通道
masked_image_rgba = np.dstack((custom_bg_image, alpha_channel))  # 将RGB图像和alpha通道合并
masked_image_rgba[~combined_mask] = (0, 0, 0, 0)  # 设置背景为透明

# 保存带有自定义背景颜色的图像
cv2.imwrite('masked_image_custom_background.jpg', custom_bg_image)

# 保存带有透明背景的图像为PNG,以保持透明度信息
cv2.imwrite('masked_image_transparent_background.png', masked_image_rgba)

# 显示带有自定义背景颜色的图像
custom_bg_image_resized = cv2.resize(custom_bg_image, (1200, 950))  # 调整图像大小以便显示
cv2.imshow("YOLOv8 Inference with Custom Background", custom_bg_image_resized)

cv2.waitKey(0)  # 等待用户按键
cv2.destroyAllWindows()  # 关闭所有OpenCV窗口

效果如下。

有的同学就问了,单目标怎么做?话不多说,上代码。单目标代码来源于这篇文章。https://blog.csdn.net/qq_42452134/article/details/136272606

from ultralytics import YOLO
from matplotlib import pyplot as plt
import numpy as np
import cv2

# 加载sam模型,如果没有这个框架也会自动的为你下载
model = YOLO('best_fenge.pt')

# 读取一张图片,
orig_img = cv2.imread('mushroom144.jpg')
# 这里特别注意,因为使用yolov8训练的时候默认会把图片resize成448*640的尺寸,所以这里也得改成你训练的尺寸
orig_img = cv2.resize(orig_img, (640, 448))  # 注意OpenCV中尺寸是先宽度后高度

# 使用模型进行推理, 后面save=True的参数可以输出测试分割的图片
results = model(orig_img, save=True)

# 这里是我获取mask编码部分的。
mask = results[0].masks.data[0].cpu().numpy().astype(np.bool_)

# 应用掩码到原始图像
# 如果你想要背景是黑色的
masked_image = np.zeros_like(orig_img)
masked_image[mask] = orig_img[mask]

# 如果你想要背景透明(假设原始图像是RGB格式)
# 创建一个RGBA图像,其中背景是透明的
alpha_channel = np.ones(mask.shape, dtype=orig_img.dtype) * 255  # 创建alpha通道
masked_image_rgba = np.dstack((masked_image, alpha_channel))  # 将alpha通道添加到RGB通道
masked_image_rgba[~mask] = (0, 0, 0, 0)  # 将非掩码区域设置为透明

# 保存图片,黑色背景
cv2.imwrite('masked_image_test.jpg', masked_image)

# 如果背景是透明的
cv2.imwrite('masked_image_test.png', masked_image_rgba)

效果如下,我的图像是多目标,所以只保留了第一个检测到的物体。

同学们,你们该不会需要修改单目标的背景色吧?

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
图像掩膜抠图是一种常见的图像处理技术,可以将图像中某些部分从背景中分离出来,通常用于图像分割、物体识别等方面。Matlab提供了很多图像处理工具箱,其中包括了图像掩膜抠图的相关函数。 掩膜抠图的基本思路是:将目标物体与背景分离,将目标物体用一个二值图像表示出来,再通过对二值图像进行处理,得到目标的轮廓,并最终将目标从原始图像中分离出来。 以下是一个简的Matlab代码示例,用于实现基本的图像掩膜抠图: ```matlab % 读入图像 img = imread('example.jpg'); % 将图像转换为灰度图 gray_img = rgb2gray(img); % 二值化图像 binary_img = gray_img > 50; % 通过腐蚀和膨胀操作,去除噪声和连接区域 se = strel('disk', 3); eroded_img = imerode(binary_img, se); dilated_img = imdilate(eroded_img, se); % 获取目标轮廓 contour_img = bwperim(dilated_img); % 将目标从原始图像中分离出来 masked_img = img; masked_img(repmat(~contour_img, [1,1,3])) = 0; % 显示结果 subplot(1,2,1), imshow(img), title('Original Image'); subplot(1,2,2), imshow(masked_img), title('Masked Image'); ``` 以上代码将读入一张名为"example.jpg"的图像,将其转换为灰度图,并通过二值化操作得到目标物体的二值图像。接着,通过腐蚀和膨胀操作,去除噪声和连接区域,得到目标物体的轮廓。最后,将目标物体从原始图像中分离出来,并显示结果。 在实际应用中,需要根据具体情况对掩膜抠图的参数进行调整,以达到更好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值