我得到了一个.bin文件。我知道这个文件中的元素对应于YCbCr值(4:2:2)。此外,数据类型为8位。如何查看此内容?
我发现了一个很好的网站:http://rawpixels.net/,它做了除了YUV格式之外应该做的事情。我想要YCbCr格式。
Priliminary google search会将其转换为RGB,这并不是我们所希望的。我在dropbox上附上了一个示例.bin文件。图像大小为720X576。
发布于 2016-02-09 18:27:52
Y‘YCbCr经常与YUV颜色空间混淆,通常术语YCbCr和YUV可以互换使用,导致一些混淆;当提到视频或数字形式的信号时,术语"YUV“通常表示”Y’YCbCr“。
如果您使用的是基于linux的系统,并且可以访问ffmpeg,则以下命令会正确显示数据
ffplay -f rawvideo -video_size 720x576 -pix_fmt yuyv422 38.bin

另一个显示RGB/YCbCr图像的好工具是vooya,它在linux上是免费的,但在windows上是免费的。
我自己的工具yuv-viewer也能正常工作。
希望这能有所帮助。
发布于 2016-02-09 19:27:25
您可以对4:2:2下采样的色度进行上采样,如下所示:
////////////////////////////////////////////////////////////////////////////////
// unpack.c
// Mark Setchell
//
// Convert YCbCr 4:2:2 format file to full YCbCr without chroma subsampling
//
// Compile with:
// gcc -o unpack unpack.c
// Run with:
// ./unpack < input.bin > output.bin
////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <sys/uio.h>
#include <unistd.h>
#include <sys/types.h>
int main(){
unsigned char ibuf[4]; // Input data buffer format: Y Cb Y Cr
unsigned char obuf[6]; // Output data buffer format: Y Cb Cr Y Cb Cr
// Read 4 bytes at a time, and upsample chroma
while(fread(ibuf,4,1,stdin)==1){
obuf[0]=ibuf[0];
obuf[1]=ibuf[1];
obuf[2]=ibuf[3];
obuf[3]=ibuf[2];
obuf[4]=ibuf[1];
obuf[5]=ibuf[3];
fwrite(obuf,6,1,stdout);
}
return 0;
}然后,您将对up-sample运行此命令:
./unpack < input.bin > output.bin然后使用ImageMagick convert获得如下格式的PNG (或JPEG,或TIF):
convert -size 720x576 -depth 8 yuv:result.bin image.png

从理论上讲,ImageMagick应该能够使用这样的命令行自己进行上采样(而不需要C程序),但我似乎不能让它工作:
convert -interlace none -sampling-factor 4:2:2 -size 720x576 -depth 8 yuv:input.bin image.jpg如果有人知道为什么-请评论!
发布于 2016-02-10 02:49:05
这是我的另一个答案的一个稍微不同的版本,因为它对色度进行了上采样,并将YUV转换为RGB,然后创建了一个NetPBM PNM格式文件。这意味着您只需从NetPBM安装pnmtopng实用程序即可获得PNM映像- NetPBM比ImageMagick更轻便,安装也更简单。
////////////////////////////////////////////////////////////////////////////////
// yuv2pnm.c
// Mark Setchell
//
// Convert YUV 4:2:2 format file to RGB PNM format without chroma subsampling
//
// Compile with:
// gcc -o yuv2pnm yuv2pnm.c
//
// Run with:
// ./yuv2pnm < input.bin > output.pnm
//
// and then use ImageMagick to go to PNG format, or JPEG or TIF, with
//
// convert output.pnm image.png
//
// or, all in one line (still with ImageMagick) to JPEG:
//
// ./yuv2pnm < input.bin | convert pnm:- image.jpg
//
// or, use the (simpler-to-install) NetPBM's "pnmtopng" to convert to a PNG file
//
// ./yuv2pnm < input.bin | pnmtopng - > image.png
////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#define MIN(a,b) (a<b) ? a : b
void YUV2RGB(unsigned char Y,unsigned char U, unsigned char V,unsigned char *RGB)
{
int R,G,B;
R = Y + (1.370705 * (V-128));
G = Y - (0.698001 * (V-128)) - (0.337633 * (U-128));
B = Y + (1.732446 * (U-128));
RGB[0] = MIN(255,R);
RGB[1] = MIN(255,G);
RGB[2] = MIN(255,B);
}
int main(int argc,char* argv[]){
unsigned char buf[4]; // Input data buffer format: Y Cb Y Cr
unsigned char RGB[6]; // Output data buffer format: R G B R G B
int width=720;
int height=576;
// Write PNM header
fprintf(stdout,"P6\n");
fprintf(stdout,"%d %d\n",width,height);
fprintf(stdout,"255\n");
// Read 4 bytes at a time, upsample chroma and convert to 2 RGB pixels
while(fread(buf,4,1,stdin)==1){
YUV2RGB(buf[0],buf[1],buf[3],&RGB[0]);
YUV2RGB(buf[2],buf[1],buf[3],&RGB[3]);
fwrite(RGB,6,1,stdout);
}
return 0;
}here描述了NetPBM格式。注意:PNM是包含PPM的缩写。
https://stackoverflow.com/questions/35288494
复制相似问题