File size: 2,506 Bytes
7c91758
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import cv2
import numpy as np

class DICOM_Utils(object):
    def apply_windowing(image_array, window_center, window_width):
        """
        Apply windowing to a DICOM image array.

        Parameters:
        - image_array: numpy array of the DICOM image
        - window_center: center of the window
        - window_width: width of the window

        Returns:
        - Windowed image array
        """
        lower_bound = window_center - (window_width / 2)
        upper_bound = window_center + (window_width / 2)

        # Apply windowing
        windowed_image = image_array.copy()
        windowed_image[windowed_image < lower_bound] = lower_bound
        windowed_image[windowed_image > upper_bound] = upper_bound

        # Normalize to [0, 255]
        windowed_image = ((windowed_image - lower_bound) / window_width) * 255

        return windowed_image.astype('uint8')

    def apply_CAM_overlay(heatmap, windowed_image, overlay_alpha=0.4):
        """
        Apply CAM (Class Activation Map) overlay to a given image.

        Parameters:
        - heatmap: torch.Tensor, the heatmap generated by CAM.
        - windowed_image: numpy.ndarray, the windowed image to overlay the heatmap on.
        - overlay_alpha: float, the transparency for overlaying heatmap. Default is 0.4.

        Returns:
        - overlayed: numpy.ndarray, the resulting image after overlaying the heatmap.
        """
        # Convert the heatmap tensor to a numpy array
        heatmap_np = heatmap.cpu().numpy().squeeze()

        # Normalize the heatmap to [0, 255]
        heatmap_normalized = ((heatmap_np - heatmap_np.min()) / 
                            (heatmap_np.max() - heatmap_np.min()) * 255).astype(np.uint8)

        # Convert the normalized heatmap to a colormap (for example, using the "jet" colormap)
        heatmap_colormap = cv2.applyColorMap(heatmap_normalized, cv2.COLORMAP_JET)

        # Resize the colormap to the original image size
        heatmap_resized = cv2.resize(heatmap_colormap, 
                                    (windowed_image.shape[1], windowed_image.shape[0]))

        # Convert the grayscale windowed_image to 3 channels
        windowed_image_colored = cv2.cvtColor(windowed_image, cv2.COLOR_GRAY2BGR)

        # Overlay the heatmap on the original image with a certain transparency
        overlayed = cv2.addWeighted(windowed_image_colored, 1 - overlay_alpha, 
                                    heatmap_resized, overlay_alpha, 0)

        return overlayed