把mask文件转换成celpose的格式

该博客介绍了如何使用skimage和PIL库对图像进行连通区域分析,包括单个图像和批量处理。在处理过程中,注意到当矩形框有重叠时,直接赋值会导致信息覆盖。为解决此问题,改用获取连通区域像素点并直接赋值的方法,确保每个区域的正确标识。

基本用法

import math
import matplotlib.pyplot as plt
from skimage.measure import label, regionprops, regionprops_table
from PIL import Image
import numpy as np

img = Image.open("C429.png")
img = np.array(img)

label_img = label(img)
regions = regionprops(label_img)
print(len(regions))

fig, ax = plt.subplots()
ax.imshow(img, cmap=plt.cm.gray)

for props in regions:
    y0, x0 = props.centroid
    orientation = props.orientation
    x1 = x0 + math.cos(orientation) * 0.5 * props.minor_axis_length
    y1 = y0 - math.sin(orientation) * 0.5 * props.minor_axis_length
    x2 = x0 - math.sin(orientation) * 0.5 * props.major_axis_length
    y2 = y0 - math.cos(orientation) * 0.5 * props.major_axis_length

    ax.plot((x0, x1), (y0, y1), '-r', linewidth=1)
    ax.plot((x0, x2), (y0, y2), '-r', linewidth=1)
    ax.plot(x0, y0, '.g', markersize=5)

    minr, minc, maxr, maxc = props.bbox
    bx = (minc, maxc, maxc, minc, minc)
    by = (minr, minr, maxr, maxr, minr)
    ax.plot(bx, by, '-b', linewidth=2.5)

# ax.axis((0, 2048, 600, 2048))
plt.show()
plt.savefig("test.png")

单个图像处理

from skimage.measure import label, regionprops
from PIL import Image
import numpy as np

img = Image.open("C429.png")
img = np.array(img, dtype=np.uint16)  # for cellpose mask format:uint16

label_img = label(img)
regions = regionprops(label_img)
print(len(regions))

for props in regions:
    minr, minc, maxr, maxc = props.bbox
    img[minr:maxr, minc:maxc][np.where(img[minr:maxr, minc:maxc] != 0)] = props.label

img = Image.fromarray(img)
img.save("test.png")

批量处理

from skimage.measure import label, regionprops
from PIL import Image
import numpy as np
import os

files = os.listdir("masks")
for file in files:
    img = Image.open(os.path.join("masks", file))
    img = np.array(img, dtype=np.uint16)  # for cellpose mask format:uint16

    label_img = label(img)
    regions = regionprops(label_img)
    print(len(regions))

    for props in regions:
        minr, minc, maxr, maxc = props.bbox
        img[minr:maxr, minc:maxc][np.where(img[minr:maxr, minc:maxc] != 0)] = props.label

    img = Image.fromarray(img)
    img.save(os.path.join("D:\cell_segmentation\data\CellData\masks", file.split(".")[0]+"_masks.png"))

以上方法存在的问题

当两个矩形框有重合的部分,赋值时后面的值会把前面的值覆盖,造成赋值错误。

在这里插入图片描述
在这里插入图片描述

解决方法:根据regionprops得到连通区域的属性,找到连通区域的所有像素点,给像素点赋值。而不是给矩阵框中的像素点赋值。

连通区域属性:
在这里插入图片描述

正确的赋值方式

from skimage.measure import label, regionprops
from PIL import Image
import numpy as np
import os

files = os.listdir("masks")
for file in files:
    img = Image.open(os.path.join("masks", file))
    img = np.array(img, dtype=np.uint16)  # for cellpose mask format:uint16

    label_img = label(img)
    regions = regionprops(label_img)
    print(len(regions))

    for props in regions:
        minr, minc, maxr, maxc = props.bbox
        # 为了得到像素点的x,y坐标
        pixel_points = props.coords       # (2704,2) 
        pixel_points = np.transpose(pixel_points, [1, 0])   # (2, 2704)
        img[pixel_points[0], pixel_points[1]] = props.label

    img = Image.fromarray(img)
    img.save(os.path.join("masks", file.split(".")[0]+"_masks.png"))
