Python에서 곡선 데이터 그래프를 구문 분석하는 방법

데이터 분석 작업을 하다 보면 직접적인 데이터가 없는 상황이 자주 발생하는데, 곡선 그래프의 경우 곡선 그래프에 있는 데이터를 분석해야 합니다.

예를 들어 아래 그림에서 문서에 따르면 가로 좌표 값 범위는 (0,175)이고 세로 좌표 값 범위는 (0,156)임을 알 수 있습니다. 곡선을 작동 가능한 데이터로 변환하는 방법 구체적인 단계는 다음과 같습니다.
여기에 이미지 설명을 삽입하세요.

  1. 그리기 도구를 사용하여 그림을 잘라내고 Windows 시스템의 "그리기" 기능과 같이 곡선의 좌표 경계에 따라 처리할 그림을 잘라냅니다.
  2. OpenCV에서 제공하는 API를 사용하고, 자세한 내용은 " Opencv-python 아이콘 및 워터마크 제거 기법 실습 "을 참조하여 곡선을 직접 추출하는 방식을 채택합니다.
  3. OpenCV에서 제공하는 이미지 회색조 처리 및 이진화 API를 사용하여 대상 이미지를 얻습니다.
  4. 이진화된 회색조 이미지를 분석하여 데이터를 얻습니다.

1. 그리기 도구를 사용하여 그림을 잘라냅니다.

여기에 이미지 설명을 삽입하세요.
잘라낸 사진을 heart1.JPG로 저장합니다.

2. 곡선 직접 추출을 위한 OpenCV 솔루션

import numpy as np
import matplotlib.pyplot as plt
import cv2
img=cv2.imread('img\heart1.JPG')

h,w,l=img.shape

for j in range(h):
    for k in range(w):
        if img[j][k][0] <135 or img[j][k][0] >175 or img[j][k][1] <185 or img[j][k][1] >220 or img[j][k][2] <45 or img[j][k][2] >129:
            img[j][k][0] = 255
            img[j][k][1] = 255 
            img[j][k][2] = 255
            
plt.imshow(img,cmap=plt.cm.gray)

그 중 색상 범위 값을 추출하는 방법은 " Opencv-python 아이콘 및 워터마크 제거 기법 실습 " 문서를 참고하시기 바랍니다.

3. OpenCV 이미지 회색조 처리 및 이진화 API 사용

image_gray = cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY)  # 转换成灰度图
plt.imshow(image_gray,cmap=plt.cm.gray)
# 二值化
thresh, new_img = cv2.threshold(image_gray, 200, 255, cv2.THRESH_BINARY)

cv2.imshow('NEW_IMG', new_img)
cv2.waitKey()
new_img = new_img.astype(np.int16)

참고: 이미지 데이터 형식은 uint8이며 최대값은 255입니다. 실제 좌표 값을 저장하려면 int16으로 변환해야 합니다.

OpenCV에서 제공하는 이미지 이진화 API, 임계값() 메서드 매개변수:

  • 픽처 매트릭스
  • 한계점
  • 그림의 최대값
  • 이진화 방법

이진화 방법:

THRESH_BINARY 임계값 이상은 255로 변경되고, 임계값 미만은 0으로 변경됩니다.
THRESH_BINARY_INV 임계값 이상은 0으로 변경되고, 임계값 미만은 255로 변경됩니다.
THRESH_TRUNC 잘라내어 임계값 이상의 값을 임계값으로 변경하면 최대값이 무효화됩니다.
THRESH_TOZERO 임계값보다 높으면 변경되지 않고 임계값보다 낮으면 0으로 변경됩니다.
THRESH_TOZERO_INV 임계값보다 높으면 0이어야 하고 임계값보다 낮으면 변경되지 않습니다.

여기에 이미지 설명을 삽입하세요.

4. 이진화된 회색조 이미지를 분석하여 데이터를 얻습니다.

데이터 분석의 원리:

먼저, 실제 그래픽(0, h)에 해당하는 (0, 0)부터 시작하는 좌표계인 이미지 데이터(2차원)를 명확히 합니다. 여기서 h는 최대 높이이며, 이는 의 역순으로 이해될 수 있습니다. 세로 좌표.

둘째, 그래프 데이터를 분석해 보면 그래프의 검은색 곡선은 값이 0으로 바로 세로축의 좌표로 표시되고(역순 참고), 나머지는 0으로 설정되어 2개의 결과를 얻는다. -처리할 차원 행렬입니다.

다음으로 좌표평균을 목표 데이터로 정의한다.

r,c = new_img.shape
for i in range(r):
    for j in range(c):
        if new_img[i][j]==255:
            new_img[i][j]=0
        else:
            new_img[i][j]=280 - i + 1

dat = new_img.mean(axis=0, keepdims=False,where=new_img>0)

#滤除手工抠图边界无数据情况
mask = np.isnan(dat)
dat = np.delete(dat, np.where(mask))
dat = dat*156/np.max(dat)
# 解析出数据,未进行度量单位转换
new_dat = dat.astype(np.int16)

# 绘图回放数据
plt.rcParams['font.sans-serif'] = ['SimHei']     # 设置正常显示中文
plt.rcParams['axes.unicode_minus']=False # 解决不显示负号 
plt.figure(figsize=(12,6))
plt.xlim(0,570)
x_lable = ['0','30','60','90','120','150','180']
pos_list = [0, 94, 188, 281, 375, 469,563]

plt.xticks(pos_list, x_lable)
#ax = plt.axes()
#ax.xaxis.set_major_locator(ticker.FixedLocator((name_list)))
#ax.xaxis.set_major_formatter(ticker.FixedFormatter((x_lable)))
plt.ylim(0,180)
plt.plot(new_dat)
plt.ylabel("心率")

plt.show()

재생 데이터를 플롯하면 결과는 다음과 같습니다.
여기에 이미지 설명을 삽입하세요.

5. 요약

곡선 데이터 그래프를 분석하는 것은 여전히 ​​​​어려운 일입니다. 첫 번째는 이미지 처리 기술입니다. 우리가 흔히 사용하는 곡선 그래프는 일반적으로 비교적 깨끗하고 처리하기 쉽습니다. 파싱 ​​과정에서 데이터의 측정 단위인 좌표 변환이 필요합니다.

더 많은 방법을 교환하는 것을 환영합니다.

참고:

Xiao Yongwei Opencv-python 아이콘 제거 및 워터마크 솔루션 실습 CSDN 블로그 2023.09

추천

출처blog.csdn.net/xiaoyw/article/details/132918834