1问题描述
在绘制不规则的热力图时,我撰写了以下的博客供大家参考:
异形热力图的绘制(以鞋垫上的柔性压力传感器阵列离散点绘制足部压力热力图为例)
但是我在用的时候发现了一些小问题,博客中用的足形是凸轮廓,生成的云图没有问题,但是在应用到如下所示的手型图时,就发现出了bug,如中间图所示,后续我采取了在图像上加了一层蒙版的方法予以解决,绘制出来的手型云图如右边图所示。
1. 导入所需库
首先,我们需要导入必要的库:
import cv2
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
from matplotlib.path import Path
cv2
:用于图像处理。numpy
:用于数值计算。matplotlib
:用于绘图。scipy
:用于插值计算。
2. 提取离散轮廓点
接下来,我们定义一个函数来提取图像中的离散轮廓点:
def get_discrete_points(image_path, n=1, spacing=10):
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
_, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY_INV)
contours, _ = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
all_contour_points = []
for i, contour in enumerate(contours[:n]):
discrete_points = []
for j in range(0, len(contour), spacing):
point = contour[j][0]
discrete_points.append((point[0], point[1]))
all_contour_points.append(discrete_points)
return all_contour_points
代码说明
- 读取图像:将图像转换为灰度图。
- 二值化:将轮廓转换为二值图像,黑色轮廓为 0,背景为 255。
- 查找轮廓:使用
cv2.findContours
函数找到所有轮廓。 - 离散化轮廓点:每隔
spacing
个点抽取一个,生成离散点集。
示例调用
image_path = r'\Snipaste_2024-09-30_11-01-01.jpg'
n_contours = 34
spacing = 50
contour_points_list = get_discrete_points