计及源荷不确定性的综合能源生产单元运行调度与容量配置优化研究(Matlab代码实现)内容概要:本文围绕“计及源荷不确定性的综合能源生产单元运行调度与容量配置优化”展开研究,利用Matlab代码实现相关模型的构建与仿真。研究重点在于综合能源系统中多能耦合特性以及风、光等可再生能源出力和负荷需求的不确定性,通过鲁棒优化、场景生(如Copula方法)、两阶段优化等手段,实现对能源生产单元的运行调度与容量配置的协同优化,旨在提高系统经济性、可靠性和可再生能源消纳能力。文中提及多种优化算法(如BFO、CPO、PSO等)在调度与预测中的应用,并强调了模型在实际能源系统规划与运行中的参考价值。; 适合人群:具备一定电力系统、能源系统或优化理论基础的研究生、科研人员及工程技术人员,熟悉Matlab编程和基本优化工具(如Yalmip)。; 使用场景及目标:①用于学习和复现综合能源系统中考虑不确定性的优化调度与容量配置方法;②为含高比例可再生能源的微电网、区域能源系统规划设计提供模型参考和技术支持;③开展学术研究,如撰写论文、课题申报时的技术方案借鉴。; 阅读建议:建议结合文中提到的Matlab代码和网盘资料,先理解基础模型(如功率平衡、设备模型),再逐步深入不确定性建模与优化求解过程,注意区分鲁棒优化、随机优化与分布鲁棒优化的适用场景,并尝试复现关键案例以加深理解。
### 问题分析与解决方案 在将TXT文件转换MASK文件后出现全黑的情况,可能是由于以下几种原因导致的: 1. **像素值范围错误**:如果在生MASK时未正确设置像素值范围(例如,像素值超出了[0, 255]的范围),则可能会导致图像显示为纯黑色[^3]。 2. **数据类型不匹配**:如果MASK文件的数据类型未正确设置为`uint8`(OpenCV默认使用的数据类型),则可能导致图像无法正确显示[^4]。 3. **通道数问题**:如果MASK文件被错误地保存为多通道图像(例如RGB或RGBA),而不是单通道灰度图像,则可能会导致显示异常[^1]。 4. **文件写入错误**:在保存MASK文件时,可能存在写入失败或文件格式不兼容的问题,从而导致生MASK文件为空或无效[^2]。 以下是针对上述问题的解决方案: ### 解决方案 #### 1. 确保像素值范围正确 在生MASK文件时,需要确保像素值位于正确的范围内。例如,如果MASK文件表示二分类图像(背景和目标),可以将目标区域的像素值设置为255,背景区域的像素值设置为0。以下是一个示例代码: ```python import numpy as np import cv2 # 假设txt文件内容为一个二维数组 def txt_to_mask(txt_file_path, mask_file_path): # 读取TXT文件并将其转换为numpy数组 mask = np.loadtxt(txt_file_path) # 确保像素值范围为[0, 255] mask = (mask > 0).astype(np.uint8) * 255 # 将非零值转换为255 # 保存为MASK文件 cv2.imwrite(mask_file_path, mask) txt_to_mask("input.txt", "output_mask.png") ``` #### 2. 确保数据类型为`uint8` 在保存MASK文件时,必须确保数据类型为`uint8`,否则可能导致图像无法正确显示。上述代码中通过`(mask > 0).astype(np.uint8)`实现了这一点。 #### 3. 确保MASK为单通道灰度图像 在保存MASK文件时,应确保其为单通道灰度图像。如果使用`cv2.cvtColor()`进行颜色空间转换时出现问题,可以直接保存为灰度图像,而无需额外的转换步骤。例如: ```python # 直接保存为灰度图像 cv2.imwrite("output_mask.png", mask) ``` #### 4. 验证文件写入是否功 在保存MASK文件后,可以通过读取文件并验证其内容来确保写入功。以下是一个简单的验证函数: ```python def validate_mask(mask_file_path): mask = cv2.imread(mask_file_path, cv2.IMREAD_GRAYSCALE) if mask is None: print("MASK文件读取失败!") return False if np.all(mask == 0): print("MASK文件为纯黑色!") return False print("MASK文件验证功!") return True validate_mask("output_mask.png") ``` ### 示例完整流程 以下是一个完整的流程示例,展示如何从TXT文件生MASK文件,并验证其正确性: ```python import numpy as np import cv2 def txt_to_mask(txt_file_path, mask_file_path): mask = np.loadtxt(txt_file_path) mask = (mask > 0).astype(np.uint8) * 255 cv2.imwrite(mask_file_path, mask) def validate_mask(mask_file_path): mask = cv2.imread(mask_file_path, cv2.IMREAD_GRAYSCALE) if mask is None: print("MASK文件读取失败!") return False if np.all(mask == 0): print("MASK文件为纯黑色!") return False print("MASK文件验证功!") return True # 转换TXT文件为MASK文件 txt_to_mask("input.txt", "output_mask.png") # 验证MASK文件 validate_mask("output_mask.png") ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Pythonistas29xs

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

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

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

打赏作者

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

抵扣说明:

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

余额充值