玩转SAM语义分割之(2)显示特定的图片

news2024/11/25 6:53:43

文章目录

  • 1. 使用matplotlib显示出完整彩色的掩码,并将其保存下来
  • 2. 使用matplotlib显示出单张掩码,只保存面积大于一个阈值的掩码图片
  • 3. 对一整个文件夹中的图片进行处理,只保存面积大于一定阈值的掩码图片
  • 4. 查看特定坐标点处是否有mask掩码
  • 5. 查看鼠标点击的区域是否有mask掩码

1. 使用matplotlib显示出完整彩色的掩码,并将其保存下来

### import os.path 
 
import cv2 
import matplotlib.pyplot as plt 
import numpy as np 
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator 
 
 
def matplotlib_plot_sam_masks(masks,alpha=0.35):  # 使用matplotlib绘制Sam的masks掩码 
 
    for mask in masks: 
        mask_segmentation = mask['segmentation'] * alpha  # 获取mask 
        color_list = np.random.random((1, 3)).tolist()[0]  # 随机生成颜色 
        img_ones = np.ones((image.shape[0], image.shape[1], 4)) 
        for i in range(3):  # 将图像的RGB通道设置为随机的颜色 
            img_ones[:, :, i] = color_list[i] 
        img_ones[:, :, 3] = mask_segmentation 
        img_ones = cv2.resize(img_ones, (image.shape[1], image.shape[0]))  # 将掩模图像缩放至与原始图像相同的大小 
        ax = plt.gca() 
        ax.set_autoscale_on(False) 
        ax.spines['top'].set_visible(False) 
        ax.spines['right'].set_visible(False) 
        ax.spines['bottom'].set_visible(False) 
        ax.spines['left'].set_visible(False) 
 
        ax.imshow(img_ones) 
 
def get_filename_and_houzhui(full_path): 
    import os 
    path, file_full_name = os.path.split(full_path) 
    file_name, 后缀名 = os.path.splitext(file_full_name) 
    return path,file_name,后缀名 
 
image_name = 'notebooks/images/dog.jpg' 
image = cv2.imread(image_name) 
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 
 
sam_model = sam_model_registry['vit_b'](checkpoint='models/sam_vit_b_01ec64.pth').to(device='cuda') 
mask_generator = SamAutomaticMaskGenerator(sam_model) 
 
masks = mask_generator.generate(image) 
 
 
plt.imshow(image) 
plt.axis('off') 
matplotlib_plot_sam_masks(masks,alpha=0.35) 
path,file_name,后缀名 = get_filename_and_houzhui(full_path = image_name) 
output_name = os.path.join('output',f"{file_name}_mask.png") 
plt.savefig(output_name, bbox_inches='tight', dpi=600, pad_inches=0.0) 
plt.show()

2. 使用matplotlib显示出单张掩码,只保存面积大于一个阈值的掩码图片

### import os.path 
 
import cv2 
import matplotlib.pyplot as plt 
import numpy as np 
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator 
 
def get_filename_and_houzhui(full_path): 
    import os 
    path, file_full_name = os.path.split(full_path) 
    file_name, 后缀名 = os.path.splitext(file_full_name) 
    return path,file_name,后缀名 
 
def make_dir(path): 
    import os 
    dir = os.path.exists(path) 
    if not dir: 
        os.makedirs(path) 
 
 
def set_mask_area_threshold_to_save(masks, mask_area_threshold = 2000, output_path=''):  # 设置一定的面积阈值,只有大于阈值的图片才会被保存 
 
    for index,mask in enumerate(masks): 
        mask_segmentation = mask['segmentation']  # 获取mask 
        mask_area = mask['area'] 
 
        if(mask_area > mask_area_threshold):       #设置一定的面积阈值,用来挑选对应的mask掩码图片 
            print("mask_area:", mask_area) 
            plt.imshow(mask_segmentation) 
 
            output_file_path = os.path.join(output_path,f"{index}_{mask_area}.png") 
            plt.savefig(output_file_path, bbox_inches='tight', dpi=600, pad_inches=0.0) 
 
            # plt.axis('off') 
            # plt.show() 
 
 
image_name = 'notebooks/images/dog.jpg' 
path,file_name,后缀名 = get_filename_and_houzhui(full_path = image_name) 
make_dir(f'output/{file_name}') 
output_path = f'output/{file_name}/' 
 
 
image = cv2.imread(image_name) 
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 
 
