1
PEE-5796
Hae Yong Kim hae@lps.usp.br
http://www.lps.usp.br/~hae
Tópicos a serem abordados:
1. Dispositivos e formatos para imagens; 2. Halftoning;
2.1. Difusão de erro; 2.2. Ordered dithering;
2
1. Dispositivos e formatos para imagens
!"Em níveis de cinza ou colorido.!"Número de bits por pixel (Ex: 1, 4, 8, 16, 24, 32). !"Com ou sem palette.
!"Número de colunas e número de linhas. !"Resolução (pixels/polegada).
!"Modelo de cor aditivo ou subtrativo.
Exemplos:
!"Monitor de computador CRT: #"Colorido.
#"4, 8, 16 ou 24 bits por pixel.
#"Com palette: 4 bits (16 cores) e 8 bits (256 cores).
#"Sem palette: 16 bits (5 bits ou 32 níveis por cor) e 24 bits (8 bits ou 256 níveis por cor).
#"640×480, 800×600, 1024×764 ou 1280×1024 pixels. #"Modelo de cor aditivo.
!"Monitor de notebook (cristal líquido): #"Colorido.
#"16 ou 32 bits por pixel. #"Sem palette.
#"1024×764 pixels (800×600 por interpolação). #"Modelo de cor aditivo.
!"Impressora laser: #"Preto e branco. #"1 bit por pixel.
!"Impressora jato de tinta: #"Colorido.
#"1 bit por pixel.
#"Modelo de cor subtrativo. !"Imagem BMP, TIF e TGA:
#"Colorido ou cinza.
#"Não compactado ou compactado sem perdas. #"Vários escolhas de bits por pixel.
#"Com ou sem palette. !"Imagem GIF:
#"Colorido.
#"8 bits por pixel com palette. #"Compactado sem perdas.
5 !"Imagem PNG:
#"Colorido.
#"Várias escolhas de bits/pixel. #"Compactado sem perdas.
!"Imagem JPG ou JPEG (antigo e 2000): #"Colorido.
#"Compactado com perdas. !"Imagem JBIG:
#"Binário.
#"Compactado com perdas.
6 1. Como é possível mostrar fotografia em níveis de cinzas numa
impressora laser?
2. Como é possível mostrar fotografia colorida numa impressora jato de tinta?
3. Como escolher o melhor palette para imagem GIF?
LENNA.TGA original Thresholding
//Thresh.cpp #include <imgall>
int main(int argc, char** argv)
{ if (argc!=3) erro("Thresh ent.tga sai.bmp"); IMGGRY ent; IMGFLT a; IMGBIN sai;
double error; le(ent,argv[1]); a=ent; sai=a; sai.ImpBmp(argv[2]); } http://www.lps.usp.br/~hae software psi-2651
9
2. Halftoning
Dada uma imagem em níveis de cinza G com valores reais entre 0 e 1, construir uma imagem binária B com valores 0 ou 1 tal que
) , ( ) , (l c G l c B ≈
onde B( cl, ) é a média dos valores de B em torno do pixel (l,c).
10 Thresholding Ruído branco ±0,5
//Noise.cpp
#include <imgall>
int main(int argc, char** argv)
{ if (argc!=3) erro("Noise ent.tga sai.bmp"); IMGGRY ent; IMGFLT a; IMGBIN sai;
double error; le(ent,argv[1]); a=ent; mysrand(7);
for (int l=0; l<a.nl(); l++) for (int c=0; c<a.nc(); c++) a(l,c) += 1.0*myrand()-0.5; sai=a; sai.ImpBmp(argv[2]); }
13 Ordered dithering clustered dots
(meu programa)
Ordered dithering clustered dots (alchemy)
14
//Dispers.cpp #include <imgall>
int main(int argc, char** argv) { if (argc!=3)
erro("Cluster ent.tga sai.bmp"); MATRIZ<int> D(8,8, 0, 32, 8, 40, 2, 34, 10, 42, 48, 16, 56, 24, 50, 18, 58, 26, 12, 44, 4, 36, 14, 46, 6, 38, 60, 28, 52, 20, 62, 30, 54, 22, 3, 35, 11, 43, 1, 33, 9, 41, 51, 19, 59, 27, 49, 17, 57, 25, 15, 47, 7, 39, 13, 45, 5, 37, 63, 31, 55, 23, 61, 29, 53, 21); IMGGRY ent; IMGBIN sai;
le(ent,argv[1]);
sai.resize(ent.nl(),ent.nc()); for (int l=0; l<ent.nl(); l++) for (int c=0; c<ent.nc(); c++) { int l2=l%8; int c2=c%8; if (ent(l,c)<4*D(l2,c2)+2) sai(l,c)=false; else sai(l,c)=true; } sai.ImpBmp(argv[2]); } //Clustered dots MATRIZ<int> D(8, 8, 1, 9, 23, 27, 31, 20, 6, 2, 8, 15, 38, 47, 38, 39, 14, 7, 22, 37, 52, 53, 54, 49, 40, 21, 30, 46, 60, 61, 62, 55, 41, 28, 26, 45, 59, 64, 63, 56, 42, 32, 17, 36, 51, 58, 57, 50, 33, 18, 11, 16, 35, 44, 43, 34, 13, 12, 3, 10, 24, 29, 25, 19, 5, 4);
17 Difusão de erro
(Floyd and Steinberg)
Difusão de erro (Rogers)
18 Difusão de erro
(Jarvis, Judice and Ninke)
Difusão de erro (Stucki)
2.2 Difusão de erro
//Rogers.cpp #include <imgall>
int main(int argc, char** argv)
{ if (argc!=3) erro("Rogers ent.tga sai.bmp"); IMGGRY ent; IMGFLT a; IMGBIN sai;
double error;
le(ent,argv[1]); a=ent; sai.resize(a.nl(),a.nc()); for (int l=0; l<a.nl(); l++) for (int c=0; c<a.nc(); c++) { if (a(l,c)<0.5)
{ sai(l,c)=false; error=a(l,c); } else { sai(l,c)=true; error=a(l,c)-1; } a(l,c+1) += 3*error/8; a(l+1,c) += 3*error/8; a(l+1,c+1) += 2*error/8; } sai.ImpBmp(argv[2]); } • × 2 3 3 8 1 Rogers • × 1 5 3 7 16 1
Floyd and Steinberg
• × 1 3 5 3 1 3 5 7 5 3 5 7 48 1
Jarvis, Judice and Ninke
• × 1 2 4 2 1 2 4 8 4 2 4 8 42 1 Stucki
21 LENNA.TGA original Difusão de erro
(Floyd and Steinberg)
22 (1a) Input sample Ax (1b) Output sample Ay
(1c) To-be-processed Qx (1d) Ideal output Qy
(1e) Gaussian 2.8 PSNR 30.23dB (1f) 10-ID3 PSNR 34.75dB
(2a) Dispersed-dot OD (2b) PSNR 33.69 dB
Exercício:
Reduzir true color (24 bits/pixel) para 6 bits/pixel usando ordered dithering e difusão de erro.
Dada uma imagem halftone, como descobrir qual foi o método de halftoning usado?