deltagamma 2024-04-17 11:03 采纳率: 0%
浏览 3

关于#matlab#的问题:从视频中提取图片,高斯滤波后计算噪声的标准差。出现有规律的点。

我从一段30帧的视频中,每3帧提取当前图片,对图片进行高斯滤波,然后用原始图像减去滤波后的图像,提取噪声,计算噪声的绝对平均值和标准差。
为什么会在31℃左右会出现一个异常点,而且每隔一定温度,就会出现有规律的一些点。是我的代码有问题吗。
以下是我的matlab处理代码。

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, 0.7, 'FilterSize', 5);

    noise = double(image) - double(filteredFrame);
    noise_mean_abs = mean(abs(noise(:)));
    noise_std = std(noise(:));

    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

img

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-17 11:03
    关注

    引自免费微信小程序:皆我百晓生

    在分析您的代码和提供的信息后,我认为您观察到的有规律的点可能是由于以下原因造成的:

    1. 视频中的帧率不均匀,导致某些帧与实际温度之间的对应关系不是完全线性的。
    2. 高斯滤波器可能在某些帧上过度平滑了图像,这可能会引入一些伪影,特别是在边缘和细节丰富的区域。
    3. 图像处理过程中可能存在噪声,尤其是在读取、转换或滤波步骤中。

    为了解决这个问题,我们可以尝试以下几个步骤:

    步骤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 大小的邻域内的平均值来完成的。然后,它将当前像素的值与其所在邻域的平均值相比较,得到噪声值。这种方法可以帮助减少由高斯滤波器引起的伪影,并更准确地反映图像中的真实噪声水平。

    为了进一步确认这些变化是否解决了问题,您可以绘制噪声平均绝对值随时间(或温度)的变化曲线,看看是否有改善。如果您仍然遇到类似的问题,可能需要检查输入数据本身是否存在异常,例如光照条件的变化或其他可能影响图像质量的因素。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月17日

悬赏问题

  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集