来源: 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: 待添坑