python - 如何在python中扫描像素数据框中的平方区域以找到最高值?
问题描述
我有一个目录,其中包含数百个代表热成像图像(288x383)的 csv 文件,当前代码扫描每个图像,取中央正方形区域的平均值(10 行 x 10 列),并在数据集中提供相关的平均值找到平均值的每个 csv 文件。
import os
import glob
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as m
%matplotlib inline
files = glob.glob('*.csv')
result = []
for file in files:
data = pd.read_csv(file, header = None)
# Central squared area to extract values
area_temp_measured = data.iloc[134:154, 181:201]
avg_rect_temp = area_temp_measured.to_numpy().sum() / 400
# append to the list
result.append((file, avg_rect_temp))
df = pd.DataFrame(result, columns = ['Full_name', 'Temperature'])
df.head()
出去:
Full_name Temperature
0 2021-09-13_13-42-16.csv 19.53025
1 2021-09-13_13-42-22.csv 17.79425
2 2021-09-13_13-42-29.csv 17.62500
3 2021-09-13_13-42-35.csv 18.06100
4 2021-09-13_13-42-47.csv 18.73850
但是,我想更新代码,以便它可以完全扫描每个文件,在类似的正方形区域(11x11)但在每个位置,找到同一区域的最高平均值,并将值与数据集一起传递到数据集该区域的中心坐标。
例子:
01 | 02 | 03 | 01 | 07 | 08 | 09 | 04 | 02 | 08
03 | 12 | 22 | 00 | 14 | 01 | 04 | 06 | 17 | 00
04 | 11 | 09 | 03 | 22 | 23 | 11 | 01 | 09 | 18
12 | 19 | 01 | 02 | 19 | 02 | 05 | 09 | 00 | 03
31 | 02 | 13 | 17 | 02 | 07 | 14 | 29 | 04 | 01
...
01 | 02 | 03 | 01 | 07 | 08 | 09 | 04 | 02 | 08
03 | 12 | 22 | 00 | 14 | 01 | 04 | 06 | 17 | 00
04 | 11 | 09 | 03 | 22 | 23 | 11 | 01 | 09 | 18
12 | 19 | 01 | 02 | 19 | 02 | 05 | 09 | 00 | 03
31 | 02 | 13 | 17 | 02 | 07 | 14 | 29 | 04 | 01
...
01 | 02 | 03 | 01 | 07 | 08 | 09 | 04 | 02 | 08
03 | 12 | 22 | 00 | 14 | 01 | 04 | 06 | 17 | 00
04 | 11 | 09 | 03 | 22 | 23 | 11 | 01 | 09 | 18
12 | 19 | 01 | 02 | 19 | 02 | 05 | 09 | 00 | 03
31 | 02 | 13 | 17 | 02 | 07 | 14 | 29 | 04 | 01
Full_name Temperature Coord_row Coord_col
0 2021-09-13_13-42-16.csv 22.52000 144 200
1 2021-09-13_13-42-22.csv 12.27240 250 150
2 2021-09-13_13-42-29.csv 17.04500 123 300
3 2021-09-13_13-42-35.csv 38.04000 100 012
4 2021-09-13_13-42-47.csv 49.08500 220 180
解决方案
您想对图像数据进行 2D 卷积并在结果图像中找到最大值。
使您的 DataFrame 成为 NumPy 数组:
img = df.values
使用 (11, 11) 内核模糊图像:根据计算 2D 数组中区域的平均值:
blurred = cv2.blur(img, (11, 11))
如果您不想安装 OpenCV,请查看同一问题中的其他解决方案,但请注意 SciPy 2D 卷积要慢得多。
根据https://stackoverflow.com/a/9483964/463796找到最大值的坐标:
coord_row, coord_col = np.unravel_index(blurred.argmax(), blurred.shape)
temp = blurred[coord_row, coord_col]
推荐阅读
- module - 如何在 System Verilog 中动态生成模块实例名称?
- java - 我试图将 Intellij 连接到数据库(mysql,xampp),由于某种原因,它每次都失败
- json - 将 Python 获取请求转换为 xml/json
- python - 为什么在 Python IDLE 中以管理员身份运行我的脚本时出现权限被拒绝错误?
- java - 矩形打印机程序
- http - 关于 HSTS HTTP 标头语法
- amazon-web-services - AWS Codepipeline Github Webhook 未通过 cloudformation 注册
- r - 如何在ggplot2 R中绘制具有置信区间的几何平均值?
- c# - 如果我的 C# switch 表达式不是详尽的会发生什么?
- cypress - 我可以在一个“描述”中有多个“它”并使用 beforeEach