引自免费微信小程序:皆我百晓生
在分析您的代码和提供的信息后,我认为您观察到的有规律的点可能是由于以下原因造成的:
- 视频中的帧率不均匀,导致某些帧与实际温度之间的对应关系不是完全线性的。
- 高斯滤波器可能在某些帧上过度平滑了图像,这可能会引入一些伪影,特别是在边缘和细节丰富的区域。
- 图像处理过程中可能存在噪声,尤其是在读取、转换或滤波步骤中。
为了解决这个问题,我们可以尝试以下几个步骤:
步骤1: 确保视频帧率是恒定的。如果不是,请确保您正确地调整了帧间隔,以匹配视频的实际帧率。
步骤2: 考虑使用不同的高斯滤波器参数,例如调整滤波器大小或标准偏差,以减少平滑过度带来的伪影。
步骤3: 在计算噪声时,可以考虑使用局部平均方法(如邻域平均)来估算背景噪声,而不是直接通过原始图像和滤波图像之差来获取。
下面是修改后的代码,包括上述建议的实现:
% 设置高斯滤波器大小和标准偏差
filterSize = 5;
sigma = 0.7;
% 初始化变量
image_means = [];
image_stds = [];
noise_means_abs = [];
noise_stds = [];
% 增加一个局部平均窗口大小,用于背景噪声估计
localAvgWindow = 15; % 可根据实际情况调整
for frameNumber1 = 1:framesPerInterval:videoObj.NumFrames
currentcFrame = read(videoObj, frameNumber1);
grayFrame = rgb2gray(currentcFrame);
image = grayFrame(170:550,450:830);
grayImage = double(image);
image_mean = mean(grayImage(:));
image_std = std(grayImage(:));
filteredFrame = imgaussfilt(image, sigma, 'FilterSize', filterSize);
% 使用局部平均法估计背景噪声
localNoise = zeros(size(image));
for i = 1:image_size(1)
for j = 1:image_size(2)
windowStartRow = max(i-localAvgWindow/2, 1);
windowEndRow = min(i+localAvgWindow/2, image_size(1));
windowStartCol = max(j-localAvgWindow/2, 1);
windowEndCol = min(j+localAvgWindow/2, image_size(2));
localRegion = image(windowStartRow:windowEndRow, windowStartCol:windowEndCol);
localBackground = mean(localRegion(:));
localNoise(i,j) = abs(image(i,j) - localBackground);
end
end
noise_mean_abs = mean(localNoise(:));
noise_std = std(localNoise(:));
image_means=[image_means,image_mean];
image_stds=[image_stds,image_std];
noise_means_abs = [noise_means_abs, noise_mean_abs];
noise_stds = [noise_stds, noise_std];
end
这段代码首先进行了局部平均噪声估计,这是通过计算每个像素周围 localAvgWindow
大小的邻域内的平均值来完成的。然后,它将当前像素的值与其所在邻域的平均值相比较,得到噪声值。这种方法可以帮助减少由高斯滤波器引起的伪影,并更准确地反映图像中的真实噪声水平。
为了进一步确认这些变化是否解决了问题,您可以绘制噪声平均绝对值随时间(或温度)的变化曲线,看看是否有改善。如果您仍然遇到类似的问题,可能需要检查输入数据本身是否存在异常,例如光照条件的变化或其他可能影响图像质量的因素。