分割输出结果,合并原图和标签图片

import cv2
from PIL import Image
import numpy as np

import SimpleITK as sitk

import imageio

import nibabel as nib

# def changeLabel(mask_image , ):

img_path_1 = "Case1.nii.gz"
mask_path_1 = "mask_case1.nii.gz"
# mask_path_1 = "resize_mask.nii.gz"

img_1 = sitk.GetArrayFromImage(sitk.ReadImage(img_path_1))

mask_2 = sitk.GetArrayFromImage(sitk.ReadImage(mask_path_1))

original_image = img_1[7, :, :]
# original_image = np.rot90(original_image)
# original_image = np.rot90(original_image)
original_image = np.flip(original_image , axis = 0)

# original_image = np.expand_dims(original_image , axis = 2)

mask_image = mask_2[7, :, :]
mask_image = np.flip(mask_image , axis = 0)


mask_image =np.where(mask_image > 2, 0, mask_image)
mask_image =np.where(mask_image < 2, 0, mask_image)
mask_image =np.where(mask_image == 2, 255, mask_image) #更改标签

imageio.imwrite("imageio.png", original_image)
imageio.imwrite("mask.png", mask_image)



original_image = cv2.imread("imageio.png", cv2.IMREAD_GRAYSCALE)
mask_image = cv2.imread("mask.png", cv2.IMREAD_GRAYSCALE)

# 确保图像大小相同
original_image = cv2.resize(original_image, (mask_image.shape[1], mask_image.shape[0]))

# 将白色背景转换为蓝色
result_image = cv2.cvtColor(original_image, cv2.COLOR_GRAY2BGR)
result_image[mask_image == 255] = [255, 255, 100]

# 将黑色背景设置为透明
result_image[np.logical_and(mask_image != 255, mask_image != 0)] = [0, 0, 0]


save_path = "out.png"
cv2.imwrite(save_path, result_image)
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在对超像素的多种生成方法有一定了解之后,比较各种算法的优劣,可以发现无论是那种算法都 很难做到对超像素数量的良好控制,把图像分割成超像素后,超像素的数量要么大于预期值造成过分 割,要么小于预期值造成欠分割。 而造成超像素数量难以控制的原因则是因为不同算法在由于自身策略的需要造成超像素数量的偏 差,以超像素分割中最经典的 SLIC 算法为例,分析其背后原因。 首先介绍一下 SLIC 算法,算法大致思想为:将图像从 RGB 颜色空间转换到 CIE-Lab 颜色空间, 对应每个像素的(l, a, b)颜色值和(x, y)坐标组成一个 5 维向量 V[l, a, b, x, y], 两个像素的相似性即可由 它们的向量距离来度量,距离越大,相似性越小。算法首先生成 K 个种子点,然后在每个种子点的周 围空间里搜索距离该种子点最近的若干像素,将它们归为与该种子点一类,直到所有像素点都归类完 毕。然后计算这 K 个超像素里所有像素点的平均向量值,重新得到 K 个聚类中心,然后再以这 K 个中 心去搜索其周围与其最为相似的若干像素,所有像素都归类完后重新得到 K 个超像素,更新聚类中心, 再次迭代,如此反复直到收敛。 算法思想上与 K-means 聚类算法极其相似。且思路十分简单,也因为其良好的扩展性,后续有许 许多多的超像素算法基于 SLIC 进行改善与优化[4][5]。而分析 SLIC 背后难以控制超像素数量的原因, 不难发现其实是由于算法以 K-means 算法为核心,在聚类过程中,造成不同超像素聚类大小不一。 以预期值 100 为输入,使用 SLIC 算法将最后输出 94 个超像素,通过调试代码我们发现,实际上 由于在聚类过程中产生了一些小的聚类不均的超像素,而其他算法也类似,出于一开始设计的算法局 限,造成了难以控制分割出的超像素数量的问题。而由于基于聚类的算法中广泛存在欠分割现象,因 此我们倾向于设计一种基于聚类的控制框架用以严格控制分割的超像素的数量。 首先我们先计算所使用算法在图像上的损失率,若输出超像素数量小于预期值,按损失比较将预 期值按比例放大,然后将放大的预期值作为输入,若输出仍小于原预期值,则再放大,一般经过一次 放大算法输出基本也能大于预期值了。之后再以放大的预期值作为输入,而输出的超像素数量一般能 够满足要求或者大于原始的预期值,接着再对多出来的超像素进行处理。 对于多出来的超像素我们采用两种策略进行处理,首先将包含像素点最少的超像素提取出来,再 找出它的邻居超像素。  策略一:对该超像素中的每个像素点,计算其与邻居超像素中心之间的距离,然后将该像素 点分配给距离最小的邻居超像素。  策略二:计算该超像素的中心,并计算与其它邻居超像素中心之间的距离,然后将该超像素 对应的标签更换为距离最小的邻居超像素对应的标签。  其中距离函数参照SLIC算法设置为: dc = (lj li)2 (aj ai)2 (bj bi)2 ds (xjxi)2(yjyi)2 D (dc)2(ds)2. mS 如此重复(numlabels - k)次,最后得到 k 个超像素。两种策略理论上都是可行的,但是通过 调试我们发现策略二的视觉效果明显要好于策略一。原因在于策略一的分配方法虽然能够将多出来的 超像素平均分配给其它领域超像素,但是这种分配方式会损失之前分割出来的边缘,而通过策略二则 能够较为完整的保持原来的边缘,但也仍然存在一些问题,比如由于合并了多出来的超像素,一些超 像素尺寸会稍大。但基于聚类算法的超像素本身就存在大小不均的情况,而尽管会有一些超像素尺寸 “超标”,但经过测试,与原方法在同一参数下得分相差不大,且达到了对超像素数量的严格控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值