YUV图片处理(2)——像素去除颜色

一、这里先解决一下上一篇博文的问题

https://editor.csdn.net/md/?articleId=117398429

颜色不对,是因为我没有选对格式,因为是Y所以需要选择Y
在这里插入图片描述U和V分量不对是因为在YUV里面,U和V一共才占比Y的1/2,所以我们这里需要改变分辨率。而不是用1920x1080的分辨率。但是对应的960x540对的分辨率是没有的,所以我换了一张分辨率的图
这里换成1280x720的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里就没啥问题了啊
附上代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int testYUV420(char* fileName, int width, int hight)
{
	FILE* fp;
	FILE* fp1;
	FILE* fp2;
	FILE* fp3;
	char* readBuf;
	readBuf = malloc(width * hight * 3/2);
	fp = fopen(fileName,"r+" );
	fp1 = fopen("girl_1.y","w+");
	fp2 = fopen("girl_1.u", "w+");
	fp3 = fopen("girl_1.v", "w+");

	//读取YUV文件
	fread(readBuf,1, width * hight * 3 / 2,fp);

	//写入到新的YUV.的Y图片中
	fwrite(readBuf,1, width * hight , fp1);
	//写入到新的YUV.的U图片中
	fwrite(readBuf+ width * hight, 1, width * hight/4, fp2);
	//写入到新的YUV.的V图片中
	fwrite(readBuf + width * hight * 5/4, 1, width * hight / 4, fp3);

	//释放空间
	free(readBuf);
	fclose(fp);
	fclose(fp1);
	fclose(fp2);
	fclose(fp3);
}

int main()
{
	testYUV420("girl_1.yuv",1280,720);
	return 0;
}

YUV444的分离方式一样,只要改改写入新的YUV中的width和hight,因为YUV444之中YUV的占比不一样。

YUV444分离改变地方

fwrite(readBuf,1, width * hight , fp1);
	//写入到新的YUV.的U图片中
	fwrite(readBuf+ width * hight, 1, width * high, fp2);
	//写入到新的YUV.的V图片中
	fwrite(readBuf + width * hight * 2, 1, width * hight , fp3);

二、去除颜色

刚才我们是将YUV三种分离,我们只能通过用Y来显示图片,如果用YUV420格式的话,我们看到的颜色是不对得到,就是上一篇博文那种。或则直接黑色。
因为YUV的偏置原理我们只需要将U和V数据改为128就可以了(上一篇文章的补充有讲,或者直接去C一下就好)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define outPutFileName "girl_2.yuv"

int Yuv420(char *fileName, int width, int height)
{
    FILE *fp;
    FILE *fp1;
    unsigned char *readBuf;
    readBuf = (unsigned char *)malloc(width*height*3/2);
    fp = fopen(fileName, "rb+");
    fp1 = fopen(outPutFileName, "wb+");

    //读取YUV文件
    fread(readBuf, 1, width*height, fp);

    //将UV初始化为128
    memset(readBuf+width*height, 128, width*height/2);

    写入到新的YUV
    fwrite(readBuf, 1, width*height*3/2, fp1);

    free(readBuf);
    fclose(fp);
    fclose(fp1);
    return 0;
}

int main()
{
    Yuv420("girl_1.yuv", 1280, 720);
    return 0;
}

在这里插入图片描述这里选择YUV420依旧显示黑白。

三、图片改变亮度

只需要将每个像素的Y的值减半就行了

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define outPutFileName "girl_3.yuv"

int Yuv420(char *fileName, int width, int height)
{
    FILE *fp;
    FILE *fp1;
    unsigned char *readBuf;
    unsigned char *point;
    readBuf = (unsigned char *)malloc(width*height*3/2);
    point = readBuf;
    fp = fopen(fileName, "rb+");
    fp1 = fopen(outPutFileName, "wb+");

    //读取YUV文件
    fread(readBuf, 1, width*height, fp);

    //亮度减半
    for(int i = 0; i < width*height; i++)
    {
	//对 point的值进行减半处理
    	*point = *point/2;
    	point++;
    }
    //写入到新的YUV
    fwrite(readBuf, 1, width*height*3/2, fp1);

    free(readBuf);
    fclose(fp);
    fclose(fp1);
    return 0;

 
}

int main()
{
    Yuv420("girl_1.yuv", 1280, 720);
    return 0;
}

在这里插入图片描述。。我不知道在这儿是什么情况。感觉代码也没啥问题啊。

在这里插入图片描述
单独的用Y显示可以看出来,亮度变低了难道我的U和V是改变了??后面还要在研究研究。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永不秃头的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值