病理图像(WSI)处理

最近在做肺腺癌分型相关的项目,记录一下对病理图像(WSI)处理的一些方式。

滑动窗口切片

def crop_img(ori_img, mask_img, cropsize, overlap, image_filename_, label_dataset_path, unlabel_dataset_path):
    """
    裁剪图像为指定格式并保存成tiff
    输入为array形式的数组
    """
    num = 0
    mask_threshold = 300
    height = ori_img.shape[0]
    width = ori_img.shape[1]
    print(height)
    print(width)

    # 从左上开始裁剪
    for i in range(int(height / (cropsize * (1 - overlap)))):  # 行裁剪次数
        for j in range(int(width / (cropsize * (1 - overlap)))):  # 列裁剪次数
            ori_cropped = ori_img[
                          int(i * cropsize * (1 - overlap)): int(i * cropsize * (1 - overlap) + cropsize),
                          int(j * cropsize * (1 - overlap)): int(j * cropsize * (1 - overlap) + cropsize),
                          :,
                          ]  # max函数是为了防止i,j为0时索引为负数 # 通道不裁剪
            mask_cropped = mask_img[
                           int(i * cropsize * (1 - overlap)): int(i * cropsize * (1 - overlap) + cropsize),
                           int(j * cropsize * (1 - overlap)): int(j * cropsize * (1 - overlap) + cropsize),
                           ]  # max函数是为了防止i,j为0时索引为负数 # 通道不裁剪

            if np.sum(mask_cropped) < mask_threshold:
                ori_path = os.path.join(unlabel_dataset_path,
                                        image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.jpg')
                mask_path = os.path.join(unlabel_dataset_path,
                                         image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.png')
            else:
                ori_path = os.path.join(label_dataset_path,
                                        image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.jpg')
                mask_path = os.path.join(label_dataset_path,
                                         image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.png')
            print(ori_path)
            cv2.imwrite(ori_path, ori_cropped)
            cv2.imwrite(mask_path, mask_cropped)
            num = num + 1

    #  向前裁剪最后的列
    for i in range(int(height / (cropsize * (1 - overlap)))):
        ori_cropped = ori_img[
                      int(i * cropsize * (1 - overlap)): int(i * cropsize * (1 - overlap) + cropsize),
                      int(j * cropsize * (1 - overlap)): int(j * cropsize * (1 - overlap) + cropsize),
                      :,
                      ]
        mask_cropped = mask_img[
                       int(i * cropsize * (1 - overlap)): int(i * cropsize * (1 - overlap) + cropsize),  # 所有行
                       width - cropsize: width,  # 最后256列
                       ]

        if np.sum(mask_cropped) < mask_threshold:
            ori_path = os.path.join(unlabel_dataset_path, image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.jpg')
            mask_path = os.path.join(unlabel_dataset_path,
                                     image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.png')
        else:
            ori_path = os.path.join(label_dataset_path, image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.jpg')
            mask_path = os.path.join(label_dataset_path, image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.png')
        print(ori_path)
        cv2.imwrite(ori_path, ori_cropped)
        cv2.imwrite(mask_path, mask_cropped)
        num = num + 1

    # 向前裁剪最后的行
    for j in range(int(width / (cropsize * (1 - overlap)))):
        ori_cropped = ori_img[
                      int(i * cropsize * (1 - overlap)): int(i * cropsize * (1 - overlap) + cropsize),
                      int(j * cropsize * (1 - overlap)): int(j * cropsize * (1 - overlap) + cropsize),
                      :,
                      ]
        mask_cropped = mask_img[
                       height - cropsize: height,  # 最后256行
                       int(j * cropsize * (1 - overlap)): int(j * cropsize * (1 - overlap) + cropsize),  # 所有列
                       ]
        if np.sum(mask_cropped) < mask_threshold:
            ori_path = os.path.join(unlabel_dataset_path, image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.jpg')
            mask_path = os.path.join(unlabel_dataset_path,
                                     image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.png')
        else:
            ori_path = os.path.join(label_dataset_path, image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.jpg')
            mask_path = os.path.join(label_dataset_path, image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.png')
        print(ori_path)
        cv2.imwrite(ori_path, ori_cropped)
        cv2.imwrite(mask_path, mask_cropped)
        num = num + 1

    # 裁剪右下角
    ori_cropped = ori_img[
                  height - cropsize: height,
                  width - cropsize: width,
                  :,  # 通道不裁剪
                  ]
    mask_cropped = mask_img[
                   height - cropsize: height,
                   width - cropsize: width,
                   ]
    if np.sum(mask_cropped) < mask_threshold:
        ori_path = os.path.join(unlabel_dataset_path, image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.jpg')
        mask_path = os.path.join(unlabel_dataset_path, image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.png')
    else:
        ori_path = os.path.join(label_dataset_path, image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.jpg')
        mask_path = os.path.join(label_dataset_path, image_filename_.split('/')[-1][:-4] + '_' + str(num) + '.png')

    print(ori_path)
    cv2.imwrite(ori_path, ori_cropped)
    cv2.imwrite(mask_path, mask_cropped)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何实现公网访问本地内网搭建的WBO白板远程协作办公【内网穿透】

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cp…

mipi屏幕的供电和背光ledk

目录 屏幕供电 背光供电 屏幕供电 mipi的高通供电主要是2.8V和1.8V两个屏幕供电 author daisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 https://blog.csdn.net/qq_40715266?typeblog 供电配置路径 kernel/msm-3.18/arch/arm/boot/dts/P322/msm8953-mdss-panels.dtsi …

Kubernetes - Dashboard Token 访问登录永不过期配置

如图查看 1 2 3 4 步骤 选择 dashboard 的命名空间&#xff0c;有些版本估计在 kube-system&#xff0c;具体情况具体分析选择 Deployments找到对应 kubernetes-dashboard编辑 yml 添加配置项 - --token-ttl0 需要重新大刷下&#xff0c;重新登录下即可~

用Python完成下列问题。给你一个非空整数列表,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

用Python完成下列问题。给你一个非空整数列表&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 示例 1 &#xff1a; 输入&#xff1a;nums [2,2,1]输出&#xff1a;1 示例 2 &#xff1a; 输入&#xff1a;nums [4…

Vue3创建应用教程

前提条件&#xff1a; 熟悉命令行已安装 16.0 或更高版本的 Node.js 命令行 在当前工作目录输入cmd打开命令行窗口在命令行窗口输入(不需要输入>号&#xff09; 这一指令将会安装并执行 create-vue&#xff0c;它是 Vue 官方的项目脚手架工具。你将会看到一些诸如 TypeScr…

PageView组件实现翻页和自定义轮播图

PageView实现上下翻页 import package:flutter/material.dart; import package:flutter/services.dart; import package:flutter_demo/tools/pageViewKeepAlive.dart;void main() {//设置状态栏颜色SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(statusBar…

实现Springboot的自动装配

首先我们有一个模块叫testOne 该模块就只定义一个类UserService。 我们要将UserService自动装配到Springboot中。 一下是testOne的各个文件。 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM…

LinuxCNC的使用

先进行程序设置 点击“开始”,选择“创建新的配置” 设置好机床名称和单位 关键是需要设置并口地址 查看并口使用命令:lscpi -v 将使用的并口填入: 这里是设置页面

Cesium 展示——实现球体和背景分离

文章目录 需求分析补充:添加监听让Cesium随窗口大小自适应需求 页面本身body有一个背景,想要只加载cesium球体,而背景设为透明,露出body的背景,有没有方法实现呢 注意:图片是随机找的一张 分析 html<!-- Cesium --> <divid="cesiumContainer"style…

MySQL通过Binlog日志恢复数据库

一、MySQL Binlog 简介 MySQL 的二进制日志 binlog 可以说是 MySQL 最重要的日志&#xff0c;它记录了所有的 DDL 和 DML 语句&#xff08;除了数据查询语句select、show等&#xff09;&#xff0c;以事件形式记录&#xff0c;还包含语句所执行的消耗的时间&#xff0c;MySQL的…

onnx 图像分类

参考文章&#xff1a; 【netron】模型可视化工具netron-CSDN博客 Pytorch图像分类模型部署-ONNX Runtime本地终端推理_哔哩哔哩_bilibili 使用netron可视化模型结构 1&#xff09;使用在线版 浏览器访问&#xff1a;Netron 点击 “Open Model” 按钮&#xff0c;选择要可…

数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog

《数据库灾难应对&#xff1a;MySQL误删除数据的救赎之道&#xff0c;技巧get起来&#xff01;之binlog》 数据意外删除是数据库管理中常见的问题之一。MySQL作为广泛使用的数据库管理系统&#xff0c;当数据意外删除时&#xff0c;有几种方法可以尝试恢复数据。以下是binlog方…

基于SpringBoot的房屋租赁系统 附源码

基于SpringBoot的房屋租赁系统 附源码 文章目录 基于SpringBoot的房屋租赁系统 附源码 一.引言二.系统设计三.技术架构四.功能实现五.界面展示六.源码获取 一.引言 本文介绍了一个基于SpringBoot的房屋租赁系统。该系统利用SpringBoot框架的优势&#xff0c;实现了用户注册、登…

采购oled屏幕,应注意什么

在采购OLED屏幕时&#xff0c;应注意以下几点&#xff1a; 规格和参数&#xff1a;了解OLED屏幕的规格和参数&#xff0c;包括尺寸、分辨率、亮度、对比度、响应时间等。确保所采购的屏幕符合项目的需求和预期效果。 品质和可靠性&#xff1a;选择具有可靠品质和稳定性的OLED屏…

分布式事务seata使用示例及注意事项

分布式事务seata使用示例及注意事项 示例说明代码调用方&#xff08;微服务A&#xff09;服务方&#xff08;微服务B&#xff09; 测试测试一 &#xff0c;seata发挥作用&#xff0c;成功回滚&#xff01;测试二&#xff1a;处理feignclient接口的返回类型从Integer变成String,…

Ngnix之反向代理、负载均衡、动静分离

目录 1. Ngnix 1.1 Linux系统Ngnix下载安装 1.2 反向代理 正向代理&#xff08;Forward Proxy&#xff09;&#xff1a; 反向代理&#xff08;Reverse Proxy&#xff09;&#xff1a; 1.3 负载均衡 1.4 动静分离 1. Ngnix Nginx是一个高性能的开源Web服务器&#xff0…

python识别增强静脉清晰度 opencv-python图像处理案例

一.任务说明 用python实现静脉清晰度提升。 二.代码实现 import cv2 import numpy as npdef enhance_blood_vessels(image):# 调整图像对比度和亮度enhanced_image cv2.convertScaleAbs(image, alpha0.5, beta40)# 应用CLAHE&#xff08;对比度受限的自适应直方图均衡化&…

Future CompleteFuture

前言 Java8 中的 completeFuture 是对 Future 的扩展实现&#xff0c;主要是为了弥补 Future 没有相应的回调机制的缺陷。 Callable、Runnable、Future、CompletableFuture 之间的关系&#xff1a; Callable&#xff0c;有结果的同步行为&#xff0c;比如做蛋糕&#xff0c;…

python程序打包成exe全流程纪实(windows)

目录 前言准备工作安装python&#xff08;必须&#xff09;安装vs平台或conda&#xff08;非必须&#xff09; 详细步骤Step1.创建python虚拟环境方法一、裸装(windows下)方法二、借助工具(windows下) Step2.安装打包必须的python包Step3.准备好程序logo&#xff08;非必须&…

51单片机定时器

51单片机有两个16位定时器&#xff0c;今天复习了一下使用方法&#xff0c;发现当初刚开始学习51单片机时并没有记录&#xff0c;特此今天补上这篇博客。 下面是定时器的总览示意图&#xff0c;看到这个图就能想到定时器怎么设置&#xff0c;怎么开始工作。 第一步&#xff1a…
最新文章