Professional Documents
Culture Documents
Propsito
El propsito de este programa es demostrar cmo leer un flujo de bytes
digitales YV-12 o YVU-9 y visualizar la imagen en color RGB
correspondiente.
Materiales y equipamiento
Requisitos de software
de Windows 95/98
Delphi 3/4/5 (recompilar)
YVUtoRGBDemo.EXE con archivos de entrada YVU12.Stream y YVU9.Stream
Requisitos de hardware
VGA (o superior) de monitor en color de alta o el modo de pantalla en color
verdadero.
Procedimiento
Discusin
de color YUV se utiliza en las transmisiones de televisin europeas. (YIQ se
utiliza en emisiones de televisin en Estados Unidos.) El componente Y de
YUV no es "amarilla", pero la luminancia. Slo el componente Y de una seal
de televisin en color se muestra en los televisores en blanco y negro. La
informacin de cromaticidad se codifica en los componentes U y V.
En lugar de almacenar una imagen como 8 bits de rojo, 8 bits de verde y 8 bits
de azul por pixel, una imagen en color RGB se puede reducir a 16 bits por
pxel por la conversin a la luminancia y el color diferencias:
YV-12
Y V T
YVU-9
Y V T
Entender el formato de una secuencia de vdeo digital es esencial en el
procesamiento de una imagen. La determinacin de las dimensiones X e Y de
una imagen en un archivo es el primer paso. En este caso, se me dio el tamao
de cada imagen.
CONST
YRowCount = 288;
YColumnCount = 352;
Seccin
ndice de primer byte columnas filas
archivo
Y 0 YColumnCount YRowCount
YColumnCount * YColumnCount / YRowCount /
V
YRowCount Factor Factor
YColumnCount *
YColumnCount / YRowCount /
T YRowCount *
Factor Factor
(1 + 1 / Factor 2 )
Para j: = 0 A YRowCount-1 NO
COMENZAR
// Lea cada "fila" de datos
StreamY.Read (Buffery, YColumnCount {bytes});
FIN;
FIN
FIN;
El "convertir de YUV a RGB para cada pxel" seccin mostrada arriba es una
sentencia CASE en el programa actual para seleccionar las imgenes Y, U, V
o RGB (basado en el RadioGroupYVURGBcontrol). Las imgenes Y, U, V
son tonos de gris ya que los valores correspondientes son asignados a cada
uno de los R, G y los componentes B de pxel. Por ejemplo, la imagen Y se
crea en este caso:
CASO RadioGroupYVURGB.ItemIndex DE
// Y plano
0: BEGIN
rgbtBlue: = Y;
rgbtGreen: = Y;
rgbtRed: = Y
FIN;
...
RESULTADO: = temp
FIN;
Conclusiones
Los seres humanos pueden discriminar la informacin monocroma espacial
mejor que la informacin de color espacial. Por lo tanto, ms bits se utilizan
para almacenar informacin Y puesto que el ojo humano es ms sensible a los
cambios en luminancia que los cambios en el matiz o saturacin, que se
comunica en los componentes U y V.
Palabras clave
YUV, RGB, YVU-9, YV-12, Scanline, TRGBTripleArray, TFileStream, la
bsqueda, SaveToFile
Archivos de
Delphi 3/4/5 Cdigo Fuente y EXE
con YUV9.Stream y YUV12.Stream archivos (319 KB): YVUtoRGB.ZIP
UYVY a RGB
Propsito
El propsito de este programa es para leer una secuencia de bytes UYVY y
convertir los valores YUV a RGB para la visualizacin.
Materiales y equipamiento
Requisitos de software
de Windows 95/98
Delphi 3/4/5 (recompilar)
UYVY.EXE con archivo de entrada UYVY.Stream
Requisitos de hardware
VGA (o superior) de monitor en color de alta o el modo de pantalla en color
verdadero.
Procedimiento
Discusin
Un grupo formato comn YUV se llama el grupo de formatos de empacado
donde las muestras Y, U y V se embalan juntos en macropixels, que se
almacenan en una sola matriz. (Vase la YVU-9 y YV-12Informe de
Laboratorio de arriba para un ejemplo de estructura plana.) Uno de estos
formatos de envasado se UYVY, que es probablemente el ms popular de los
diversos YUV 4: 2: 2 formatos.
CONST
YUVwidth = 386;
YUVheight = 320;
(Acutally, la imagen original era 720 por 576. Este ejemplo es un subconjunto
de la original).
Cada fila de datos es una matriz de valores UYVY, donde cada valor de Y, U,
V es un solo byte. El BufferYUV matriz contiene el conjunto de registros.
TIPO
TYUVWord = // una "palabra" es siempre 2 bytes en todas las
versiones de Delphi
RECORD
UV: BYTE; // T si el ndice de la tarde; V si el ndice impar
Y: BYTE; // Y para todos los elementos de matriz
FIN;
...
VAR
BitmapRGB: TBitmap;
BufferYUV: ARRAY [0..YUVwidth-1] DE TYUVWord;
TIPO
...
TRGBTripleArray = ARRAY [0..YUVwidth-1] DE TRGBTriple;
pRGBTripleArray = ^ TRGBTripleArray;
VAR
BitmapRGB: TBitmap;
...
i: Integer;
j: entero;
Fila: pRGBTripleArray;
StreamYUV: TFileStream;
T: Integer;
V: INTEGER;
Y: INTEGER;
comenzar
StreamYUV: = TFileStream.Create ( 'UYVY.Stream', fmOpenRead);
TRY
BitmapRGB: = TBitmap.Create;
TRY
BitmapRGB.PixelFormat: = pf24Bit;
BitmapRGB.Width: = YUVwidth;
BitmapRGB.Height: = YUVheight;
Para j: = 0 A YUVheight-1 DO
COMENZAR
StreamYUV.Read (BufferYUV, sizeof (BufferYUV));
Row: = BitmapRGB.Scanline [j];
FOR i: = 0 A YUVwidth-1 NO
COMENZAR
IF i MOD 2 = 0 // Incluso
luego comenzar
Y: = BufferYUV [i] .Y;
U: = BufferYUV [i] .UV;
V: = BufferYUV [i + 1] .UV // obtener V de siguiente
palabra
FIN
ELSE begin // Odd
Y: = BufferYUV [i] .Y;
U: = BufferYUV [i-1] .UV; // obtener U desde ltima
palabra
V: = BufferYUV [i] .UV
FIN;
FIN;
BitmapRGB.SaveToFile ( 'UYVY.BMP');
ImageYUV.Picture.Graphic: = BitmapRGB
FINALMENTE
BitmapRGB.Free
FIN
LTIMO
StreamYUV.Free
FIN
extremo;
Acuse de recibo
Gracias a Daniel Halan de Suecia por proporcionarme esta imagen y preguntar
cmo podra ser procesado.
Conclusiones
Un flujo de bytes con valores UYVY se pueden convertir fcilmente a los
pxeles RGB para la visualizacin.
Palabras clave
YUV, UYVY, RGB, TYUVWord, TFileStream, Scanline, TRGBTripleArray
Archivos de
Delphi 3/4/5 Fuente y EXE con UYVY.Stream archivo (259 KB): UYVY.ZIP
Escala de grises Y8
Propsito
El propsito de este programa es para leer una secuencia de bytes y mostrar la
informacin de una imagen de escala de grises como. Ambos se presentan
soluciones de paleta y no la paleta.
Materiales y equipamiento
Requisitos de software
de Windows 95/98
Delphi 3/4/5 (recompilar)
DeutschGray.EXE con archivo de entrada Gray.Stream
Requisitos de hardware
VGA (o superior) de monitor en color de alta o el modo de pantalla en color
verdadero.
Procedimiento
Discusin
Entender el formato de una secuencia de vdeo digital es esencial en el
procesamiento de una imagen. La determinacin de las dimensiones X e Y de
una imagen en un archivo es el primer paso. En este caso, he determinado el
tamao de la imagen a partir de la informacin que me ha sido dado, y por la
inspeccin visual de un volcado hexadecimal de los bytes de imagen.
CONST
BildWidth = 392;
BildHeight = 250;
(En realidad, esta imagen es una pequea parte de la imagen original. Esto es
para reducir el tamao del archivo de descarga.)
Creacin de una imagen 256 tonos de gris utilizando un TBitmap pf24bit (para
su visualizacin en color de alta densidad o modo de color verdadero) es
bastante sencillo. Trabajar con un pf24bit mapa de bits requiere el uso de
un pRGBTripleArray para acceder a cada pxel en una lnea de escaneo de
fila :
TRY
Bitmap: = TBitmap.Create;
TRY
Bitmap.PixelFormat: = pf24bit; // evitar paletas
Bitmap.Width: = BildWidth;
Bitmap.Height: = BildHeight;
TRY
para j: = 0 A BildHeight-1 NO
COMENZAR
GrayStream.Read (GrayBuffer ^, BildWidth);
FIN;
// La imagen en pantalla (o guardar en el archivo aqu)
Image.Picture.Graphic: = mapa de bits;
FINALMENTE
GrayStream.Free;
FIN
LTIMO
Bitmap.Free
FIN
LTIMO
FreeMem (GrayBuffer)
FIN
extremo;
VAR
k: INTEGER;
LookupTable: ARRAY [0..255] OF BYTE;
...
limitacin paleta de Windows para la visualizacin de 256 colores. La
gama completa
// 0..255 se puede utilizar si se utilizan slo de alta color o
pantalla a color verdadero.
// tabla de bsqueda para asignar los valores de la escala de grises
de 0 a 255 a
// 10 a 245. Esto se salta los primeros 10 y los ltimos 10 ranuras
paleta,
// que contienen los colores de las ventanas fijas.
Para k: = 0 a 255 DO
COMENZAR
LookupTable [k]: = 10 + MulDiv (k, 235, 255)
finales;
FIN {DefineShadesOfGrayPalette};
VAR
mapa de bits: TBitmap;
GrayBuffer: pByteArray; // ARRAY [0..BildWidth-1] DE BYTE;
GrayStream: TFileStream;
i: INTEGER;
j: entero;
k: INTEGER;
LookupTable: ARRAY [0..255] OF BYTE;
Fila: pByteArray;
...
// Asignar memoria intermedia para leer archivo de imagen
GetMem (GrayBuffer, BildWidth);
TRY
Bitmap: = TBitmap.Create;
TRY
Bitmap.PixelFormat: = pf8bit;
Bitmap.Width: = BildWidth;
Bitmap.Height: = BildHeight;
Bitmap.Palette: = DefineShadesOfGrayPalette;
FIN;
// La imagen en pantalla
Image.Picture.Graphic: = mapa de bits;
FINALMENTE
GrayStream.Free
FIN
LTIMO
Bitmap.Free
FIN
LTIMO
FreeMem (GrayBuffer)
...
Este ejemplo slo involucra a 182 tonos de gris, por lo que la limitacin de
236 colores en la paleta de un nico Windows no afecta a la imagen mucho.
Acuse de recibo
Gracias a Sebastian Grabert de Alemania por proporcionarme esta imagen y
preguntar cmo podra ser procesado.
Conclusiones
Dado un flujo de bytes que representa la imagen tonos de gris de 0 a 255, la
pantalla es fcil con un pf24bit mapa de bits en color de alta densidad o el
modo de pantalla en color verdadero, sino que requiere codificacin adicional
considerable para la pantalla en el modo de 256 colores con una pf8bit mapa
de bits.
Palabras clave
Escala de Grises, Y8, pRGBTripleArray, pByteArray, TFileStream, Scanline,
TMaxLogPalette, GetSystemPaletteEntries, bsqueda en la tabla
Archivos de
Delphi 3/4/5 Cdigo Fuente y EXE con el archivo de datos Gray.Stream (187
KB): DeutschGray.ZIP
Propsito
El propsito de este programa es demostrar cmo mostrar el archivo 411 se
utiliza con una cmara Sony Mavica.
Materiales y equipamiento
Requisitos de software
de Windows 95/98
Delphi 3/4/5 (compilar)
el cdigo fuente C411toBMP
Archivo de muestra 411
Requisitos de hardware
del monitor VGA en color de alta densidad o el modo de pantalla a color
verdadero.
Procedimiento
Discusin
El flujo de bytes para una imagen de la 411 consiste en grupos de seis bytes:
Y0 Y1 Y2 Y3 Cb Cr. Cada grupo de seis bytes se convierte en
cuatro TRGBTriples en un pf24bit Scanline como sigue:
USOS
FileCtrl; // El archivo existe
// versin Delphi de programa C originalmente
// encontrado en www.hamrick.com/mavica/4112bmp.txt
FUNCIN Convert411ToBMP (CONST nombre de archivo: STRING): TBitmap;
TIPO
TYCbCr =
GRABAR
Y: ARRAY [0..3] OF BYTE;
Cb: BYTE;
Cr: BYTE
FIN;
TRGBTripleArray = ARRAY [WORD] DE TRGBTriple;
pRGBTripleArray = ^ TRGBTripleArray;
CONST
Anchura = 64; // cableado para 411 archivos
Altura = 48;
VAR
Cb, Cr: INTEGER;
Apuntador de archivo: Integer;
FileStream: TFileStream;
i, j, k: INTEGER;
R, G, B: INTEGER;
Fila: pRGBTripleArray;
YCbCr: TYCbCr;
EMPEZAR
RESULTADO: = TBitmap.Create;
RESULT.PixelFormat: = pf24bit;
RESULT.Width: = Anchura;
RESULT.Height: = Altura;
RESULT.Canvas.FillRect (RESULT.Canvas.ClipRect);
// Si el archivo no existe, se devolver un mapa de bits blanco
SI FileExists (filename)
luego comenzar
FileStream: = TFileStream.Create (nombre de archivo, fmOpenRead +
fmShareDenyNone);
TRATAR
Apuntador de archivo: = 0;
FileStream.Seek (apuntador de archivo, soFromBeginning);
// 6 bytes en 411 archivo para cada 4 pxeles: Y0 Y1 Y2 Y3 Cb Cr
Para j: = 0 A RESULT.Height-1 DO
EMPEZAR
Row: = RESULT.Scanline [j];
FOR i: = 0 TO (RESULT.WIDTH DIV 4) -1 DO
EMPEZAR
FileStream.Read (YCbCr, sizeof (TYCbCr));
Cb: = YCbCr.Cb - 128;
Cr: = YCbCr.Cr - 128;
Para k: = 0 a 3 DO
EMPEZAR
R: = YCbCr.Y [k] + redondo (1,40200 * Cr);
G: = YCbCr.Y [k] - ROUND (0,34414 * Cb + 0,71414 * Cr);
B: = YCbCr.Y [k] + ROUND (1,77200 * Cb);
Si R> 255
Entonces R: = 255
MS
Si R <0
Entonces R: = 0;
Si G> 255
Entonces G: = 255
MS
Si G <0
Entonces G: = 0;
Si B> 255
Entonces B: = 255
MS
Si B <0
Entonces B: = 0;
fila [4 * i + k] .rgbtRed: = R;
fila [4 * i + k] .rgbtGreen: = G;
fila [4 * i + k] .rgbtBlue: = B
FIN
FIN
FIN
FINALMENTE
FileStream.Free
FIN
FIN
FIN {Convert411toBMP};
Acuse de recibo
Gracias a Peter Mora en la imagen de muestra y preguntar sobre la
conversin.
Conclusiones
Ahora slo necesitan una cmara Sony Mavica!
Palabras clave
411, TBitmap, YUV, TRGBTripleArray, TFileStream
Archivos de
Delphi 3/4/5 Cdigo Fuente y archivo de ejemplo 411: 411.ZIP
Campo de golf
YCC espacio de color y compresin de imgenes
http://astronomy.swin.edu.au/~pbourke/colour/ycc