当前位置: 首页 > news >正文

专业做网站的顺德公司平面设计正规培训机构

专业做网站的顺德公司,平面设计正规培训机构,一起做网站下载数据包,营销 网站制作图像处理 文章目录 图像处理前言一、RGB格式二、YUV格式三、RGB与YUV转换四、NV21转换为YUV420p五、YUV旋转 前言 在图像的世界里,一般使用RGB作为存储格式。而在视频的世界里,一般使用YUV作为压缩存储格式。有时候面试官会问:为什么视频使用…

图像处理


文章目录

  • 图像处理
  • 前言
  • 一、RGB格式
  • 二、YUV格式
  • 三、RGB与YUV转换
  • 四、NV21转换为YUV420p
  • 五、YUV旋转


前言

在图像的世界里,一般使用RGB作为存储格式。而在视频的世界里,一般使用YUV作为压缩存储格式。有时候面试官会问:为什么视频使用YUV来压缩存储,而不用RGB?YUV与RGB有什么区别,两者如何转换的?常见的RGB格式有哪些,常见的YUV格式又有哪些?手机摄像头的预览格式是什么,如何转换为YUV420P的?我们带着这些问题,来揭开RGB与YUV格式的面纱。

一、RGB格式

RGB是一种图像存储格式,也是三原色,取值范围[0, 255]。R代表Red红色,G代表Green绿色,B代表Blue蓝色。在openCV中,一般使用BGR格式。在图像中,一般使用32位色的ARGB(或RGBA)代表一个像素,其中A代表Alpha透明度。常见的RGB格式有RGB888、RGBA8888、RGB565等。

1、RGBA8888
关于RGBA8888格式,每个通道占8位,即一个字节。四个通道构成一个像素,总共占32位。排列顺序如下图所示:
在这里插入图片描述
2、RGB565
关于RGB565格式,其中R占5位,G占6位,B占5位。三个通道构成一个像素,总共占16位。排列顺序如下图所示:
在这里插入图片描述
3、图像的像素阵列
一张图像由宽x高的像素阵列构成,为了内存对齐,会使用stride来填充。如下图所示,由4x3构成的像素阵列,其中P代表pixel:
在这里插入图片描述

二、YUV格式

YUV是一种视频压缩存储格式。其中Y代表Luma亮度,U代表Chroma色度,V代表Contrast对比度。常见的YUV采样比例如下:

4:4:4 表示完全采样
4:2:2 表示水平2:1采样,垂直完全采样
4:2:0 表示水平2:1采样,垂直2:1采样
4:1:1 表示水平4:1采样,垂直完全采样

常见的YUV格式有:YUV420p、YUV420sp、NV21等。由于U和V分量都是Y分量的1/4,而RGB888的所有分量占比都是1。进一步可得,YUV整体占比是3/2,RGB整体占比是6/2,YUV所占存储空间比RGB少了3/2。因此,默认采用YUV作为视频压缩存储格式。
1、YUV420p
YUV420p属于平面存储,YUV分量占比为4:1:1,即每4个Y共享一组UV。先是Y分量,然后是U分量,最后是V分量。排列如下图所示:
在这里插入图片描述
2、YUV420sp
YUV420sp属于交错存储,YUV分量占比为4:1:1,即每4个Y共享一组UV。先是Y分量,然后是UV分量交错存储。排列如下图所示:

在这里插入图片描述
3、NV21
NV21属于交错存储,YUV分量占比为4:1:1,即每4个Y共享一组UV。Android手机摄像头预览数据默认是NV21格式。和YUV420sp的区别是,NV21是VUVU这样排列,如下图所示:
在这里插入图片描述

三、RGB与YUV转换

关于YUV与RGB的转换公式,可
参考ITU标准:https://www.itu.int/rec/R-REC-BT.601。
也可以,
参考维基百科:https://zh.wikipedia.org/wiki/YUV。
咱们来看下转换公式:
在这里插入图片描述
以rgb转yuv为例,示例代码如下:

void rgb_to_yuv(int8_t *yuv, int *rgb, int width, int height) {int rgbIndex = 0;int yIndex = 0;int uIndex = width * height;int vIndex = width * height * 5 / 4;int R, G, B;float Y, U, V;// 遍历图像,获取所有像素点 for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {// 从像素点获取R、G、B分量R = (rgb[rgbIndex] & 0xFF0000) >> 16;G = (rgb[rgbIndex] & 0xFF00) >> 8;B = (rgb[rgbIndex] & 0xFF);// 使用公式把RGB转成YUVY = 0.299 * R + 0.587 * G + 0.114 * B;U = -0.147 * R - 0.289 * G + 0.436 * B;V = 0.615 * R - 0.515 * G - 0.100 * B;// YUV分量赋值给yuv数组yuv[yIndex++] = (int8_t)Y;if (i % 2 == 0 && j % 2 == 0) {yuv[uIndex++] = (int8_t) U;yuv[vIndex++] = (int8_t) V;}rgbIndex++;}} 
}

四、NV21转换为YUV420p

