首页 > 解决方案 > 如何在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

标签: pythonpandasdataframenumpycsv

解决方案


您想对图像数据进行 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]

推荐阅读