forked from covap-utfpr/pdi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path02-formacao_imagem.Rmd
428 lines (258 loc) · 37.2 KB
/
02-formacao_imagem.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
# Formação da imagem
Existem diferentes tipos de fontes utilizadas para geração de imagens, sendo que a mais comum é o espectro eletromagnético na faixa de ondas visíveis. Outras fontes de energia também podem ser utilizadas como energia mecânica na forma de ultrassom, feixe de elétrons em microscópio eletrônicos, ondas de rádio no radar, etc. Cada fonte necessita de um método específico de captura. Para ondas eletromagnéticas pode ser usada uma câmera fotográfica equipada com sensores adequados ao comprimento de onda. Porém, para outras fontes, é necessário que o computador sintetize a imagem, como o microscópio eletrônico.
Como já mencionado no tópico de [Introdução](#intro), o espectro eletromagnético contém diferentes frequências de energia, mas os humanos conseguem enxergar somente uma pequena parte desse espectro, conhecido como luz visível. Isso se deve ao fato de que nossos olhos evoluíram para serem sensíveis a essa faixa de luz, que vem da luz solar e nos ajuda a realizar nossas atividades cotidianas. Existem outros animais, como pássaros e insetos, que conseguem ver luz em outras faixas de onda, como a ultravioleta [@cuthill2017, p.2]. Caso nossos olhos fossem também sensíveis a outras frequências, como por exemplo a de rádio, nossos celulares e torres telefônicas pareceriam lanternas [@moeslund2012, p.8].
A luz sem cor, isto é, a luz com maior energia dentro do espectro visível humano, é chamada de luz monocromática (ou acromática). Pelo fato de a intensidade da luz monocromática ser percebida como variações de preto a tons de cinza até chegar ao branco, utiliza-se o termo nível de cinza ou escala de cinza. Já a luz cromática (colorida) cobre o espectro de energia eletromagnética na faixa de 0,43 a 0,79 $\mu m$. Além da frequência, três medidas básicas são utilizadas para descrever a qualidade de uma fonte de luz cromática: radiância, luminância e brilho. A radiância é a quantidade total de energia que é emitida pela fonte de luz e é normalmente medida em watts (W). A luminância, medida em lumens (lm), mede a quantidade de energia que um observador percebe de uma fonte de luz. O brilho, que incorpora a noção acromática de intensidade, é um descritor subjetivo da percepção da luz, então é praticamente impossível mensurar [@gonzalez2010, p.28].
Nos próximos tópicos iremos explorar alguns conceitos e o funcionamento da aquisição de imagem. Esse processo é um pouco complexo e envolve conceitos de ótica, que serão apresentados, de maneira introdutória, a seguir.
## Câmera *pinhole* e geometria
Na Figura \@ref(fig:aquisicaoimagem) temos um esquema básico de como geralmente ocorre a aquisição de imagens. Primeiramente a energia em forma de luz, vinda de uma fonte, atinge um objeto e é refletida. A parte refletida é capturada por um dispositivo, como uma câmera fotográfica.
(ref:aquisicaoimagem) Representação de uma típica captura de imagem [@moeslund2012, p.8].
```{r aquisicaoimagem, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:aquisicaoimagem)', fig.align='center', out.width='55%'}
knitr::include_graphics(rep('imagens/02-formacao/aquisicao_imagem.png'))
```
Baseado nesse princípio pode-se criar um dispositivo muito simples para captura de imagens, conhecido como câmera *pinhole* (do inglês buraco de alfinete) ou câmera escura. Este dispositivo consiste basicamente de uma caixa fechada com somente um pequeno orifício, tão pequeno quanto possível, por onde os raios de luz possam entrar. Mas por que utilizar somente uma pequena entrada? Como podemos ver na Figura \@ref(fig:barreiraluz), se tentarmos realizar a captura da imagem, usando filme fotográfico ou um sensor, sem essa limitação, a área sensível acaba recebendo raios de inúmeras direções, que acabam se misturando tendo como resultado uma imagem ruidosa. Com a barreira de entrada, limitamos a quantidade de luz e conseguimos resultados melhores.
(ref:barreiraluz) Introdução de barreira para captura de imagem [@moeslund2012, p.11].
```{r barreiraluz, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:barreiraluz)', fig.align='center', out.width='55%'}
knitr::include_graphics(rep('imagens/02-formacao/barreiraluz.png'))
```
Na Figura \@ref(fig:barreiraluz) percebemos que a imagem resultante acaba invertida. Isso pode ser explicado através de algumas relações geométricas que serão apresentadas a seguir.
(ref:geometriapinhole) Geometria de uma câmera pinhole [@burger2009, p.5].
```{r geometriapinhole, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:geometriapinhole)', fig.align='center', out.width='55%'}
knitr::include_graphics(rep('imagens/02-formacao/geometriapinhole.png'))
```
Na Figura \@ref(fig:geometriapinhole), considerando que o eixo óptico corresponde a uma reta perpendicular ao orifício de entrada de luz, que o objeto está localizado a uma distância $Z$ da abertura e a uma distância $Y$ o eixo óptico, podemos definir a altura $y$ e a largura $x$ da projeção do objeto utilizando a simetria de triângulos:
$$
-\frac{y}{f}=\frac{Y}{Z}\Leftrightarrow y=-f\frac{Y}{Z} \ \ \ \ \text{e}\ \ \ \ -\frac{x}{f}=\frac{X}{Z} \Leftrightarrow x=-f\frac{X}{Z}
(\#eq:semelhancaTriangulos)
$$
A variável $f$ nessa equação \@ref(eq:semelhancaTriangulos) se refere a distância focal, que é, nesse caso, o tamanho da caixa da câmera, pois a imagem é formada em seu fundo [@burger2009, p.4]. Os sinais negativos das equações significam que a imagem projetada está rotacionada a $180^\circ{}$ verticalmente e horizontalmente devido a semelhança de triângulos [@burger2009, p.5], como podemos confirmar na Figura \@ref(fig:geometriapinhole). Câmeras que usavam esse princípio de funcionamento foram utilizadas a partir do século XIII mas hoje em dia não são utilizadas, somente por hobbistas ou curiosos, já que tem muitas desvantagens como precisar de um longo tempo de exposição para captura da imagem.
As câmeras mais modernas não possuem somente uma pequena entrada para luz, mas um sistema de lentes que focam a luz recebida no sensor. Discutiremos a seguir alguns dos conceitos por trás disso.
## Lentes
(ref:lente) Ação de uma lente sobre os raios de luz [@moeslund2012, p.12].
```{r lente, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:lente)', fig.align='center', out.width='55%'}
knitr::include_graphics(rep('imagens/02-formacao/lente.png'))
```
Como podemos ver na Figura \@ref(fig:lente), em cada ponto de um objeto há inúmeros raios de luz refletidos - neste caso são ilustrados três - e os que chegam à lente são focalizados no seu lado direito. As imagens são capturadas colocando o sensor exatamente onde esses raios são focalizados, ou seja, onde a imagem é formada.
O ponto $F$ onde os raios paralelos se cruzam é conhecido como Ponto Focal. A distância $f$, que vai do centro óptico $O$ até $F$ é conhecida como Distância Focal.
Definindo a distância do objeto real até a lente como $g$ e a distância até a formação da imagem após passar pela lente como $b$ temos que:
$$
\frac{1}{g}+\frac{1}{b}=\frac{1}{f}
(\#eq:relacaoDistancias)
$$
Como $f$ e $b$ estão normalmente entre 1mm e 100mm isso mostra que $\frac{1}{g}$ não tem quase nenhum impacto na equação \@ref(relacaoDistancias) e significa que $b = f$. Isso significa que a imagem dentro da câmera é formada muito próxima ao ponto focal.
Outro ponto importante das lentes é conhecido como *zoom* óptico. Isto deriva de um aspecto das lentes de que o tamanho do objeto na imagem formada, $B$, aumenta quando $f$ aumenta. Podemos representar isso na seguinte equação \@ref(relacaoTamanhoObjetoImagem), onde $g$ é o tamanho real do objeto:
$$
\frac{b}{B}=\frac{g}{G}
(\#eq:relacaoTamanhoObjetoImagem)
$$
Na prática $f$ é alterado através de mudanças na distância entre diferentes lentes dentro do sistema óptico da câmera, aqui estamos usando somente uma lente para exemplificar de maneira fácil alguns de seus conceitos básicos.
Se o $f$ for constante, quando alteramos a distância do objeto, no caso $g$, sabemos que $b$ também aumenta, isso significa que o sensor tem que ser movido mais para trás, pois a imagem estará sendo formada mais longe da lente. Se não movermos $b$ temos uma imagem fora de foco, como mostrado a seguir. Quando usamos uma câmera, o ato de colocar a imagem em foco significa que estamos alterando $b$ para que a imagem seja formada onde o sensor está localizado, para que a imagem esteja em foco.
(ref:foco) Uma imagem focada em (a) e desfocada em (b) [@moeslund2012, p.11].
```{r foco, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:foco)', fig.align='center', out.width='55%'}
knitr::include_graphics(rep('imagens/02-formacao/foco.png'))
```
A Figura \@ref(fig:foco) ilustra exatamente o que significa uma imagem estar fora de foco, no sensor cada pixel tem um tamanho específico, quando a imagem está em foco os raios de um ponto específico estão dentro da área do *pixel*. Uma imagem fica fora de foco quando os raios de outros pontos também interceptam o *pixel*, gerando uma mistura de diferentes pontos.
(ref:profundidade) Profundidade de campo [@moeslund2012, p.13].
```{r profundidade, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:profundidade)', fig.align='center', out.width='55%'}
knitr::include_graphics(rep('imagens/02-formacao/profundidade.png'))
```
A Figura \@ref(fig:profundidade) apresenta outro ponto muito importante, chamado Profundidade de Campo (*Depth of field*), que representa a soma das distâncias $g_l$ e $g_r$, que representam o quanto os objetos podem ser movidos e permanecerem em foco.
Um tópico que também tem muita importância na aquisição de imagens é o Campo de Visão (*Field of View* ou FOV) que representa a área observável de uma câmera. Na Figura \@ref(fig:campovisao) essa área observável é denotada pelo ângulo $V$. O FOV de uma câmera depende de alguns aspectos, como sua distância focal e tamanho do sensor. Em muitos casos os sensores não são quadrados, mas retangulares, então para representarmos matematicamente o campo de visão, utilizamos as equações seguintes para o FOV vertical e horizontal:
$$
FOV_x = 2*\tan^{-1}\left(\frac{\frac{comprimento\ do\ sensor}{2}}{f}\right) \ \ \ \ \text{e}\ \ \ \ FOV_y = 2*\tan^{-1}\left(\frac{\frac{altura\ do\ sensor}{2}}{f}\right)
(\#eq:FOV)
$$
(ref:campovisao) Campo de visão [@moeslund2012, p.14].
```{r campovisao, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:campovisao)', fig.align='center', out.width='55%'}
knitr::include_graphics(rep('imagens/02-formacao/campovisao.png'))
```
Por exemplo, se tivermos uma câmera com um sensor que tenha o comprimento de 14mm, altura de 10mm e uma distância focal de 5mm temos:
$$
FOV_x=2*tan^{-1}\left(\frac{7}{5}\right)=108.9^{\circ} \ \ \ \ \text{e}\ \ \ \ FOV_y=2*tan^{-1}(1)=90^{\circ}
(\#eq:FOVexemplo)
$$
Isso significa que essa câmera tem uma área observável de 108.9º horizontalmente e 90º verticalmente. Na Figura \@ref(fig:diferentesprofundidades) temos o mesmo objeto fotografado com diferentes profundidades de campo:
(ref:diferentesprofundidades) Diferentes profundidades de campo. Em (a) ? em (b)? e em (c)? [@moeslund2012, p.15].
```{r diferentesprofundidades, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:diferentesprofundidades)', fig.align='center', out.width='90%'}
knitr::include_graphics(rep('imagens/02-formacao/diferentesprofundidades.png'))
```
Outros dois fatores importantes na aquisição de imagem são a abertura e o obturador. A abertura é, em uma câmera, o mesmo que a íris do olho humano. É ele que controla a quantidade de luz que chega ao sensor. E o obturador é um dispositivo que controla o tempo ao qual o sensor será exposto à luz para a captura da imagem.
## Sensor
Existem dois tipos principais de sensores que são empregados em dispositivos fotográficos. Um deles é o CCD (*Charge-coupled device*), que é usado principalmente em aplicações mais específicas ou que precisam de uma qualidade muito alta, e o CMOS (*Complementary metal–oxide semiconductor*), usado em casos mais gerais, como câmeras de celulares.
Após a luz passar por todo o sistema de lentes ela chega a esses sensores, que tem sua estrutura exemplificada na Figura \@ref(fig:sensor), conhecido como PDA (*Photodiode Array*):
(ref:sensor) Sensor (área matricial de células), *Single Cell* (uma única célula sensor) [@moeslund2012, p.17].
```{r sensor, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:sensor)', fig.align='center', out.width='55%'}
knitr::include_graphics(rep('imagens/02-formacao/sensor.png'))
```
Como podemos ver, o sensor consiste em várias pequenas células, cada uma com um *pixel*, que recebe a energia luminosa e a converte para um número digital. Quanto maior a incidência de luz em um *pixel*, maior a quantidade de energia e por isso maior será o valor do número gerado. O trabalho de controlar esse tempo de exposição é do obturador da câmera, sendo que um tempo muito longo ou muito curto podem produzir efeitos indesejados nas imagens obtidas, por isso a maioria das câmeras contam com um sistema que controla automaticamente esse tempo para o melhor resultado. Na Figura \@ref(fig:exposicao) podemos ver isso em uma imagem real, na primeira temos uma imagem que foi capturada com a exposição correta (*correctly exposed*), logo em seguida temos uma que sofreu de superexposição (*overexposed*) e na terceira temos uma com subexposição (*underexposed*). Por último temos uma imagem que sofre com o movimento do objeto cuja imagem estava sendo capturada, o que ocasionou o borramento (*motion blur*).
(ref:exposicao) Diferentes níveis de exposição [@moeslund2012, p.17].
```{r exposicao, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:exposicao)', fig.align='center', out.width='60%'}
knitr::include_graphics(rep('imagens/02-formacao/exposicao.png'))
```
Vimos até agora, principalmente, como se capturam imagens em tons de cinza, mas como são capturadas imagens coloridas?
Imagens coloridas utilizam, especialmente, o formato RGB, que significa *Red-Green-Blue*, ou seja, é formado pelas cores primárias vermelho, verde e azul. Podemos a partir disso gerar imagens coloridas tendo as informações sobre sua intensidade de cada uma dessas cores. Na Figura \@ref(fig:componentes) podemos ver uma imagem com seus componentes separados:
(ref:componentes) Imagem colorida separada em seus três componentes, em que *Red* é a vermelha, *Green* é a verde e *Blue* é a azul [@moeslund2012, p.28].
```{r componentes, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:componentes)', fig.align='center', out.width='65%'}
knitr::include_graphics(rep('imagens/02-formacao/componentes.png'))
```
Precisamos assim dessas três informações para formar uma imagem colorida, uma das implementações pensadas para resolver esse problema foi a de dividir a luz de entrada e enviar cada um dos raios filtrados para um sensor diferente, como representado na Figura \@ref(fig:tressensores). Apesar de essa implementação funcionar, ela não se tornou o padrão pelo fato de que utilizar três sensores faz com que seu preço de construção fique elevado e o projeto em si muito mais complexo.
(ref:tressensores) Captura de imagem com três sensores [@teubner2019, p.242].
```{r tressensores, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:tressensores)', fig.align='center', out.width='60%'}
knitr::include_graphics(rep('imagens/02-formacao/tres_sensores.png'))
```
Ao invés disso, as câmeras modernas utilizam somente um sensor e fazem uso de um filtro que separa uma das três cores para cada *pixel*. Isso porque os fotodiodos não reconhecem por si só as cores, mas a intensidade, o que nos levaria a ter somente fotos com tons de cinza. Esse filtro pode conter diferentes configurações, sendo que uma das mais utilizadas é o filtro Bayer, que pode ser visto na Figura \@ref(fig:bayer):
(ref:bayer) Filtro Bayer [@moeslund2012, p.29].
```{r bayer, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:bayer)', fig.align='center', out.width='80%'}
knitr::include_graphics(rep('imagens/02-formacao/bayer.png'))
```
Podemos perceber que ocorre uma maior ocorrência das cores verdes. Isso se deve ao fato de que o olho humano é mais sensível a essa cor, logo se dá uma maior ênfase a sua captura. Na Figura \@ref(fig:sensorarray) temos um esquema de como cada *pixel* recebe informação de somente uma cor, por meio da filtragem. Nesse esquema a luz que entra (*Incoming light*) é filtrada e somente a cor de interesse consegue passar. Após isso, ela chega a malha de sensores (*sensor array*):
(ref:sensorarray) Sensores com padrão Bayer [@img:sensorarray].
```{r sensorarray, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:sensorarray)', fig.align='center', out.width='60%'}
knitr::include_graphics(rep('imagens/02-formacao/sensorarray.png'))
```
Vemos na Figura \@ref(fig:sensorarray) que temos ao final três grupos de informações diferentes mas que têm dados faltantes nos *pixels* referentes às outras cores. As informações desses *pixels* são preenchidas em um processo chamado interpolação que completa as informações baseada nos valores dos *pixels* vizinhos.
## Amostragem e Quantização
Nas seções anteriores foram apresentados processos para a captura de imagens a partir de sensores (principalmente de câmeras comuns). Ainda como etapas da aquisição de imagens, serão abordados nesta seção a amostragem e a quantização, procedimentos em que os dados contínuos dos sensores são convertidos para o formato digital, que é discreto.
### Amostragem
Na amostragem ocorre a discretização espacial, ou seja, a conversão de um espaço contínuo em um espaço discreto, que pode ser representado digitalmente. Este procedimento é exemplificado na Figura \@ref(fig:amostragemquant), na qual a Figura \@ref(fig:amostragemquant) (a) representa um objeto de atributos contínuos, e a linha AB é um segmento horizontal do objeto.
A Figura \@ref(fig:amostragemquant) (b) contém a representação da amplitude (nível de intensidade) da imagem contínua ao longo da linha AB. Nas extremidades do gráfico na Figura \@ref(fig:amostragemquant) (b), a intensidade é mais alta devido a parte branca da imagem. Já os vales representam as partes com menos intensidade, ou seja, as partes mais escuras. Como o computador ainda não tem a capacidade de armazenar uma sequência infinita de números reais, então na quantização são selecionados pontos espaçados igualmente, como na Figura \@ref(fig:amostragemquant) (c).
Na prática, esse procedimento de amostragem é realizado pelos sensores, nos casos mais comuns por um sensor de uma câmera, que geralmente é retangular. Desta forma, a quantidade de células sensíveis na matriz do sensor determina os limites da amostragem. Dito isso, percebe-se que para representar de maneira real o mundo, teríamos que ter um número infinito de *pixels*. Como isso não é possível, recorremos a opção de utilizar o maior número de *pixels* possíveis. Quanto mais *pixels* houver no sensor, maior será a quantidade de detalhes por ele capturado, melhorando a qualidade da imagem [@gonzalez2010, p.34].
(ref:amostragemquant) Produzindo uma imagem digital. (a) Imagem contínua. (b) Linha de varredura de A a B na imagem contínua utilizada para ilustrar os conceitos de amostragem e quantização. (c) Amostragem e quantização. (d) Linha de varredura digital [@gonzalez2010, p.34].
```{r amostragemquant, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:amostragemquant)', fig.align='center', out.width='70%'}
knitr::include_graphics(rep('imagens/02-formacao/amostragemquant.png'))
```
### Quantização
Na Figura \@ref(fig:amostragemquant) (c), os níveis de intensidade ainda variam dentro de uma faixa contínua. A função digital da intensidade é obtida pela quantização, em que as intensidades das amostras são mapeadas em um conjunto de quantidades discretas. Na Figura \@ref(fig:amostragemquant) (d), os valores contínuos de intensidade são quantizados estabelecendo um dos oito valores para cada amostra de acordo com a escala de intensidade na Figura \@ref(fig:amostragemquant) (c).
Na prática, geralmente a etapa de quantização é realizada diretamente no *hardware* utilizando um conversor analógico-digital [@burger2009, p.8]. A conversão dos valores contínuos para valores discretos pode ser realizada por meio de arredondamento, truncamento ou algum outro processo [@bovik2009essential, p.9].
No processo de quantização, geralmente os níveis de intensidade são mapeados por uma transformação linear para um conjunto finitos de inteiros não negativos $\{0,\dots, L-1\}$, onde $L$ é uma potência de dois, ou seja, $L = 2^k$ [@bovik2009essential, p.10]. Isso significa que $L$ é o número de tons de cinza que podem ser representados com uma quantidade $k$ de bits. Em muitas situações é utilizado $k = 8$, ou seja, temos 256 níveis de cinza.
Ao realizar a quantização e a amostragem linha por linha no objeto da Figura \@ref(fig:quantizacao) (a) é produzida uma imagem digital bidimensional como na Figura \@ref(fig:quantizacao).
(ref:quantizacao) (a) Imagem contínua projetada em uma matriz de sensores. (b) Resultado da amostragem e quantização da imagem [@gonzalez2010, p.35].
```{r quantizacao, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:quantizacao)', fig.align='center', out.width='60%'}
knitr::include_graphics(rep('imagens/02-formacao/quantizacao.png'))
```
## Definição de imagem digital {#formacaoImg}
Uma imagem pode ser definida como uma função bidimensional, $f(x, y)$, em que $x$ e $y$ são coordenadas espaciais (plano), e a amplitude de $f$ em qualquer par de coordenadas $(x, y)$ é chamada de intensidade ou nível de cinza da imagem nesse ponto [@gonzalez2010, p.36]. Quando $x$, $y$ e os valores de intensidade de $f$ são quantidades finitas e discretas, chamamos de imagem digital.
A função $f(x, y)$ pode ser representada na forma de uma matriz $M \times N$ como na equação \@ref(eq:imagemDigital), em que as $M$ linhas são identificadas pelas coordenadas em $x$, e as $N$ colunas em $y$. Cada elemento dessa matriz é chamado de elemento de imagem, elemento pictórico, *pixel* ou *pel*. O formato numérico da matriz, imagem \@ref(fig:imagemdigital), é apropriado para o desenvolvimento de algoritmos, representado pela equação \@ref(eq:imagemDigital).
$$f(x,y) = \begin{bmatrix}
f(0,0) & f(0,1) & \cdots & f(0,N-1) \\
f(1,0) & f(1,1) & \cdots & f(1, N-1) \\
\vdots & \vdots & & \vdots \\
f(M-1,0) & f(M-1, 1) & \cdots & f(M-1, N-1)
\end{bmatrix}
(\#eq:imagemDigital)
$$
(ref:imagemdigital) Representações da imagem digital [@gonzalez2010, p.36].
```{r imagemdigital, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:imagemdigital)', fig.align='center', out.width='70%'}
knitr::include_graphics(rep('imagens/02-formacao/imagemdigital.png'))
```
Na Figura \@ref(fig:imagemdigital) (a) temos a representação da imagem em 3D, onde a intensidade de cada *pixel* é representada no eixo z, ou seja, sua altura. Como a matriz numérica transmite pouca informação visual é comum uma representação como na Figura \@ref(fig:imagemdigital) (b), formato que seria visualizado em um monitor ou uma fotografia [@gonzalez2010, p.36]. Em cada ponto da Figura \@ref(fig:imagemdigital) (a), o nível de cinza é proporcional ao valor da intensidade $f$, assumindo valores 0, 0,5 ou 1. Um monitor ou impressora simplesmente converte esses três valores em preto, cinza ou branco.
Note que na Figura \@ref(fig:imagemdigital), a origem de uma imagem digital se localiza na parte superior esquerda, com o eixo x positivo direcionado para baixo e o eixo y positivo para a direita. Esse padrão segue o comportamento de varredura de dispositivos de visualização de imagem, como os monitores de TV, que começam do canto superior esquerdo da imagem e se movem para a direita, fazendo uma linha por vez [@gonzalez2010, p.36].
De acordo com o tamanho da matriz ($M \times N$) e dos níveis discretos de tons de cinza ($L = 2^k$) que os *pixels* podem assumir é possível determinar o número, $b$, de bits necessários para armazenar uma imagem digitalizada:
$$
b = M × N × k
(\#eq:tamanhoBits)
$$
Quando uma imagem pode ter $2^k$ níveis de intensidade, geralmente ela é denominada como uma “imagem de $k$ bits”. Por exemplo, uma imagem com 256 níveis discretos de intensidade é chamada de uma imagem de 8 bits. A Figura \@ref(fig:tabelabits) mostra o número de bits utilizados para armazenar imagens quadradas de dimensão ($N \times N$) para diferentes valores de $N$ e $k$. O número de níveis de intensidade ($L$) correspondente a cada valor de $k$ é mostrado entre parênteses. Observa-se na Figura \@ref(fig:tabelabits) que uma imagem de 8 bits com dimensões 1024 × 1024 exigiria aproximadamente 1MB para armazenamento.
(ref:tabelabits) Número de bits de armazenamento para vários valores de $N$ e $k$ [@gonzalez2010, p.38].
```{r tabelabits, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:tabelabits)', fig.align='center', out.width='100%'}
knitr::include_graphics(rep('imagens/02-formacao/tabelabits.png'))
```
## Resolução espacial e de intensidade
Sem as especificações espaciais da imagem, não se pode inferir sobre a qualidade apenas pelo tamanho ($M \times N$) em quantidades de *pixels*. Outra medida para especificar a resolução espacial é a densidade de *pixels*, podendo ser expressa como pontos (*pixels*) por unidade de distância, comumente *dots per inch* (pontos por polegada ou dpi). Referências de qualidade em relação à resolução espacial são, por exemplo, jornais impressos com uma resolução de 75 dpi e páginas de livros geralmente impressas com 2400 dpi [@gonzalez2010, p.38].
A Figura \@ref(fig:resolucaoespacial) mostra os efeitos da redução da resolução espacial em uma imagem em seis resoluções diferentes. A Figura \@ref(fig:resolucaoespacial) (a) tem resolução 512 x 512, e a resolução das demais \@ref(fig:resolucaoespacial) (b-f) diminui pela metade de forma sequencial. Todas as imagens têm as mesmas dimensões, ampliando-se o tamanho do *pixel* para deixar mais evidente a perda de detalhes nas imagens de baixa resolução.
(ref:resolucaoespacial) Efeitos da redução da resolução espacial [@pedrini2008, p.21].
```{r resolucaoespacial, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:resolucaoespacial)', fig.align='center', out.width='50%'}
knitr::include_graphics(rep('imagens/02-formacao/resolucaoespacial.png'))
```
A resolução de intensidade ou profundidade corresponde ao número de bits ($k$) utilizados para estabelecer os níveis de cinza da imagem ($L=2^k$). Por exemplo, em uma imagem cuja intensidade é quantizada em $L= 256$ níveis, a profundidade é de $k = 8$ bits por *pixel*.
Os efeitos da redução dos níveis de cinza (profundidade) podem ser vistos na Figura \@ref(fig:reducaoprofundidade). A imagem (a) apresenta 256 níveis de cinza ($k = 8$). As imagens (b) e (c) foram geradas pela redução do número de bits $k = 4$ e $k = 2$, respectivamente, mas mantendo a mesma dimensão.
(ref:reducaoprofundidade) Efeitos da redução de profundidade [@moeslund2012, p.19].
```{r reducaoprofundidade, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:reducaoprofundidade)', fig.align='center', out.width='90%'}
knitr::include_graphics(rep('imagens/02-formacao/reducaoprofundidade.png'))
```
## *Pixels*
Os pixels são elementos principais que formam (constituem coordenadas) a imagem, sua importância determina topologicamente as características da imagem digitalizada, nesta seção mostraremos conceitos básicos da topologia dos elementos (pixels) relacionados em uma imagem. Em memória computacional os pixels de uma imagens são representadas no formato de matrizes (bidimensional ou tridimensional) como foi abordado na [Seção 2.5](#formacaoImg), através delas é permitido aplicar operações sobre seus elementos (pixels), efetuar análises, identificação de padrões, acessar regiões, alterar cores, posições e tamanho tendo como referência espaço projetado usando as coordenadas do plano.
Propriedades topológicas dos pixels da imagem:
- Vizinhança ( 4, D, 6, 8 e 26 )
- Conectividade
- Adjacência
- Caminho
- Componente Conexa
- Borda e Interior
- Medidas de Distância
- Operações Lógico-aritméticas
### Vizinhança {#vizin}
Para definir uma vizinhança-4 (denotado $[N_4(f)]$) de um pixel f de coordenadas $(x, y)$ ilustrado na figura \@ref(fig:vizinhanca) (a), $f(x, y)$ possui quatro vizinhos, dois na horizontal e outros dois na vertical cuja as coordenadas da vizinhança são $(x + 1, y), (x - 1, y), (x, y + 1) e (x, y -1)$. Os quatros vizinhos diagonais de f são de coordenadas $(x - , y - 1), (x - 1, y + 1), (x + 1, y + 1)$, que constituem o conjunto $[N_d(f)]$. A vizinhança-8 (denotado $[N_8(f)]$ e ilustrada na figura \@ref(fig:vizinhanca) (b), é definida como $N_8(f)=N_4(f) U N_d(f)$. O conceito de vizinhança pode ser estendido para imagens tridimensionais, sendo que os vizinhos podem ser definidos de acordo com o número de voxels compartilhados, faces, arestas ou vértices em comum nas figuras \@ref(fig:vizinhanca) (c)-(e). A figura \@ref(fig:vizinhanca) (c), por exemplo, ilustra o caso de vizinhança-6, em que os vizinhos do voxel $(x, y, z)$ são $(x - 1, y, z), (x, y, 1)$. [@pedrini2008, p.30].
(ref:vizinhanca) Vizinhanças [@pedrini2008, p. 31].
```{r vizinhanca, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:vizinhanca)', fig.align='center', out.width='70%'}
knitr::include_graphics(rep('imagens/02-formacao/vizinhanca.png'))
```
(a) vizinhança-4 de um pixel, (b) vizinhança-8 de pixel, (c) vizinhança-6 de um voxel, (d) vizinhança-18 de um voxel, (e) vizinhança-26 de um voxel.
### Conectividade {#contiv}
A conectividade entre os pixels é um conceito importante na topologia da imagem, é usada para determinar limites de objetos e componentes de regiões na imagem. Dois pixels são conexos entre si primeiro verificar-se seus tipos de [(vizinhos Seção 2.7.1)](#vizin), de seguida se existe similaridade na intensidade de cinza, cor ou textura. Por exemplo, em uma imagem binária, em que os pixels podem assumir os valores 0 ou 1, dois pixels podem ter vizinhança-4, mas somente serão considerados conexos se possuírem o mesmo valor. [@pedrini2008, p. 31].
### Adjacência {#adja}
Um conjunto $V$ com valores de intensidade para definir adjacência, em uma imagem binária, com $V={1}$ e outra imagem com mesmo conjunto contendo escala de nível de cinza no limite 0 a 255 com vários elementos (pixels) o conjunto $V$ poderia ser qualquer subconjunto desses 256 valores se eles estiverem conectados de acordo com o tipo de [(vizinhança Seção 2.7.1)](#vizin) especificado. [@gonzalez2010, p.31].
### Caminho {#camin}
Uma imagem com coordenada de pixels $(x_1 , y_1), (x_2 , y_2) … (x_n , y_n)$ que determina a sequência do caminho dos variados pixels onde né o comprimento do caminho, e $(x_i , y_i)e (x_i + 1 , y_i + 1)$ são adjacentes, tal que $i = 1,2,...,n - 1$.Se na relação de conectividade considerar vizinhança-4, então existe um caminho-4; para vizinhança-8, tem-se um caminho-8. Exemplo de caminhos são mostrados na figura 11 sendo que o caminho-4 possui comprimento 10 e o caminho-8 possui comprimento 7. O conceito de caminho também pode ser estendido para imagens tridimensionais. [@pedrini2008, p. 31].
(ref:caminho) (a) Caminho-4, (b) Caminho-8 [@pedrini2008, p. 31].
```{r caminho, echo=FALSE, fig.asp=.7, fig.width= 4, fig.height= 4, fig.cap='(ref:caminho)', fig.align='center', out.width='40%'}
knitr::include_graphics(rep('imagens/02-formacao/caminho.png'))
```
### Componente Conexa
Componentes conexos de pixels de uma imagem é um conjunto de elementos (pixels) que de alguma forma estão conectados entre si, dois ou mais pixels são componentes conexos se existir um caminho seção 2.7.4 Caminho pertencente ao conjunto. A figura 12 mostra uma imagem bidimensional contendo três componentes conexos caso seja considerada a vizinhança-4 ou, então, dois componentes conexos se considerada a vizinhança-8. [@pedrini2008, p. 32].
(ref:componente) Componentes Conexos de uma imagem bidimensional [@pedrini2008, p. 32].
```{r componente, echo=FALSE, fig.asp=.7, fig.width= 4, fig.cap='(ref:componente)', fig.align='center', out.width='20%'}
knitr::include_graphics(rep('imagens/02-formacao/componente_conexos.png'))
```
### Borda e Interior
[@pedrini2008, p. 32]. A borda de um componente conexo [seção 2.7.5](### Componente-Conexa) S em uma imagem bidimensional é o conjunto de pixels pertencentes ao componente e que possuem vizinhança-4 com um ou mais pixels externos a S. Intuitivamente, a borda corresponde ao conjunto de pontos no contorno do componente conexo. O interior é o conjunto de pixels de S que não estão em sua borda. A figura 13 mostra um exemplo de uma imagem binária com sua borda interior.
(ref:borda) Borda e interior de um componente, Figura do lado esquerdo, mostra a imagem original, a figura do lado direito mostra os pixels da borda e interior. [@pedrini2008, p. 32].
```{r borda, echo=FALSE, fig.asp=.7, fig.width= 4, fig.height=4, fig.cap='(ref:borda)', fig.align='center', out.width='40%'}
knitr::include_graphics(rep('imagens/02-formacao/borda_interior.png'))
```
### Medidas de Distância
As medidas de distância são aplicadas sobre os pixels e componentes da imagem, considerando D uma função com os pixels $f_1, f_2$ e $f_3$ de coordenadas $(x_1, y_1), (x_2, y_2), (x_3, y_3)$, para verificar se $D$ é uma função distância ou medida de distância, deve satisfazer as seguintes propriedades:
1.
$$
D(f_1,f_2) ≥ 0 (D(f_1,f_2) = 0 \ se \ f_1 = f_2 (\#eq:medida1)
$$
1. $$
(f_1,f_2) = D(f_2, f_1) (\#eq:medida2)
$$
1. $$
D(f_1,f_3) ≤ D(f_1,f_2) + D(f_2,f_3) (\#eq:medida3)
$$
Aplicabilidade da fórmula Euclidiana uma das formas de satisfazer as propriedades acima, desse modo podemos analisar a métrica de dois ou mais pixels de uma imagem, supondo que os pixels $f_1 \ e \ f_2$ de coordenadas $(x1, x2), (y1, y2)$ para medir suas distância aplicamos:
$$D_4(f_1 , f_2) = \sqrt{(x_1-x_2)^2 + (y_1-y_2)^2}
(\#eq:formEclidiana)
$$
Na medida de distância Euclidiana, todos os pixels menores ou igual de qualquer valor d formam um disco de raio d centro em $f_1$. Como exemplo, os pontos com distância $D_E ≤ 3$ de um ponto central $(x, y)$ formam o conjunto mostra na Figura: \@ref(fig:medidaD1)
(ref:medidaD1) Conjunto de pontos com distância Euclidiana menor ou igual de ponto central. [@pedrini2008, p. 33].
```{r medidaD1, echo=FALSE, fig.asp=.7, fig.width= 4, fig.height=4, fig.cap='(ref:medidaD1)', fig.align='center', out.width='40%'}
knitr::include_graphics(rep('imagens/02-formacao/medida_distancia1.png'))
```
A distância D4entre $f_1 \ e \ f_2$, também chamada de city-block, é definida como:
$$
D4(f1 , f2) = |x1 - x2 | + |y1 - y2 |
(\#eq:cityBclock)
$$
Os pixels com uma distância $D_4$ de $f_4$ menor ou igual a algum valor d formam um losango centrado em $f_1$. Em particular, os pontos com distância 1 são os pixels com vizinhança-4 de ponto central. Por exemplo, os pontos com distância $D_4≤ 3$ de um ponto central $(x, y)$ formam o conjunto mostrado na figura \@ref(fig:medidaD2)
(ref:medidaD2) Conjunto de pontos com distância $D_4$ menor ou igual a 3 de um ponto central. [@pedrini2008, p. 33].
```{r medidaD2, echo=FALSE, fig.asp=.7, fig.width= 4, fig.height=4, fig.cap='(ref:medidaD2)', fig.align='center', out.width='40%'}
knitr::include_graphics(rep('imagens/02-formacao/medida_distancia2.png'))
```
A distância $D_8$ entre $f_1$ e $f_2$, também chamada de chessboard, é definida como $D_8(f_1 , f_2) = max(| x_1 = x_2 | , | y_1 =y_2 |)$
Os pixels com uma distância $D_8$ de f1menor ou igual a algum valor d formam um quadrado central em $f_1$. Os pontos com distância 1 são os pixels com a vizinhança-8 do ponto central. Por exemplo, os pontos com distância $D_8 ≤ 3$ de um ponto central $(x, y)$ formam o conjunto mostrado na figura
(ref:medidaD3) Conjunto de pontos com distância $D_4$ menor ou igual a 3 de um ponto central. [@pedrini2008, p. 33].
```{r medidaD3, echo=FALSE, fig.asp=.7, fig.width= 4, fig.height=4, fig.cap='(ref:medidaD3)', fig.align='center', out.width='40%'}
knitr::include_graphics(rep('imagens/02-formacao/medida_distancia3.png'))
```
A distância $D_4$ entre dois pixels $f_1$ e $f_2$é igual ao comprimento do caminho do caminho mais curto entre pixels, considerando-se a vizinhança-4. Do mesmo modo, a distância $D_8$ corresponde ao caminho-8 mais curto entre esses pontos.
### Operações Lógico-aritméticas
[@pedrini2008, p. 34]. Operações lógicas e aritméticas podem ser utilizadas para modificar imagens. Embora essas operações permitam uma forma simples de processamento, há uma grande variedade de aplicações em que tais operações podem produzir resultados de interesse prático.
Dadas duas imagens, $f_1$ e $f_2$, as operações aritméticas mais comuns entre dois pixels $f_1(x, y)$ e $f_2(x, y)$ são a adição, subtração. multiplicação e divisão, definida de acordo com:
- Operações Aritméticas:
1. **Adição**: $f_1(x,y) + f_2(x, y)$.
2. **Subtração**:$f_1(x,y) - f_2(x, y)$.
3. **Multiplicação**: $f_1(x,y) * f_2(x, y)$ $p\cdot q$.
4. **Divisão**: $f_1(x,y)\cdot f_2(x, y)$
As operações Aritmética de Multiplicação e Divisão são usadas para corrigir sombras em níveis de cinza, produzidas em não uniformidades da iluminação ou no sensor utilizado para a aquisição da imagem.