Imagem Digital • • • • • • Paradigma dos 4 Universos Imagem no Universo Matemático Imagem no Universo de Representação (Universo Discreto) • Amostragem • Quantização Imagem no Universo de Codificação: • Palette de cores • RGBRGB • RRGGBB • Compressão • formato PPM • formato BMP • Biblioteca IM Processamento de Imagens • Ampliar e Reduzir • Realçar e Borrar • Combinação de Imagens • Mistura • Transparência • Adição e Subtração • Morphing Outros Assuntos • Dithering • Sprites • Animações (?) Paradigma dos 4 Universos Exemplo: VOZ HUMANA Universo Físico Universo Matemático Universo de Representação Discretização (Amostragem) 8 Universo de Implementação 9 8 7 8 9 7 8 9 9 7 8 Representação (Vetor) 8 9 8 7 8 9 7 8 9 9 7 8 Paradigma dos 4 Universos COR IMAGEM Universo Físico Cores no Universo Físico Imagens no Universo Físico Universo Matemático Modelos Matemáticos de Cor (Espaço) Funções no Espaço de Cor Universo de Representação Representação de Cor Amostragem e Quantização Universo de Implementação Especificação de Cor Codificação e Formatos Imagens como Funções • Uma linha de uma imagem PB: Domínio 1D • Uma imagem PB: Domínio 2D • Uma imagem Colorida: Domínio 3D (?) Amostragem • Discretização espacial • Resolução (XxY pixels) Quantização • Discretização no espaço de cores (redução das cores usadas) • Critérios para escolha das cores (exemplos em 256 cores): • Quantização Uniforme (256 cores) • Algoritmo de Populosidade (16 cores) • Quantização por Aglumeração (16 cores) Imagem Original (24 bits) Digitalização de Imagens quantização 64x53 – 256 cores 315x260 – 256 cores 15 15 15 15 15 15 15 15 10 12 13 5 15 15 15 15 10 09 11 15 15 15 15 13 12 10 15 15 15 15 08 06 12 15 15 15 15 15 15 15 15 15 amostragem 64x53 - 16 cores codificação Codificação • Imagem no Universo de Codificação: • Palette de cores • RGBRGB • RRGGBB • Compressão • formato PPM • formato BMP • Biblioteca IM Obs: Imagens em formato raster (não vetorias) Palette de Cores • Geralmente com 256, 16 ou 4 cores Red Green Blue 255 0 0 180 148 149 132 123 125 Os pixels da imagem fazem referência aos índices da Palette 202 99 143 15 15 15 15 15 15 15 198 71 163 88 43 45 15 10 12 13 5 15 15 8 8 175 15 15 10 09 11 15 15 105 109 105 15 15 13 12 10 15 15 124 124 116 15 15 08 06 12 15 15 179 173 159 214 193 165 15 15 15 15 15 15 15 231 214 198 247 231 222 198 148 132 65 36 31 206 206 206 Palette RRGGBB Plano de Cores Azul Verde Verm. 06 Informação é uma componente da cor 06 07 08 09 ... 00 01 02 03 04 05 06 Organização dos pixels de uma imagem por planos de cores RRGGBB • Declaração em C das matrizes R, G e B de uma imagem colorida com resolução 200x300? • Qual o tipo a ser usado? • int, float, char, double ou void ? • short ou long ? • unsigned ? unsigned char R[60000], G[60000], B[60000]; • Atenção! Normalmente são ponteiros cujo espaço são alocados dinamicamente (malloc). RGBRGB 0 0 1 2 3 ... h-1 1 2 00 01 02 03 04 05 06 07 08 ... w-1 09 10 11 12 13 14 15 16 17 18 ... y Pixel (x,y) de uma imagem WxH offset=3*(w*y+x); red = rgb_vector[offset]; green = rgb_vector[offset+1]; blue = rgb_vector[offset+2]; x Compressão de imagens Compressão de Imagens Sem Perda Preserva exatamente o conteúdo da imagem Taxas de compressão 3:1 Com Perda Preserva de forma controlada o nível de qualidade da imagem Taxas de compressão que chegam a valores de mais de 100 : 1 Métodos de compressão Sem perdas » Run length encoding (RLE) - repetição » Huffman coding - histograma » Predictive coding - diferenças » Block coding (LZW) - dicionário Com perdas » Truncation coding - reduz a representação » Predictive coding - descarta diferenças altas » Block coding - dicionário aproximado » Transform coding - descarta frequencias altas Métodos compostos: JPEG, MPEG Processo de compressão e descompressão Dados da Imagem Original Dados da Imagem Original 32, 45, 57, 68, 23, 100, 98, ... 32, 45, 57, 68, 23, 100, 98, ... Compressão da imagem Descompressão da imagem 32, 45, 57, 68, 23, 100, 98, ... Imagem Comprimida Transporte e/ou Armazenamento 32, 45, 57, 68, 23, 100, 98, ... Imagem Comprimida Compressão - RLE Objetivo Reduzir a quantidade de dados redundantes. Exemplo AAAAAAxxx 6A3x Caracterísiticas Simples e rápido, porém a eficiência depende da imagem a ser comprimida. Codificação de Huffman s p a2 0.4 a6 0.3 a1 0.1 a4 0.1 a3 0.06 a5 0.04 0.4 0.3 0.1 0.1 0.1 s probabilidade a2 0.4 1 0.4 1 a6 0.3 00 0.3 00 a1 0.1 011 0.1 011 a4 0.1 0100 0.1 0100 a3 0.06 01010 0.1 0101 a5 0.04 01011 0.4 0.3 0.2 0.1 0.4 0.3 0.3 0.4 1 0.3 00 0.2 010 0.1 011 0.6 0.4 0.4 1 0.3 00 0.3 01 0.6 0.4 0 1 Redundância de Codificação r p(r) Code 1 l(r) l(r)p(r) Code 2 l(r) l(r)p(r) 0 1/7 2/7 3/7 4/7 5/7 6/7 1 0.19 0.25 0.21 0.16 0.08 0.06 0.03 0.02 000 001 010 011 100 101 110 111 3 3 3 3 3 3 3 3 0.57 0.75 0.63 0.48 0.24 0.18 0.09 0.06 11 01 10 001 0001 00001 000001 000000 2 2 2 3 4 5 6 6 0.38 0.50 0.42 0.48 0.32 0.30 0.18 0.12 Lavg= 2.70 1.00 Lavg= 3.00 rk = tons de cinza em uma imagem, k=0, 1, ..., -1 p(rk) = nk / n onde nk = número de pixels com tom rk n = número de pixels da imagem 01 10 11 001 -1 Lavg l rk prk k 0 0001 00001 000000 000001 Formato PPM • File_signature "P6". • White_space (blanks, TABs, CRs, LFs). • Width, w, (ASCII decimal characters). • White_space (blanks, TABs, CRs, LFs). • Height, h, (ASCII decimal characters). • White_space (blanks, TABs, CRs, LFs). • Max_color, max, (ASCII decimal characters). • White_space (blanks, TABs, CRs, LFs). • Pixels, (3*w*h bytes rgb components of pixels) • Comments from # to the end of line • lines 70 characters Formato PPM exemplo P6 # Created by Paint Shop Pro 358 539 255 =?:?A<AC>CE@EFAFGBGHCGHCGHB . . . Gravação em PPM int ppm_write(int w, int h, unsigned char *rgb, char *file_name) { FILE *fp; fp = fopen(file_name, "wb"); if (fp == NULL) return 0; if (fprintf(fp, "P6\n%d %d\n255\n", w, h) <= 0) { fclose(fp); return 0; } if (fwrite(rgb, 3*w*h, 1, fp) != 1) { fclose(fp); return 0; } fclose(fp); return 1; } Microsoft Windows Bitmap - BMP Características Principais Mono, 4-bit, 8-bit, 24-bit Tipo de compressão: RLE / não comprimido Tamanho máximo: 64K x 64K pixels Seções (versão 3): Header Info. Header Palette Bitmap Data BMP - Header typedef struct _Win3xBitmapHeader { WORD DWORD WORD WORD DWORD Type; /* Image file type 4D42h (“BM”)*/ FileSize; /* File size (bytes) */ Reserved1; /* Reserved (always 0) */ Reserved2; /* Reserved (always 0) */ Offset; /* Offset to bitmap data in bytes */ } WIN3XHEAD; BMP - Information Header typedef struct _Win3xBitmapInfoHeader { DWORD Size; /* Size of this Header (40) */ DWORD Width; /* Image width (pixels) */ DWORD Height; /* Image height (pixels) */ WORD Planes; /* Number of Planes (always=1) */ WORD BitCount; /* Bits per pixel (1/4/8 or 24)*/ DWORD Compression; /* Compression (0/1/2) */ DWORD SizeImage; /* Size of bitmap (bytes) */ DWORD XPelsPerMeter; /* Horz. resol.(pixels/m) */ DWORD YPelsPerMeter; /* Vert. resol.(pixels/m) */ DWORD ClrUsed; /* Num of colors in the image */ DWORD ClrImportant; /* Num of important colors */ } WIN3XINFOHEADER; BMP - Palette typedef struct _Win3xPalette { RGBQUAD Palette[ ]; /* 2, 16, or 256 elem.*/ } WIN3XPALETTE; typedef struct _Win3xRgbQuad { BYTE Blue; /* 8-bit blue component BYTE Green; /* 8-bit green component BYTE Red; /* 8-bit red component BYTE Reserved; /* Reserved (= 0) */ } RGBQUAD; */ */ */ BMP - Image Data Notas Cada scan line em um arquivo BMP é sempre um múltiplo de 4. Imagens com1-, 4-, e 8-bits usam uma palheta de cores. Imagens com 24-bits guardam a cor diretamente, na ordem azul, verde e vermelho (RGBRGB). O armazenamento da imagem é sempre feito a partir do canto esquerdo inferior. Biblioteca IM O objetivo desta biblioteca é ler e escrever imagens bitmaps em formatos raster, tais como BMP, PCX, GIF, TIF, etc... Plataformas: Linux (PC), AIX (RISC), IRIX (Silicon Graphics), SunOS (SUN) e Windows (PC) Trabalho desenvolvido no TeCGraf, através do convênio PETROBRAS/CENPES Para receber uma cópia, vá em: http://www.tecgraf.puc-rio.br/download Manual está disponível em: http://www.tecgraf.puc-rio.br/im No Guia existem exemplos como imconvert e imview Formatos no IM Quadro Comparativo PCX BMP TIF SGI RAS GIF JPG TGA LED 8 BPP Not Compressed Compressed Read Write Read Write Ok OkN Ok Ok Ok Ok Ok Ok Ok Ok Ok Ok Ok OkG Ok ??? Ok Ok *** ??? ----Ok Ok ----Ok OkG Ok Ok Ok Ok Ok Ok ----- 24 BPP Not Compressed Compressed Read Write Read Write Ok OkN Ok Ok Ok Ok ----Ok Ok Ok Ok Ok Ok Ok ??? Ok Ok *** ??? ------------Ok Ok Ok Ok Ok Ok --------- Legenda: Ok - Implementado e funcionando de acordo. OkG - Somente como gray scale. OkN - Não recomendado. --- - Não aplicável. ??? - Não implementado pois não tem documentação. *** - Implementado mas sem exemplos para testes. Funções do IM Cor » » » » » imEncodeColor » imDecodeColor Informação » imFileFormat » imImageInfo imLoadRGB imSaveRGB imLoadMap imSaveMap imRGB2Map imMap2RGB imRGB2Gray imMap2Gray Tamanho » imResize » imStretch I/O » » » » Conversão Controle » imVersion » imRegisterCallback Funções do IM int imImageInfo(char *filename, int *width, int *height, int *type, int *pal_size); Retorna informações sobre a imagem em determinado arquivo. Retorna IM_ERR_NONE, IM_ERR_OPEN, IM_ERR_READ, IM_ERR_FORMAT, IM_ERR_TYPE ou IM_ERR_COMP. Image types: » IM_RGB - 3 buffers separados (Red, Green and Blue) » IM_MAP - 1 buffer e uma tabela de cores Funções do IM int imLoadRGB(char *filename, unsigned char *red, unsigned char *green, unsigned char *blue); Lê uma imagem RGB de um determinado arquivo. É necessário usar a função imImageInfo para poder reservar memória para os ponteiros red, green e blue antes de ler a imagem. Funções do IM int imSaveRGB(int width, int height, int format, unsigned char *red, unsigned char *green, unsigned char *blue, char *filename); Salva uma imagem RGB em determinado arquivo e formato. Para especificar o formato realize um "ou" binário entre o identificador do formato e o identificador da compressão. Ex: (IM_BMP | IM_COMPRESSED) File Format: » IM_BMP, IM_PCX, IM_RAS, IM_GIF, IM_SGI, IM_TIF, IM_JPG, IM_LED, IM_TGA Format Compression » IM_NONE, IM_DEFAULT, IM_COMPRESSED Funções do IM int imLoadMap(char *filename, unsigned char *map, long *colors); Lê uma imagem indexada de um determinado arquivo. É necessário usar a função imImageInfo para poder reservar memória para os ponteiros map e color. int imSaveMap(int width, int height, int format, unsigned char *map, int pal_size, long *colors, char * filename); Salva uma imagem indexada em determinado arquivo e formato. Funções do IM long imEncodeColor(unsigned char red, unsigned char green, unsigned char blue); Converte uma cor no formato RGB para o formato interno da IM. void imDecodeColor(unsigned char* red, unsigned char* green, unsigned char* blue, long color); Converte uma cor no formato interno da IM para o formato RGB.