• 【OpenCV实现图像:OpenCV利用Python创作热力图】


    概要

    热力图是一种强大的统计图表,通过对数据进行色彩映射,直观展示了数据分布的热度和密度。在绘制热力图时,关键在于指定颜色映射的规则,这决定了图中不同数值的呈现方式。通常,较大的数值以深色或偏暖的色彩表示,而较小的数值则以浅色或偏冷的色彩呈现,从而使观察者能够迅速理解数据的相对大小和趋势。

    读取图像

    首先,我们来读取样例图像,并对其进行相应的crop操作。
    样例代码如下:

    
    import numpy as np
    import matplotlib.pyplot as plt
    import skimage.io as io
    img = plt.imread("img_2.png")
    # crop
    img_cut = img[0:400,:,:]
    plt.figure()
    plt.imshow(img_cut)
    plt.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    图像灰度化

    由于热力图主要用于可视化二维矩阵,所以我们需要将彩色图转化为灰度图,代码如下:

    
    import numpy as np
    import matplotlib.pyplot as plt
    import skimage.io as io
    img = plt.imread("img_2.png")
    # crop
    img_cut = img[0:400,:,:]
    plt.figure()
    plt.imshow(img_cut)
    plt.show()
    from skimage.color import rgb2gray
    gray_img = rgb2gray(img_cut)
    plt.imshow(gray_img,cmap='gray')
    plt.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    像素化效果

    像素化效果是一种图像处理技术,旨在赋予图像一种艺术化的像素化外观。该操作的关键步骤是将图像划分为非重叠的块,块的大小决定了最终像素化效果的粒度。通常,块的尺寸越大,图像看起来越像是由像素块组成。

    from PIL import Image
    
    
    def pixelate(image_path, pixel_size):
        # 打开图片
        img = Image.open(image_path)
    
        # 获取图片的宽度和高度
        width, height = img.size
    
        # 计算每个像素块的大小
        pixel_size = max(1, pixel_size)
        block_size = (width // pixel_size, height // pixel_size)
    
        # 缩小图像,然后放大回原始大小,实现像素化效果
        img = img.resize(block_size, resample=Image.NEAREST)
        img = img.resize((width, height), resample=Image.NEAREST)
    
        # 保存处理后的图像
        output_path = "pixelated_" + str(pixel_size) + "_" + image_path
        img.save(output_path)
    
    
    # 使用例子
    image_path = "img_2.png"
    pixel_size = 10
    pixelate(image_path, pixel_size)
    
    
    • 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

    在这里插入图片描述

    热力图绘制

    继处理灰度图和像素化之后,我们将进一步绘制热力图。热力图是通过色彩映射展示数据分布的一种方式,我们将使用Seaborn库绘制热力图,并以图像的像素块作为数据点。

    首先,我们需要安装Seaborn库,可以使用以下命令:

    pip install seaborn
    
    • 1

    接下来,我们将使用处理过的灰度图像进行热力图绘制:

    import seaborn as sns
    import matplotlib.pyplot as plt
    from PIL import Image
    import numpy as np
    
    def heatmap_from_image(image_path, pixel_size):
        # 打开处理后的图片
        img = Image.open("pixelated_" + str(pixel_size) + "_" + image_path)
    
        # 将图像转为NumPy数组
        img_array = np.array(img)
    
        # 创建热力图
        plt.figure(figsize=(10, 8))
        sns.heatmap(img_array[:, :, 0], cmap="viridis", cbar=False)
    
        # 设置图像标题和坐标轴标签
        plt.title("Heatmap from Pixelated Image")
        plt.xlabel("X-axis")
        plt.ylabel("Y-axis")
    
        # 显示热力图
        plt.show()
    
    # 使用例子
    heatmap_from_image("img_2.png", 10)
    
    • 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

    此代码将像素化的图像转换为NumPy数组,并使用Seaborn库绘制热力图。我们使用viridis颜色映射,您可以根据需要选择其他颜色映射。

    热力图调色板

    Seaborn库提供了丰富的调色板选项,允许您自定义热力图的颜色样式。在上面的代码中,我们使用了viridis调色板,如果您想尝试其他调色板,只需修改cmap参数即可。例如,我们将代码中的"cmap"参数改为"coolwarm",效果如下:

    import seaborn as sns
    import matplotlib.pyplot as plt
    from PIL import Image
    import numpy as np
    
    def heatmap_with_custom_palette(image_path, pixel_size, palette_name):
        # 打开处理后的图片
        img = Image.open("pixelated_" + str(pixel_size) + "_" + image_path)
    
        # 将图像转为NumPy数组
        img_array = np.array(img)
    
        # 创建热力图
        plt.figure(figsize=(10, 8))
        sns.heatmap(img_array[:, :, 0], cmap=palette_name, cbar=False)
    
        # 设置图像标题和坐标轴标签
        plt.title(f"Heatmap with {palette_name} Palette")
        plt.xlabel("X-axis")
        plt.ylabel("Y-axis")
    
        # 显示热力图
        plt.show()
    
    # 使用例子
    heatmap_with_custom_palette("img_2.png", 10, "coolwarm")
    
    • 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

    通过修改palette_name参数,您可以使用Seaborn支持的不同调色板,如"coolwarm"、"viridis"等。

    小结

    热力图是一种强大的数据可视化工具,通过色彩映射直观展示数据的分布和密度。在创建热力图时,我们通过图像处理的方式,包括图像裁剪、灰度化和像素化,为数据准备了合适的基础。通过结合图像处理和数据可视化的方法,能够更生动地呈现数据的特征,使得分析和理解变得更加直观。这一过程不仅仅适用于图像数据,还可以用于其他二维数据的热力图绘制,为数据分析提供了更多的可能性。

  • 相关阅读:
    【树形DP】树上拓扑序计数
    Thymeleaf简要学习笔记(转自代码重工)
    F-logic DataCube3 SQL注入漏洞复现(CVE-2024-31750)
    VueX
    java毕业设计OA办公系统mybatis+源码+调试部署+系统+数据库+lw
    这 6 款在线 PDF 转换工具,得试试
    T113-S3-buildroot文件系统tar解压缩gz文件
    业务需求不用等!低代码开发平台随需响应、快速搭建
    【Java】数组的深浅拷贝问题(二维数组举例)(136)
    设计模式之享元模式
  • 原文地址:https://blog.csdn.net/weixin_47869094/article/details/134469453