由于NV21是交错存储,4个Y共享一组UV,而且是VUVU这样排列。所以,我们需要把偶数的V分量、奇数的U分量读出来,然后赋值给YUV420p。代码如下:

static void nv21_to_yuv420p(int8_t *dst, int8_t *src, int len) {memcpy(dst, src, len); // yfor (int i = 0; i < len / 4; ++i) {*(dst + len + i) = *(src + len + i * 2 + 1);  // u*(dst + len * 5 / 4 + i) = *(src + len + i * 2); // v}
}

五、YUV旋转

YUV的存储是有旋转角度的存在。在手机拍摄时,按照逆时针来看,横屏向左是0度,竖屏向下是90度,横屏向右是180度,竖屏向上是270度。既然有旋转角度,我们就需要对YUV进行旋转处理,代码如下:

static void yuv420p_rotate90(int8_t *dst, const int8_t *src, int width, int height) {int n = 0;int wh = width * height;int half_width = width / 2;int half_height = height / 2;// yfor (int j = 0; j < width; j++) {for (int i = height - 1; i >= 0; i--) {dst[n++] = src[width * i + j];}}// ufor (int i = 0; i < half_width; i++) {for (int j = 1; j <= half_height; j++) {dst[n++] = src[wh + ((half_height - j) * half_width + i)];}}// vfor (int i = 0; i < half_width; i++) {for (int j = 1; j <= half_height; j++) {dst[n++] = src[wh + wh / 4 + ((half_height - j) * half_width + i)];}}
}static void yuv420p_rotate180(int8_t *dst, const int8_t *src, int width, int height) {int n = 0;int half_width = width / 2;int half_height = height / 2;// yfor (int j = height - 1; j >= 0; j--) {for (int i = width; i > 0; i--) {dst[n++] = src[width * j + i - 1];}}// uint offset = width * height;for (int j = half_height - 1; j >= 0; j--) {for (int i = half_width; i > 0; i--) {dst[n++] = src[offset + half_width * j + i - 1];}}// voffset += half_width * half_height;for (int j = half_height - 1; j >= 0; j--) {for (int i = half_width; i > 0; i--) {dst[n++] = src[offset + half_width * j + i - 1];}}
}static void yuv420p_rotate270(int8_t *dst, const int8_t *src, int width, int height) {for (int j = 0; j < width; j++) {for (int i = 1; i <= height; i++) {*dst++ = *(src + i * width - j);}}auto *src_u = const_cast<int8_t *>(src + width * height);for (int j = 0; j < width / 2; j++) {for (int i = 1; i <= height / 2; i++) {*dst++ = *(src_u + i * width / 2 - j);}}auto *src_v = const_cast<int8_t *>(src + width * height * 5 / 4);for (int j = 0; j < width / 2; j++) {for (int i = 1; i <= height / 2; i++) {*dst++ = *(src_v + i * width / 2 - j);}}
}static void yuv420p_rotate(int8_t *dst, int8_t *src, int width, int height, int degree) {switch(degree) {case 0:memcpy(dst, src, width * height * 3 / 2);break;case 90:yuv420p_rotate90(dst, src, width, height);break;case 180:yuv420p_rotate180(dst, src, width, height);break;case 270:yuv420p_rotate270(dst, src, width, height);break;default:break;}
}
http://www.shuangfujiaoyu.com/news/33480.html

相关文章:

  • 网站开发对比特点如何做关键词优化
  • 日本设计网站有哪些优化seo教程
  • 房地产网站建设解决方案关键词推广方法
  • 国外做logo的网站搜索引擎推广与优化
  • dedecms如何做音乐网站网络营销知识点
  • 单页网站在线生成网络营销的主要内容包括
  • 网站定制开发优点百度搜索网站
  • 建网站 西安优化是什么意思?
  • 网站建设好公司方象科技的服务范围
  • 网页设计入门与应用seo营销怎么做
  • 北京市住房和城乡建设委员会门户网站做引流的公司是正规的吗
  • 旅游在线网站开发网站的收录情况怎么查
  • 外贸独立站saas建站怎样免费建立自己的网站
  • 微信公众号h5商城网站开发重庆seo教程搜索引擎优化
  • iis 发布asp网站百度个人中心登录
  • 关于公司网站建设的申请2022今日最新军事新闻
  • 网站建设用途百度权重工具
  • 做外贸网站报价福州seo按天收费
  • 广渠门网站建设竞价排名是什么意思
  • 沈阳.....网站设计网络推广网站推广
  • wordpress站内seo宁波免费seo排名优化
  • 代码优化seo范畴有哪些
  • 如何让网站打不开 解析推广有奖励的app平台
  • 中文个人网站欣赏平台推广怎么做
  • wordpress仿微信菜单栏安卓手机优化大师官方下载
  • wordpress 更换域名搜索引擎优化宝典
  • 贸易网站建设案例百度竞价排名又叫
  • wordpress插件证书认证网站网络营销师证书有用吗
  • 网站群管理平台方案百度官方电话24小时
  • 承德信息港优化设计三年级下册数学答案