MatLab画PU分割模式图

2023-11-02 21:30
文章标签 matlab 分割 pu 模式图

本文主要是介绍MatLab画PU分割模式图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HEVC的四叉树块分割算法的核心是确定CU/PU/TU的最优分割模式。最优分割模式算法的代码块,即xCompressCu,网上有对此比较详细的阐释,个人的学习也是参考这些,这里不再赘述。
本文主要目的是画出某B帧的NonSquare PU分割模式图,即包括2NxN,Nx2N,以及四种AMP分割。HM编码器参数配置采用Random_access,对BasketballDrill序列,这里参考http://blog.csdn.net/hevc_cjl/article/details/8169182
在TEncCu中调用完xCompressCu后加入如下代码,将最终的PU分割模式导出至PUpartion文件中:

ofstream PupartionInfo;
TComDataCU* Pupartion= m_ppcBestCU[0];
PupartionInfo.open("PuPartion.txt", ios::app);
int iCount = 0;
int iWidthInPart = g_uiMaxCUWidth >> 2;  
for(UInt iPartitionNum = 0; iPartitionNum < Pupartion->getTotalNumPart(); iPartitionNum++){if ( (iCount & (iWidthInPart - 1)) == 0)  PupartionInfo  << "\n";//每16个数据换行iCount++;PupartionInfo <<  Pupartion-> getPartitionSize(g_auiRasterToZscan[iPartitionNum]) << " ";//以4x4块为基本单位,导出PU分割模式信息,光栅扫描转换为Z扫描}PupartionInfo.close();

得到的文件数据如图

这里写图片描述

接下来在matlab中,利用上面输出的数据,画出PU分割模式图,定义函数:function PU_View(YUV_FileName, Pu_Partion, Width, Height, NumFrame)
clc;
%%    参数设置
LCU_Size = 64;
MaxNumPartition = 256;
LCU_Width = 16;
LCU_Height = 16;
MinOperSize = 4;NumLCU_Row = floor( (Width + LCU_Size-1) / LCU_Size );     %  行有多少LCU,不满64的也算一个
NumLCU_Col = floor( (Height+ LCU_Size-1) / LCU_Size );   %  列有多少LCU,不满64的也算一个Fid_YUV     = fopen(YUV_FileName,'rb');
Fid_Pu      = fopen(Pu_Partion);for uiFrame = 1 : NumFrame%%     从buffer中读取数据ImgData   = fread(Fid_YUV, [Width, Height], 'uint8');      % image data YImgData_U = fread(Fid_YUV ,[Width/2, Height/2], 'uint8');  % image data UImgData_V = fread(Fid_YUV ,[Width/2, Height/2], 'uint8');  % image data VImgData = ImgData';PUData  = fscanf(Fid_Pu,'%d',[NumLCU_Row * NumLCU_Col * MaxNumPartition,1]);%以十进制读入数据,保存在PUData,PUData为NumLCU_Row * NumLCU_Col * MaxNumPartition行1列的矩阵%%画出LCU分界线figure ; imshow(ImgData,[]);for i = 1 : Width/LCU_Sizeline([i*LCU_Size, i*LCU_Size], [1 Height],'Color', 'r','LineWidth',2) %划纵向线endfor i = 1 : Height/LCU_Sizeline([1 Width], [i*LCU_Size, i*LCU_Size],'Color', 'r','LineWidth',2)%划横向线endfor i = 1 : NumLCU_Col %纵向扫描,表示第几行for j = 1 : NumLCU_Row %横向扫描,表示第几列Idx = (i-1) * NumLCU_Row + j;%获取当前LCU的IDuiPelX = (j-1) * LCU_Size + 1;%获取当前LCU左上角第一个像素的横坐标  uiPelY = (i-1) * LCU_Size + 1;%获取当前LCU左上角第一个像素的纵坐标PUData_Blk  = PUData( (Idx-1)*MaxNumPartition + 1 : (Idx)*MaxNumPartition);%从存储PU分割尺寸信息的一维PUData文件中获取当期LCU的PU分割尺寸信息uiPelXscan1 = uiPelX;uiPelYscan1 = uiPelY;uiPelXscan2 = uiPelX;uiPelYscan2 = uiPelY;for k=1 : LCU_Height  %第k行for l=1 : LCU_Width %第k行第l个元素if(PUData_Blk(16*(k-1)+l,1)~=0 && PUData_Blk(16*(k-1)+l,1)~=3 && PUData_Blk(16*(k-1)+l,1)~=8 &&  (uiPelXscan1 ~= uiPelX + LCU_Size - 1) && (uiPelXscan1 ~= Width))%寻找非对称分割PUuiPelXscan1 = uiPelX + (l-1) * MinOperSize;%获取NonSquare PU分割块左上角第一个像素点坐标uiPelYscan1 = uiPelY + (k-1) * MinOperSize;n=1;for m = l+1:l+15if(m>16)break;endif(PUData_Blk(16*(k-1)+m,1) == PUData_Blk(16*(k-1)+l,1))uiPelXscan2 = uiPelXscan1 + n * MinOperSize + 3;%获取当前NonSquare PU分割模式的块右上角像素的坐标uiPelYscan2 = uiPelYscan1;n=n+1;%n用于标识PU大小elsebreak;endendline([uiPelXscan1 uiPelXscan2], [uiPelYscan1  uiPelYscan2  ],'Color', 'g','LineWidth',1);line([uiPelXscan1 uiPelXscan2], [uiPelYscan1 + n * MinOperSize uiPelYscan1 + n * MinOperSize ],'Color', 'g','LineWidth',1);line([uiPelXscan1 uiPelXscan1], [uiPelYscan1 uiPelYscan1 + n * MinOperSize],'Color', 'g', 'LineWidth',1);line([uiPelXscan2 uiPelXscan2], [uiPelYscan1 uiPelYscan1 + n * MinOperSize],'Color', 'g', 'LineWidth',1);%PU轮廓线axis on;switch PUData_Blk(16*(k-1)+l,1)case 1 %2NxNline([uiPelXscan1 uiPelXscan2], [uiPelYscan1 + n/2 * MinOperSize uiPelYscan1 + n/2 * MinOperSize ],'Color', 'g','LineWidth',1); %画2NxN中间分割线case 2line([uiPelXscan1 + n/2 * MinOperSize uiPelXscan1 + n/2 * MinOperSize],  [uiPelYscan1 uiPelYscan1 + n * MinOperSize],'Color', 'g','LineWidth',1);case 4line([uiPelXscan1 uiPelXscan2], [uiPelYscan1 + n/4 * MinOperSize uiPelYscan1 + n/4 * MinOperSize ],'Color', 'g','LineWidth',1);case 5line([uiPelXscan1 uiPelXscan2], [uiPelYscan1 + n * 3/4 * MinOperSize uiPelYscan1 + n * 3/4  * MinOperSize ],'Color', 'g','LineWidth',1);case 6line([uiPelXscan1 + n/4 * MinOperSize uiPelXscan1 + n/4 * MinOperSize],  [uiPelYscan1 uiPelYscan1 + n * MinOperSize],'Color', 'g','LineWidth',1);case 7line([uiPelXscan1 + n * 3/4 * MinOperSize uiPelXscan1 + n * 3/4 * MinOperSize],  [uiPelYscan1 uiPelYscan1 + n * MinOperSize],'Color', 'g','LineWidth',1);otherwise  break;endfor m = k:k+n-1for p = l:l+n-1PUData_Blk(16*(m-1)+p,1)=0;%当前PU分割数据清零,防止多次遍历同一个PUendendl=l+n;end endendendendend
fclose(Fid_YUV);
fclose(Fid_Pu);

编译通过后,在命令窗口输入 PU_View(‘….YUV文件路径BasketballDrill_832x480_50.yuv’,’…..Pupartion文件路径Win32\Debug\PuPartion.txt’,832,480,5),5代表帧数
得到一帧最终PU分割模式图:

这里写图片描述

这篇关于MatLab画PU分割模式图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/333446

相关文章

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征

基于YOLO8的图片实例分割系统

文章目录 在线体验快速开始一、项目介绍篇1.1 YOLO81.2 ultralytics1.3 模块介绍1.3.1 scan_task1.3.2 scan_taskflow.py1.3.3 segment_app.py 二、核心代码介绍篇2.1 segment_app.py2.2 scan_taskflow.py 三、结语 代码资源:计算机视觉领域YOLO8技术的图片实例分割实

MATLAB的fix(),floor()和ceil()函数的区别与联系

fix(x),floor(x)和ceil(x)函数都是对x取整,只不过取整方向不同而已。 这里的方向是以x轴作为横坐标来看的,向右就是朝着正轴方向,向左就是朝着负轴方向。 fix(x):向0取整(也可以理解为向中间取整) floor(x):向左取整 ceil(x):向右取整 举例: 4个数:a=3.3、b=3.7、c=-3.3、d=-3.7 fix(a)=3 fl