python根据点生成heatmap函数

来源: verse-冠军方案

    def generate_heatmap(self, coords, sigma_scale_factor, dtype=np.float32):
        """
        Generates a numpy array of the landmark image for the specified point and parameters.
        :param coords: numpy coordinates ([x], [x, y] or [x, y, z]) of the point.
        :param sigma_scale_factor: Every value of the gaussian is multiplied by this value.
        :param dtype: The heatmap output type.
        :return: numpy array of the landmark image.
        """
        # landmark holds the image
        heatmap = np.zeros(self.image_size, dtype=dtype)

        # flip point from [x, y, z] to [z, y, x]
        flipped_coords = np.flip(coords, 0)
        region_start = (flipped_coords - self.sigma * self.size_sigma_factor / 2).astype(int)
        region_end = (flipped_coords + self.sigma * self.size_sigma_factor / 2).astype(int)

        region_start = np.maximum(0, region_start).astype(int)
        region_end = np.minimum(self.image_size, region_end).astype(int)

        # return zero landmark, if region is invalid, i.e., landmark is outside of image
        if np.any(region_start >= region_end):
            return heatmap

        region_size = (region_end - region_start).astype(int)

        sigma = self.sigma * sigma_scale_factor
        scale = self.scale_factor

        if not self.normalize_center:
            scale /= math.pow(math.sqrt(2 * math.pi) * sigma, self.dim)

        if self.dim == 1:
            dx = np.meshgrid(range(region_size[0]))
            x_diff = dx + region_start[0] - flipped_coords[0]

            squared_distances = x_diff * x_diff

            cropped_heatmap = scale * np.exp(-squared_distances / (2 * math.pow(sigma, 2)))

            heatmap[region_start[0]:region_end[0]] = cropped_heatmap[:]

        if self.dim == 2:
            dy, dx = np.meshgrid(range(region_size[1]), range(region_size[0]))
            x_diff = dx + region_start[0] - flipped_coords[0]
            y_diff = dy + region_start[1] - flipped_coords[1]

            squared_distances = x_diff * x_diff + y_diff * y_diff

            cropped_heatmap = scale * np.exp(-squared_distances / (2 * math.pow(sigma, 2)))

            heatmap[region_start[0]:region_end[0],
                    region_start[1]:region_end[1]] = cropped_heatmap[:, :]

        elif self.dim == 3:
            dy, dx, dz = np.meshgrid(range(region_size[1]), range(region_size[0]), range(region_size[2]))
            x_diff = dx + region_start[0] - flipped_coords[0]
            y_diff = dy + region_start[1] - flipped_coords[1]
            z_diff = dz + region_start[2] - flipped_coords[2]

            squared_distances = x_diff * x_diff + y_diff * y_diff + z_diff * z_diff

            cropped_heatmap = scale * np.exp(-squared_distances / (2 * math.pow(sigma, 2)))

            heatmap[region_start[0]:region_end[0],
                    region_start[1]:region_end[1],
                    region_start[2]:region_end[2]] = cropped_heatmap[:, :, :]

        return heatmap

后续进行解释
ToDo: 待添坑

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值