热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

给YUV视频加入椒盐噪声

你可以按帧读入yuv视频。然后每帧图像加入椒盐噪声,然后按帧保存成yuv视频就可以了啊。%对YUV格式文件信息按帧读入并进行下采样后保存%注:此次处理的YUV文件的Y、U、V分量是分开处理
你可以按帧读入yuv视频。然后每帧图像加入椒盐噪声,然后按帧保存成yuv视频就可以了啊。 
%对YUV格式文件信息按帧读入并进行下采样后保存
%注:此次处理的YUV文件的Y、U、V分量是分开处理的。但读入时是按4:2:2比例处理的
%对yuv文件存储时候使用的是平面格式而不是打包格式
function YUVSubsample(filename,frameNumMax,formatT,method,outputFileName)
clc;
clear;
%考虑到调用函数时未输入参数,则赋以默认参数值
if nargin==0
  frameNumMax = 16;         %读取的yuv的帧数:考虑到上采样的问题,此处应比最后输出的视频帧多一帧
  formatT = 'cif';          %yuv格式文件类型
  method = 'paper';         %yuv文件的下采样方法
  filename = 'coast_cif.yuv';%yuv格式文件名
  outputFileName = 'salt_pepper_coast_cif.yuv';  %yuv文件下采样后以另外一个名字保存
end
% 初始化帧格式
switch formatT
    case 'qcif'
         H = 144;   % 高
         W = 176;   % 宽
     case 'cif'
         H = 288;   % 高
         W = 352;   % 宽
     otherwise
         H = 480;   % 高
         W = 720;   % 宽
end

%按帧读入yuv文件并按帧处理后保存为yuv格式的文件
for  frameNum = 1:frameNumMax
    % 读取yuv格式某指定帧的文件内容[Y U V]为读入的某帧的原始数据
    [Y,U,V]=yuv_import(filename,[W,H],1,frameNum);
    % 按指定下采样方法进行下采样处理:[YI UI VI]为下采样后的数据
    
    %在此处对加入椒盐噪声处理
    Y = imnoise(uint8(Y),'salt & pepper',0.005);
    U = imnoise(uint8(U),'salt & pepper',0.005);
    V = imnoise(uint8(V),'salt & pepper',0.005);
    
    %分别显示Y、U、V分量
    subplot(1,3,1),imshow(uint8(Y));
    subplot(1,3,2),imshow(uint8(U));
    subplot(1,3,3),imshow(uint8(V));
    %将下采样后的[YI UI VI]数据输出,保存为指定文件名的yuv格式
    yuv_output(outputFileName,Y,U,V,1,frameNum);
    %播放每帧图像时暂停1/1000s
     pause(1/1000);
end

%读取yuv格式某指定帧的文件内容[Y U V]为读入的某帧的原始数据:实际上yuv的某帧文件就是一幅图片
function [Y,U,V]=yuv_import(filename,dims,numfrm,startfrm)
    %以只读的方式打开并关联文件
    fid=fopen(filename,'r');
    if (fid <0)
      error('File does not exist!');
    end;
    %计算每帧文件的大小,计算读取某指定帧的文件偏移位置
    Yd = zeros(dims(1),dims(2));
    UVd = zeros(dims(1)/2,dims(2)/2);   %UV分量的位置
    frelem = numel(Yd) + 2*numel(UVd);  %视频图像显示的宽度
    if (nargin == 4)                    %从文件起始位置计算偏移量
       fseek(fid, startfrm * frelem , 0);
    end;
    %初始化Y、U、V分量,YUV文件格式为:4:2:2
    Y=zeros(dims(2),dims(1),numfrm);
    U=zeros(dims(2)/2,dims(1)/2,numfrm);
    V=zeros(dims(2)/2,dims(1)/2,numfrm);
    %分别读入YUV分量
    for i=1:numfrm
        Yd = fread(fid,[dims(1) dims(2)],'uint8'); 
              Y = Yd';      %转置
        UVd = fread(fid,[dims(1)/2 dims(2)/2],'uint8');
              U = UVd';     %转置
        UVd = fread(fid,[dims(1)/2 dims(2)/2],'uint8');
              V = UVd';     %转置
    end;
    %关闭文件并去掉关联
    fclose(fid);
    
%将下采样后的[YI UI VI]数据输出,保存为指定文件名的yuv格式
function yuv_output(outputFileName,YI,UI,VI,numfrm,startfrm)
    %判断是否是第一帧即刚开始输入。如果是第一次输入则将原有同名文件覆盖否则在文件后追加信息
    if startfrm==1
        fileId=fopen(outputFileName,'w');
    else
        fileId=fopen(outputFileName,'a');
    end
    if (fileId <0)
      error('File does not exist!');
    end;
    %[YI UI VI]数据取下整
    YI = round(YI);
    UI = round(UI);
    VI = round(VI);
    %计算每个分量大小,计算每帧图像输出时文件的偏移位置
    Yd = size(YI);  %Y分量的位置
    Ud = size(UI);  %U分量的位置
    Vd = size(VI);  %V分量的位置
    frelem = Yd(1)*Yd(2) + Ud(1)*Ud(2) + Vd(1)*Vd(2); %视频图像显示的宽度
    if (nargin == 4)%从文件起始位置计算偏移量
       fseek(fid, startfrm * frelem , 0);
    end;
    %输出YI,UI,VI分量信息
    fwrite(fileId, YI', 'uint8');
    fwrite(fileId, UI', 'uint8');
    fwrite(fileId, VI', 'uint8');
    %关闭文件并去掉关联
    fclose(fileId);

推荐阅读
  • 如何将人人影视下载的字幕添加到视频中
    许多用户在下载了人人影视提供的字幕后,不清楚如何将其与视频文件结合。本文将详细介绍如何正确地将字幕加载到视频中,确保观看体验更加完整。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 在API测试中,我们常常需要通过大量不同的数据集(包括正常和异常情况)来验证同一个接口。如果为每种场景单独编写测试用例,不仅繁琐而且效率低下。采用数据驱动的方式可以有效简化这一过程。本文将详细介绍如何利用CSV文件进行数据驱动的API测试。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文介绍了在使用Visual Studio 2015进行项目开发时,遇到类向导弹出“异常来自 HRESULT:0x8CE0000B”错误的解决方案。通过具体步骤和实践经验,帮助开发者快速排查并解决问题。 ... [详细]
author-avatar
450651324_43c723
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有