把mask文件转换成celpose的格式

基本用法

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"))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Pythonistas29xs

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

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

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

打赏作者

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

抵扣说明:

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

余额充值