【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()

在这里插入图片描述

图像灰度化

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


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()

在这里插入图片描述

像素化效果

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

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)

在这里插入图片描述

热力图绘制

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

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

pip install seaborn

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

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)

此代码将像素化的图像转换为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")

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

小结

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

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现热力与影像叠加,可以按照以下步骤进行操作: 1. 读取影像热力数据,将热力数据转换为灰度图像。 ```python import cv2 import numpy as np # 读取影像热力数据 img = cv2.imread('image.png') heatmap = cv2.imread('heatmap.png') # 将热力数据转换为灰度图像 heatmap_gray = cv2.cvtColor(heatmap, cv2.COLOR_BGR2GRAY) ``` 2. 对热力进行归一化处理,将像素值转换到0~255的范围内。 ```python # 对热力进行归一化处理 heatmap_norm = cv2.normalize(heatmap_gray, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U) ``` 3. 将热力叠加到影像上,并调整透明度。 ```python # 将热力叠加到影像上 heatmap_color = cv2.applyColorMap(heatmap_norm, cv2.COLORMAP_JET) result = cv2.addWeighted(img, 0.8, heatmap_color, 0.4, 0) # 显示结果 cv2.imshow('Result', result) cv2.waitKey(0) ``` 在上述代码中,`cv2.addWeighted()`函数用于将两幅图像按权重进行合并,其中第一个参数为影像,第二个参数为热力,第三个参数为影像的权重,第四个参数为热力的权重,第五个参数为合并后的亮度调整值。可以通过调整权重和亮度调整值来控制合并后的效果。 另外,`cv2.applyColorMap()`函数用于将灰度图像转换为伪彩色图像,其中`cv2.COLORMAP_JET`参数表示使用Jet伪彩色映射。您也可以选择其他伪彩色映射,如`cv2.COLORMAP_HOT`、`cv2.COLORMAP_COOL`等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值