sam_model = sam_model_registry['vit_b'](checkpoint='models/sam_vit_b_01ec64.pth').to(device='cuda') 
mask_generator = SamAutomaticMaskGenerator(sam_model) 
 
masks = mask_generator.generate(image) 
 
plt.imshow(image) 
plt.axis('off') 
set_mask_area_threshold_to_save(masks, 10000, output_path) 
plt.show()

3. 对一整个文件夹中的图片进行处理,只保存面积大于一定阈值的掩码图片

  • 这个处理的速度相对来说还比较慢。处理20张图片,用了半个小时都没搞完,可能是代码或者设置的参数不对吧
### import os.path

import cv2
import matplotlib.pyplot as plt
import numpy as np
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator
import os
import cv2
from tqdm import tqdm


def get_filename_and_houzhui(full_path):
    import os
    path, file_full_name = os.path.split(full_path)
    file_name, 后缀名 = os.path.splitext(file_full_name)
    return path, file_name, 后缀名


def make_dir(path):
    import os
    dir = os.path.exists(path)
    if not dir:
        os.makedirs(path)


def set_mask_area_threshold_to_save(masks, mask_area_threshold=2000, output_path=''):  # 设置一定的面积阈值,只有大于阈值的图片才会被保存

    for index, mask in enumerate(masks):
        mask_segmentation = mask['segmentation']  # 获取mask
        mask_area = mask['area']

        if (mask_area > mask_area_threshold):  # 设置一定的面积阈值,用来挑选对应的mask掩码图片
            print("mask_area:", mask_area)
            plt.imshow(mask_segmentation)

            output_file_path = os.path.join(output_path, f"{index}_{mask_area}.png")
            plt.savefig(output_file_path, bbox_inches='tight', dpi=600, pad_inches=0.0)


def resize_image(image, w=800):
    import cv2
    img_h, img_w, c = image.shape
    output = cv2.resize(image, (w, int(w * img_h / img_w)), interpolation=cv2.INTER_CUBIC)
    return output


image_dir_path = 'data/fruit'
image_name_list = os.listdir(image_dir_path)
for image_name in tqdm(image_name_list):
    print("image_name:", image_name)
    image_path = os.path.join(image_dir_path, image_name)
    image = cv2.imread(image_path)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image = resize_image(image, 640)

    path, file_name, 后缀名 = get_filename_and_houzhui(full_path=image_path)
    output_path = f'output/fruit/{file_name}/'
    make_dir(output_path)

    sam_model = sam_model_registry['vit_b'](checkpoint='models/sam_vit_b_01ec64.pth').to(device='cuda')
    mask_generator = SamAutomaticMaskGenerator(sam_model)

    masks = mask_generator.generate(image)

    set_mask_area_threshold_to_save(masks, 500, output_path)

4. 查看特定坐标点处是否有mask掩码

### import os.path

import cv2
import matplotlib.pyplot as plt
import numpy as np
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator


def matplotlib_plot_sam_masks(masks,alpha=0.35):  # 使用matplotlib绘制Sam的masks掩码

    for mask in masks:
        mask_segmentation = mask['segmentation'] * alpha  # 获取mask
        color_list = np.random.random((1, 3)).tolist()[0]  # 随机生成颜色
        img_ones = np.ones((image.shape[0], image.shape[1], 4))
        for i in range(3):  # 将图像的RGB通道设置为随机的颜色
            img_ones[:, :, i] = color_list[i]
        img_ones[:, :, 3] = mask_segmentation
        img_ones = cv2.resize(img_ones, (image.shape[1], image.shape[0]))  # 将掩模图像缩放至与原始图像相同的大小
        ax = plt.gca()
        ax.set_autoscale_on(False)
        ax.spines['top'].set_visible(False)
        ax.spines['right'].set_visible(False)
        ax.spines['bottom'].set_visible(False)
        ax.spines['left'].set_visible(False)

        ax.imshow(img_ones)



def set_mask_area_threshold_to_save(masks, mask_area_threshold=2000, output_path=''):  # 设置一定的面积阈值,只有大于阈值的图片才会被保存

    for index, mask in enumerate(masks):
        mask_segmentation = mask['segmentation']  # 获取mask
        mask_area = mask['area']

        if (mask_area > mask_area_threshold):  # 设置一定的面积阈值,用来挑选对应的mask掩码图片
            print("mask_area:", mask_area)
            plt.imshow(mask_segmentation)

            output_file_path = os.path.join(output_path, f"{index}_{mask_area}.png")
            plt.savefig(output_file_path, bbox_inches='tight', dpi=600, pad_inches=0.0)




