下面是一个用Python实现的代码,来读取一个文件夹下连续抓拍的150张PNG图片,计算每个像素点在150帧内的均值和方差,然后在14个3x3的矩形ROI内进行拟合。
我们将使用OpenCV读取图片,NumPy进行计算,并用scipy进行线性回归拟合。
import cv2
import numpy as np
import os
from glob import glob
from scipy.stats import linregress
# 文件夹路径
folder_path = 'path_to_your_images_folder'
# 读取所有PNG图片文件
image_files = sorted(glob(os.path.join(folder_path, '*.png')))
# 检查是否有150张图片
if len(image_files) != 150:
raise ValueError("图片数量不足150张")
# 读取所有图片并存储到一个列表中
images = [cv2.imread(img, cv2.IMREAD_GRAYSCALE) for img in image_files]
# 转换为NumPy数组,方便后续计算
images = np.array(images)
# 定义14个ROI,每个ROI为3x3的矩形
rois = [
(10, 10), (20, 20), (30, 30), (40, 40), (50, 50),
(60, 60), (70, 70), (80, 80), (90, 90), (100, 100),
(110, 110), (120, 120), (130, 130), (140, 140)
]
# 保存均值和方差的列表
means = []
variances = []
# 计算每个ROI内的均值和方差
for (x, y) in rois:
roi_pixels = images[:, y:y+3, x:x+3].reshape(150, -1)
mean = np.mean(roi_pixels, axis=0)
var = np.var(roi_pixels, axis=0)
means.extend(mean)
variances.extend(var)
# 转换为NumPy数组
means = np.array(means)
variances = np.array(variances)
# 进行线性回归拟合
slope, intercept, r_value, p_value, std_err = linregress(means, variances)
print(f'拟合结果: var = {slope:.4f} * mean + {intercept:.4f}')
print(f'R值: {r_value:.4f}')
print(f'P值: {p_value:.4f}')
print(f'标准误差: {std_err:.4f}')
代码解释
-
读取图片:
- 使用OpenCV读取文件夹下的所有PNG图片。
- 确保读取的图片数量为150张。
- 将所有图片存储为一个NumPy数组,方便后续计算。
-
定义ROI:
- 定义14个3x3的矩形ROI,ROI的左上角坐标保存在一个列表中。
-
计算均值和方差:
- 对于每个ROI,提取ROI内的像素点,计算每个像素点在150帧内的均值和方差。
- 将计算结果保存在
means
和variances
列表中。
-
线性回归拟合:
- 使用
scipy.stats.linregress
进行线性回归拟合,拟合出方差和均值之间的线性关系。
- 使用
注意事项
- 请确保
folder_path
指向包含150张PNG图片的文件夹。 - 代码假设图片大小足够大,能够包含所定义的ROI区域。
如果有其他需求或改进,请告知!