用分割点坐标将图像二值化

最近在做图像分割,找了一些医学图像数据集,但GroundTruth不是二值图,而是由坐标表示。

如图:
图1 坐标:以(X, Y)成对存放于txt文件中
图1 坐标:以(X, Y)成对存放于txt文件中

原始图
图2 原始图

分割效果
图3 将坐标标注在图上

由于训练过程需要将图像分为二值图,也就是说要将左心室和非左心室分割开来。
opencv有个很好用的函数,可以直接将图像用轮廓坐标分割成二值图。那就是cv2.fillPoly

首先是得到一个掩模(mask),毫无疑问这个mask需要跟原图一样的大小。

import numpy as np
import pydicom
import cv2
import matplotlib.pyplot as plt
from PIL import Image

raw_dicom = pydicom.dcmread(dicom_dir)  #图像为dicom格式,所以用pydicom读取
dicom_picture = raw_dicom.pixel_array.astype(int)   #用pixel_array提取图像信息。相当于一个像素值组成的数组

mask = np.zeros_like(dicom_picture)     #将mask定义为一个跟图像一样大小的零矩阵
coords = np.loadtxt(counter_dir, delimiter=' ').astype('int')    #将坐标以list的形式提取出来
cv2.fillPoly(mask, [coords], 255)   #关键的一步,用这个函数就可以将轮廓内的部分标记出来。

结果:
这里写图片描述
图4 原图

这里写图片描述
图5 二值图

还有一个坑的地方,为什么用255而不是1,我看很多人都用的1,这是方便后续的存储。解释一下:
如果用1填充,那么用plt.imshow(mask, cmap =’gray’)可以将图像显示出来,但是存储的时候就是全黑的。我猜测是因为存储像素范围默认为0-255,所以0和1就没有太大的差别。所以我选用了255来填充。

这样就可以得到图中的效果了,但是为了得到二值图,还需要再转换一下。我用了PIL中的Image

mask = Image.fromarray(mask)         #mask是一个数组,所以先转为图像
mask = mask.convert("1")             #convert("1")表示转为2值图
scipy.misc.imsave("counter.png", mask)      #最后就是存储了

参考文献:
PIL.Image文档
opencv画图文档

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值