def on_click(event):
    if event.button == 1:
        x, y = event.xdata, event.ydata
        print(f"鼠标左键点击:x={x:.2f}, y"
              f"={y:.2f}")
        output_name = os.path.join('output', f"{file_name}_mask.png")
        print('开始保存----------------->')
        plt.savefig(output_name, bbox_inches='tight', dpi=600, pad_inches=0.0)

        for index, mask in enumerate(masks):
            mask_segmentation = mask['segmentation']  # 获取mask
            mask_area = mask['area']
            # points



        print('保存完毕----------------->')
        # set_mask_area_threshold_to_save()
    elif event.button == 3:
        print("鼠标右键点击")




def make_dir(path):
    import os
    dir = os.path.exists(path)
    # print('---------------------------------------------------')
    # print(path)
    if not dir:
        os.makedirs(path)


def get_filename_and_houzhui(full_path):
    import os
    path, file_full_name = os.path.split(full_path)
    file_name, 后缀名 = os.path.splitext(file_full_name)
    return path,file_name,后缀名

def resize_image(image,w=800):
    import cv2
    img_h, img_w, c = image.shape
    output = cv2.resize(image, (w, int(w * img_h / img_w)), interpolation=cv2.INTER_CUBIC)
    return output

image_name = 'data/fruit/00001.jpg'

image = cv2.imread(image_name)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = resize_image(image,640)


sam_model = sam_model_registry['vit_b'](checkpoint='models/sam_vit_b_01ec64.pth').to(device='cuda')
mask_generator = SamAutomaticMaskGenerator(sam_model)

masks = mask_generator.generate(image)


for mask in masks:
    mask_segmentation = mask['segmentation']  # 获取mask
    # print(mask_segmentation)
    point_value = mask_segmentation[100,100]
    print(point_value)

5. 查看鼠标点击的区域是否有mask掩码

  • 如果这个代码并不是特别准确,因为有时候可能会存在一个点数有两张掩码的情况,可能是因为区域不对吧
### import os.path

import cv2
import matplotlib.pyplot as plt
import numpy as np
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator


def matplotlib_plot_sam_masks(masks,alpha=0.35):  # 使用matplotlib绘制Sam的masks掩码

    for mask in masks:
        mask_segmentation = mask['segmentation'] * alpha  # 获取mask
        color_list = np.random.random((1, 3)).tolist()[0]  # 随机生成颜色
        img_ones = np.ones((image.shape[0], image.shape[1], 4))
        for i in range(3):  # 将图像的RGB通道设置为随机的颜色
            img_ones[:, :, i] = color_list[i]
        img_ones[:, :, 3] = mask_segmentation
        img_ones = cv2.resize(img_ones, (image.shape[1], image.shape[0]))  # 将掩模图像缩放至与原始图像相同的大小
        ax = plt.gca()
        ax.set_autoscale_on(False)
        ax.spines['top'].set_visible(False)
        ax.spines['right'].set_visible(False)
        ax.spines['bottom'].set_visible(False)
        ax.spines['left'].set_visible(False)

        ax.imshow(img_ones)



def set_mask_area_threshold_to_save(masks, mask_area_threshold=2000, output_path=''):  # 设置一定的面积阈值,只有大于阈值的图片才会被保存

    for index, mask in enumerate(masks):
        mask_segmentation = mask['segmentation']  # 获取mask
        mask_area = mask['area']

        if (mask_area > mask_area_threshold):  # 设置一定的面积阈值,用来挑选对应的mask掩码图片
            print("mask_area:", mask_area)
            plt.imshow(mask_segmentation)

            output_file_path = os.path.join(output_path, f"{index}_{mask_area}.png")
            plt.savefig(output_file_path, bbox_inches='tight', dpi=600, pad_inches=0.0)




def on_click(event):
    if event.button == 1:
        x, y = event.xdata, event.ydata
        x = int(x)
        y = int(y)
        print('-----------------开始显示----------------->')
        print('x:',x,'y:',y)
        output_name = os.path.join('output', f"{file_name}_mask.png")
        # plt.savefig(output_name, bbox_inches='tight', dpi=600, pad_inches=0.0)

        for index, mask in enumerate(masks):
            # mask_segmentation = mask['segmentation']  # 获取mask
            mask_area = mask['area']
            # points
            mask_segmentation = mask['segmentation']  # 获取mask
            point_value = mask_segmentation[int(y), int(x)]
            if point_value == True:
                print(point_value)

        print('-----------------结束显示----------------->')


        # set_mask_area_threshold_to_save()
    elif event.button == 3:
        print("鼠标右键点击")




def make_dir(path):
    import os
    dir = os.path.exists(path)
    # print('---------------------------------------------------')
    # print(path)
    if not dir:
        os.makedirs(path)


def get_filename_and_houzhui(full_path):
    import os
    path, file_full_name = os.path.split(full_path)
    file_name, 后缀名 = os.path.splitext(file_full_name)
    return path,file_name,后缀名

def resize_image(image,w=800):
    import cv2
    img_h, img_w, c = image.shape
    output = cv2.resize(image, (w, int(w * img_h / img_w)), interpolation=cv2.INTER_CUBIC)
    return output

image_name = 'data/fruit/00001.jpg'

image = cv2.imread(image_name)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = resize_image(image,640)


sam_model = sam_model_registry['vit_b'](checkpoint='models/sam_vit_b_01ec64.pth').to(device='cuda')
mask_generator = SamAutomaticMaskGenerator(sam_model)

masks = mask_generator.generate(image)


fig, ax = plt.subplots()  # 创建画布和子图对象
ax.imshow(image)
plt.axis('off')
cid = fig.canvas.mpl_connect('button_press_event', on_click)  # 绑定鼠标点击事件

matplotlib_plot_sam_masks(masks,alpha=1)
path,file_name,后缀名 = get_filename_and_houzhui(full_path = image_name)
make_dir(path)
output_name = os.path.join('output',f"{file_name}_mask.png")

plt.savefig(output_name, bbox_inches='tight', dpi=600, pad_inches=0.0)
plt.show()

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

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

相关文章

Go语言的并发:goroutine和channel

目录 【Go 的并发方案:goroutine】 goroutine 的基本用法 【通道channel】 创建channel: 发送与接收变量: 关闭channel: 【channel的类型】 无缓冲channel和带缓冲channel 无缓冲channel 带缓冲channel nil channel 单…

随便聊聊 顺便晒一下我的听歌设备

平时最大的爱好就是听歌了,我平时的听歌类型挺多元化的,硬要说的话更偏向 Jpop、ACG、女声、轻音乐、大编制、交响乐,当然好听的都听不局限于类型。 又是30天一天不落O(∩_∩)O😄 作为一个音乐爱好者,在听歌设备上面花…

Liunx压缩命令 - zip

zip命令 – 压缩文件 zip命令的功能是用于压缩文件,解压命令为unzip。通过zip命令可以将文件打包成.zip格式的压缩包,里面会包含文件的名称、路径、创建时间、上次修改时间等等信息,与tar命令相似。 语法格式:zip 参数 目标文件…

MySQL高级_第04章_逻辑架构

MySQL高级_第04章_逻辑架构 1. 逻辑架构剖析 1.1 服务器处理客户端请求 那服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?这里以查询请求为例展示: 下面具体展开看一下: 1.2 Connectors 1.3 第1…

Go 本地缓存 bigcache

​本地缓存已经算是数据库的常规设计了,因为数据直接缓存在机器内存中,避免昂贵的IO开销,数据的读取和写入快到不可思议。本地缓存常驻在内存中,就好像业务逻辑中声明的全局变量一样,不会被垃圾回收。但本地内存也会导…

JavaScript:new操作符

一、new操作符的作用 用于创建一个给定构造函数的实例对象 new操作符创建一个用户定义的对象类型的实例 或 具有构造函数的内置对象的实例。二、new一个构造函数的执行过程 2.1、创建一个空对象obj 2.2、将空对象的原型与构造函数的原型连接起来 2.3、将构造函数中的this绑定…

CPU的功能和组成

CPU的功能和组成 CPU是控制计算机自动完成取指令和执行指令任务的部件,是计算机的核心部件、简称CPU 功能: 指令控制:对程序的顺序控制也是对指令执行的顺序控制(PC、JMP)操作控制:产生各种操作信号&…

2023.05.17-使用Vizzy进行音乐的可视化

文章目录 1. 简介2. 官网3. 使用3.1. 进行音乐可视化 1. 简介 Vizzy是MusicVid创作者的另一个在线音乐可视化工具。虽然这款应用还处于Alpha版本,但Vizzy相当令人印象深刻,绝对值得一试。Vizzy支持动画文本对象、频谱、图像和效果。工具集的最突出的功能…

基础篇007. 串行通信(二)--中断方式接收数据

目录 1. 实验任务 2. 硬件原理 3. 利用STM32CubeMX创建MDK工程 3.1 STM32CubeMX工程创建 3.2 配置调试方式 3.3 配置时钟电路 3.4 配置GPIO 3.5 配置串口参数 3.6 配置时钟 3.7 项目配置 4. 串行通信实验 4.1 UART串口printf,scanf函数串口重定向 4.2 …

数组(C语言程序设计)

一、一维数组 数组是相同类型的有序数据的集合 1、一维数组的定义 形式:类型名 数组名[常量表达式] 2、一维数组元素的引用 形式:数组名[下标] 3、一维数组的初始化 形式:类型名 数组名[数组长度]{初值表} 4、一维数组程序设计示例 【例6.…

如何画类图

是为了写论文才回头看的,已经忘光了 在类图中,我们用一个矩形来表示一个类。这个矩形通常分为三个部分: 顶部:写类的名字。 中间:写类的特性,比如一个"狗"类可能有"颜色",“品种"…

Go语言的错误和异常处理:error、panic和recover

目录 【error类型】 error的基本用法 error.Is 用法 封装自定义错误结构体 error.As 用法 错误行为特征检视策略 【异常panic和recover】 panic recover panic 和 os.Exit 如何正确应对panic 【error类型】 error的基本用法 在Go语言中,一般使用 error …

【P1003 [NOIP2011 提高组] 铺地毯】

[NOIP2011 提高组] 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n n n 张地毯,编号从 1 1 1 到 n n n。现在将这些地毯按照编号从小…

Redis单线程 Vs 多线程

Redis单线程 Vs 多线程 一 面试题引入1.1 Redis到底是单线程还是多线程?1.2 IO多路复用1.3 Redis为什么快?1.4 Subtopic 二 Redis为什么选择单线程?2.1 这种问法其实并不严谨,为啥这么说?2.2 Redis是单线程究竟何意&am…

什么是JavaScript?为什么需要学习它?

JavaScript是一种广泛使用的编程语言,它被用于开发Web应用程序、桌面应用程序和移动应用程序。它的出现可以追溯到1995年,由瑞典计算机科学家Tim Bergling和美国计算机科学家John Resig共同开发。 JavaScript的历史可以追溯到20世纪90年代,当…

完美解决:由于找不到MSVR100.dll ,无法继续执行代码

当我们在运行某一个软件时,突然提示找不到MSVCR100.dll,我相信有不少用户都遇到过这种情况,并且在重新安装软件后还是无法解决。那么电脑提示找不到MSVCR100.dll该怎办呢? MSVCR100.dll是什么? 在解决找不到MSVCR100.dll这个问…

RabbitMQ之交换机详解

1 Exchages ​ 我们假设的是工作队列背后,每个任务都恰好交付给一个消费者(工作进程)。在这一部分中,我们将做一些完全不同的事情,我们将消息传达给多个消费者。这种模式 称为 ”发布/订阅“。 ​ 为了说明这种模式,我们将构建一…

vi和vim编辑器介绍与使用

VI 和 VIM 编辑器是 Unix 和 Linux 操作系统中最常用的文本编辑工具之一。虽然它们都用于编辑文本文件,但它们有一些不同之处。本文将对 VI 和 VIM 编辑器进行介绍,帮助你更好地了解编辑器的特性和优点。 Linux下常见的文本编辑器有: emacsp…

Unity解决在摄像机上面设置了TargetTexture后获取屏幕坐标不准的问题

大家好,我是阿赵 这里来分享一个最近遇到的小问题。 一、发现问题 如果我们想将3D模型放在UI上,一个比较普遍的做法是: 用一个单独的摄像机,把3D模型拍下来,并转成RenderTexture,贴到RawImage上。 那么如…

枚举类型enum详解

概述 enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),因为枚举类型是一种基本数据类型,而不是一种构造类型,它不能再分解成什么基本…