# DeSpot

## Abstrato

autor: Alexander G. Balakhnin aka Fizick
versão: 3.2 (baseado no Filtro Mediano Temporal Condicional)
download: http://bag.hotmail.ru/
categoria: Plugins de Vídeo de Radiodifusão
requisitos:

- YV12 Colorspace
- Suporte ISSE

Este filtro é projetado para remover ruídos temporais na forma de pontos (manchas) e listras contidas em alguns vídeos. O filtro também é útil para restauração (limpeza) de filmes velhos de 8mm (e outros) telecinados de manchas (de pó) e algumas listras (arranhões).

O plugin é baseado no Filtro Mediano Temporal Condicional v.0.93 (C-plugin para Avisynth 2.5)
por Kevin Atkinson http://kevin.atkinson.dhs.org/temporal_median/
(Este documento também está baseado no seu doc).

### Imagens de Exemplo

Um meio quadro de meu velho filme 8mm (topo: antes – fundo: depois do filtro):

Escrito Avisynth para este exemplo, que mostra o trabalho do velho filtro de base versão 0.93, mas adaptado para a nova versão 3.2.

    AviSource("film8mm.avi")
    LoadPlugin("despot.dll")
    ConvertToYV12()
    Crop(0,0,720,288) # para mostrar o teste
    i = last
    # Compare o meio quadro com e sem a redução de ruído
    DeSpot(p1=35, p2=14, pwidth=70, pheight=70, mthres=25, mwidth=20, mheight=15, interlaced=false,
      \  merode=33, ranked=false, p1percent=0, dilate=false, fitluma=false, blur=0, motpn=false, seg=0)
    StackVertical(i, last)

O mesmo quadro depois de alguns parâmetros do filtro da versão 1.0 mais nova (metade superior: com borrado na borda da mancha - metade inferior: com suavização temporal nas áreas estáticas):

Escrito do Avisynth para este exemplo:

    AviSource("film8mm.avi")
    LoadPlugin("despot.dll")
    ConvertToYV12()
    Crop(0,0,720,288)
    # Comparar os quadros com mancha e com e sem redução temporal de ruídos
    i = last
    # Comparar os meios quadros com e sem redução de ruídos
    b = DeSpot(i, p1=35, p2=14, pwidth=70, pheight=70, mthres=25, mwidth=20, mheight=15, interlaced=false,
      \  merode=33, ranked=false, p1percent=0, dilate=false, fitluma=false, blur=4, motpn=false, seg=0)
    t = DeSpot(i, p1=35, p2=14, pwidth=70, pheight=70, mthres=25, mwidth=20, mheight=15, interlaced=false,
      \  merode=33, ranked=false, p1percent=0, dilate=false, fitluma=false, blur=4, motpn=false, seg=0, tsmooth=3)
    StackVertical(b, t)

Alguns parâmetros novos são introduzidos nas novas versões de filtro, por detecção mais correta de mancha e remoção de artefatos livres.

### Softwares Necessários

1. O programa é plugin (filtro) para Avisynth 2.5 livre (http://www.avisynth.org). Testado com as versões 2.53 e 2.55alpha. A versão 2.54 também pode ser usada.
2. As versões velhas de filtros anteriores 2.0 (até a última 1.3) onde é necessária na Interface do Avisynth C (avithynth_c.dll) por Kevin Atkinson. Havia alguns problemas com ela.
3. Filtro novo desde a versão 2.0 em que é plugin nativo de Avisynth e não é necessário na interface C.

### USO

DeSpot pode ser carregado como qualquer plugin do Avisynth, pondo-o no diretório de Plugins ou usando LoadPlugin. Uso básico:

    AviSource("d:\video.avi")  # a entrada DEVE ser YV12
    LoadPlugin("despot.dll")
    ConvertToYV12()
    DeSpot(p1=35, p2=14, mthres=25)

O filtro pode trabalhar nos 2 modos principais, trocado pelo parâmetro median (desde a versão 2.0):
median (true ou false, padrão = false),
false - Modo remover pontos – o filtro tentará identificar e eliminar ruídos.
true - Modo Median simples – aplicará um filtro mediano temporal simples às áreas imóveis da imagem.

#### Parâmetros para DeSpot em modo remover pontos são algo como o seguinte:

p1 (padrão 24)
p2 (padrão 12)
Um píxel precisa ser diferente de seus vizinhos a pelo menos 'P1' para que seja considerado ruído. Os píxeis vizinhos devem ser diferentes a pelo menos 'P2' para que o píxel seja considerado parte do mesmo ponto.

pwidth (padrão 6)
pheight (padrão 5)
Um ponto não pode ser maior que PWIDTH x PHEIGHT

ranked (true ou false, padrão=true)
Habilita detetor de diferença de ponto ordenado enfileirado com 6 pontos em vez de 2.

sign (padrão 0)
Fixa o modo para remover só pontos pretos ou brancos ou ambos:
sign = 0 - quaisquer pontos e outliers* (padrão)
sign = 1 - só pontos e outliers* pretos (escuros)
sign = -1 - só pontos e outliers* brancos (claros)
sign = 2 - só pontos pretos (escuros), quaisquer outliers*
sign = -2 - só pontos brancos (claros), quaisquer outliers*

maxpts (de 0 a 10000000, padrão=0 - nenhum limite)
Fixa limite superior de pontos (píxeis) para cada ponto.

p1percent (de 0 a 100, padrão=10)
Fixa o mais baixo limite de fratura relativa dos píxeis de alto contraste (por critério P1) por ponto (em porcentagem).

dilate (de 0 a 255, padrão=1)
Fixa gama de dilatação morfológica (crescente) de pontos removidos (em unidades de píxeis).
fitluma (true ou false, padrão=true)
Habilita alguma correção de luminosidade de quadro nos pontos apagados

blur (de 0 a 4, padrão 1)
Valor (comprimento) do borrão espacial local próximo das bordas dos pontos apagados
tsmooth (de 0 a 127, padrão 0)
Controla suavização temporal em áreas estáticas (menos pontos e movimento).

Fixa percentual aproximado da variação luma do píxel em 3 quadros.

Quanto mais a variação excede o percentual, menor a suavização temporal.0

0 - nenhuma suavização temporal.

motpn (true ou false, padrão = true)
Define o método de detecção de movimento.
false - detecta o movimento do prévio para o atual e do atual para o próximo quadro (método antigo usado em todas as versões antes da 3.0)
true - detecta o movimento do prévio para o próximo quadro (método novo desde a versão 3.0)

seg (de 0 a 2, padrão=2)
Controla o método de remover os segmentos dos pontos.
0 - remove só os píxeis de pontos sem sobreposição com zonas de movimento (método antigo usado em todas as versões antes da 3.0, remoção mais forte);
1 - remove só segmentos de linha de pontos sem sobreposição com zonas de movimento;
2 - remove só pontos inteiros sem sobreposição com zonas de movimento (o mais seguro).

color (true ou false, padrão = false)
Controla a correção de cor nos pontos removidos.
true - muda a cor dos píxeis nos pontos removidos para significar o valor dos quadros prévios, atuais e próximos,
false - não muda a cor dos píxeis nos pontos detectados.

#### Os parâmetros DeSpot para os pontos de remoção e modos medianos são:

mthres (padrão 16)
Um píxel precisa ser diferente do outro quadro por pelo menos 'MTHRES' para ser considerado móvel. Este número deve ser maior que 'P2' para prevenir ruído ao ser identificado como móvel.

mwidth (padrão 7)
mheight (padrão 5)
Estes definem a largura e altura do bloco para o algoritmo de remoção de ruídos do mapa de movimento (fases de corroer e dilatar).

merode (padrão = 33)
Estes definem um valor mínimo de percentual de píxeis de movimento no bloco durante a fase de corroer.

interlaced (true ou false)
Se tratar o vídeo como entrelaçado ou não (progressivo). O padrão é progressivo para DeSpot desde a versão 1.3. (Nas versões anteriores, o vídeo com Base em Campo foi processado como interlaçado por padrão - era um bug).

Em vez de remover pontos e mostrar um mapa de movimento e ruídos que vão ser eliminados use os parâmetros:
show (0, 1, 2, padrão=0)
0 - não mostrar,
1 - para realçar em vez de remover o ruído
2 - mostrar um mapa de movimento e ruído

Se show=1, você pode usar parâmetro adicional para mudar as marcas de cor e brilho,
mark_v (0 a 255, padrão= 255)
Onde mark_v é o valor luma para realçar o ruído.
A cor (rosa, verde ou cinza) do ponto de ruído agora depende da paridade de mark_v.
O mapa de movimento também é mostrado.

Se show=2, o luma é mudado como segue:
255 (branco): ruído que será removido
159: ruído que não será removido porque pode ser movimento
95: mapa de movimento para a imagem atual

show_chroma (true ou false)
Use para mostrar dados de cor de clipe em mapa de movimento.

### AFINANDO OS PARÂMETROS

Para que o filtro trabalhe direito os vários parâmetros devem ser fixos corretamente. Não há nenhum valor padrão bom.

O primeiro parâmetro que precisa ser fixado é interlaced (entrelaçado), fixe-o true se o vídeo é entrelaçado senão, false.

Então pwidth e pheight precisam ser fixados. Fixe-os para ligeiramente maiores que os pontos que quer eliminar. Se o vídeo é entrelaçado, pheight representa a altura de um campo individual. Assim, será dobrado essencialmente.

Então p1, p2, e mthres precisam ser fixados. Em geral, p1 > mthres > p2. Se estes são fixos muito baixo pode perder detalhes como variações de píxeis pequenos que podem ser equivocados como pintas, assim perde detalhe e mais importante, pintas reais podem não ser reconhecidas como o tamanho que o filtro pode pensar que a especificação seja maior que pwidth pelo pheight. show=1 ou 2 podem ser úteis se fixar estes parâmetros.

Os parâmetros mwidth, mheight definem a gama da influência das zonas de movimento em zonas (pontos) de ruídos. Para diminuir a detecção de falsos pontos para cenas de movimento rápidas, você os pode aumentar. Depois disso, para cancelar a influência de movimento em zonas muito pequenas, você pode aumentar o parâmetro(relativo) merode.

Então sign pode ser fixado, se quase todos os pontos são só brancos ou só pretos. A correta afinação reduz o número de falsas detecções de pontos e artefatos.

Eu recomendo usar o novo parâmetro ranked=true para estabilidade de detecção de pontos em vídeo ruidoso.

Use o parâmetro maxpts como outro método (além de pwidth e pheight) para evitar limpeza de objetos muito grandes - provavelmente não pontos.

Use p1percent para não limpar pontos fracos (pouco contraste) com fratura relativa pequena de pontos fortes (com percentual p1).

Para melhor remoção de píxeis parcialmente estragados próximos das extremidades de pontos não aguçados, você pode aumentar o tamanho dos pontos com parâmetro dilate.

Habilite a correção do brilho nos espaços dos pontos apagadas pelo parâmetro fitluma.

Esta correção é local (base segmento de linha) em modo seg>0 e deve ser usada com pontos dilatados corretamente definidos para prevenir falsa correção devido a extremidades de pontos não aguçadas.

Para reduzir um pouco mais a visibilidade de algumas bordas em lugares de pontos apagados, ajuste a suavização espacial local com o parâmetro blur.

Para remover ruídos de áreas quase estáticas, tente usar suavização temporal, com o parâmetro tsmooth entre 4-8.

Se os pontos tiverem um pouco de cor, tente ativar o parâmetro color para corrigi-los.

### COMO TRABALHA

O filtro trabalha como a seguir:

1a) Ache píxeis diferentes de seus vizinhos com pelo menos P1.
Se o parâmetro ranked é true (novo método na versão 1.2), os 3 vizinhos no quadro prévio (x-1, x, x+1) e os mesmos 3 vizinhos no quadro próximo são enfileirados (ordenados por valor) e esses mínimos e máximos são usados para o cálculo da diferença luma para o píxel atual (x).
Se o parâmetro ranked é false (método antigo), só o vizinho 1 no quadro prévio (na mesma posição x) e o vizinho 1 no próximo quadro é usado para o cálculo de mínimo e máximo,
Se parâmetro sign não for 0, o sinal de diferença também é levado em conta.
Este píxeis são fundidos nos segmentos de linha horizontais.
Os segmentos de linha empilhados são fundidos aos pontos.

1b) Aumente outliers* baseado na diferença P2 < P1.

2a) Determine o tamanho das pintas e rejeite (não limpará) todos os maiores que PWIDTH x PHEIGHT.
Se o parâmetro numpts está fixado, os pontos grandes também são rejeitados.
Se o parâmetro p1percent está fixado, então pontos fracos (pelo critério P1) que principalmente consistem de outliers* (pelo critério P2), também são rejeitados.

2b) Se o modo Dilate está fixado, então os pontos são dilatados para cobrir suas extremidades sem contraste e entre suas pequenas aberturas, aplicando uma operação de dilate morfológico ao mapa de ruídos (pontos).

3a) Ache áreas comoventes de uma imagem simplesmente comparando cada píxel com o outro quadro e considerando todos os que são maiores que MTHRES.
Se motpn =false, está definido do prévio para o quadro atual,
se motpn =true, está definido do prévio para o próximo quadro.

3b) Marque píxeis de movimento sem ruído com peso 3 no mapa de movimento.
Se motpn =false, marque os píxeis determinados de ruído e movimento como peso 1 no mapa de movimento.

4) Remova ruídos do mapa de movimento com erosão forçada e então dilatando (como um todo é operação de abertura morfológica).
Durante a fase de corrosão, o mapa de movimento é corroído com a gama mwidth/2 e mheight/2 e as zonas com pequeno peso sumário (menos que 3*merode/100) são diminuídos ou completamente removidos do mapa de movimento. Tais zonas correspondem a relativamente pequenos (em por cento) números de vizinhos de movimento dentro desta gama (ou principalmente pontos de píxeis ruidosos).
Durante a fase dilatar, as zonas de movimento permanecidas são aumentadas com a mesma gama. Estes são provavelmente os passos mais importantes (especialmente para motpn =false).

5) Só remove as pintas em que não havia movimento (no quadro atual ou próximo quadro se motpn =false).
Em modo remover píxel (seg = 0), testa e rejeita todos os píxeis candidatos de ruídos que foram sobrepostos com zonas de movimento, os candidatos restantes serão removidos.
Em modo remover segmento (seg = 1), testa e rejeita todos os segmentos de candidatos de ruídos que têm quaisquer sobrepostos com zonas de movimento, os segmentos restantes serão removidos.
Em modo remover segmentos (seg = 2), testa e rejeita todo os pontos candidatos de ruídos que têm quaisquer sobrepostos com zonas de movimento, os pontos restantes serão removidos. É o modo mais seguro, com mínima remoção de falsos artefatos.

6) Faz correção de luma opcional nos píxeis removidos e suavização espacial perto das extremidades dos pontos.

7) Faz suavização temporal opcional de áreas estáticas.

8) Correção opcional de cor no lugar dos pontos.

O filtro também pode ser configurado para trabalhar como a seguir (modo Mediano Simples):

1) Acha áreas móveis de uma imagem comparando simplesmente cada píxel ao quadro prévio e considerando todos os que são maiores que MTHRES.

2) Remove ruídos do mapa de movimento por erosão e dilatação (abertura morfológica). Este é provavelmente o passo mais importante.

3) Aplica um filtro mediano temporal simples nas áreas imóveis da imagem.

### NOTAS DE OTIMIZAÇÃO

A versão 3.2 de DeSpot é aperfeiçoada à mão para Inteiro SSE (Pentium3, Athlon agora é necessário).

A velocidade aumenta até 30%.

### COMPILANDO

A versão Fizick acima 1.1 é compilada pelo MS VC++ livre Toolkit 2003 com Plataforma MS SDK.

Nota: copie o perdido nmake.exe e cvtres.exe do diretório Bin\win64 para o dir Bin.

MS VC6, VC7 também podem ser usados.

Use faça arquivo "makefile" com o comando: nmake

As versões antigas do C-plugin até 1.3 podem ser compiladas com GCC-g++ 3.3.1, MinGW 3.0.0-1, MSYS 1.09. As novas versões acima da 2.0 não podem ser compiladas assim.

### USO COMBINADO

Resultados muito bons podem ser obtidos com este filtro, combinado com estimação e compensação de movimento: movimento global com plugin de DePan (por Fizick), ou movimento local com plugin MVTools (por Manao).

Neste caso os píxeis dos quadros prévios e próximos são movidos para ajustar melhor o quadro atual, então o movimento relativo é diminuído, a falsa detecção de pontos é diminuída e a redução de ruídos é aumentada.

Exemplo de escrito com DePan 0.9 (você pode afinar os parâmetros opcionais DePanEstimate e DepanInterleave):

    AviSource("h:\kino.avi")
    LoadPlugin("depan.dll")
    LoadPlugin("despot.dll")
    i = ConvertToYV12()
    d = DePanEstimate(trust=3)
    DePanInterleave(i, data=d)
    DeSpot(p1=30, p2=15, pwidth=800, pheight=600, mthres=20, motpn=true, dilate=1, seg=1)
    SelectEvery(3, 1)

Exemplo de escrito com MVTools 0.93 (você pode afinar os parâmetros opcionais MVAnalyse):

    AviSource("h:\kino.avi")
    LoadPlugin("mvtools.dll")
    LoadPlugin("despot.dll")
    i = ConvertToYV12()
    vf = MVAnalyse(i, fth=40 ,isb=false)
    f = MVCompensate(i, vf)
    vb = MVAnalyse(i, fth=40, isb=true)
    b = MVCompensate(i, vb)
    Interleave(f, i, b)
    DeSpot(p1=30, p2=12, mthres=20, dilate=2, fitluma=true, blur=2, seg=2)
    SelectEvery(3,1)

### LICENÇA

Este programa é software livre; você pode redistribuí-lo e/ou modificar sob a condição do GNU General Public License como publicado pela Fundação do Software Livre; qualquer versão 2 da Licença, ou (ao seu gosto) qualquer versão posterior.

Este programa é distribuído na esperança que será útil, mas SEM QUALQUER GARANTIA; sem até mesmo a garantia incluída de COMERCIABILIDADE ou APTIDÃO PARA UM PROPÓSITO PARTICULAR. Veja o GNU General Public License para mais detalhes.

Você deve ter recebido uma cópia do GNU General Public License junto com este programa; se não, escreva à Fundação do Software Livre, Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

### LOG DE MUDANÇAS E DOWNLOADS DE VERSÕES

- Changes 3.2 (July 4, 2004) from 3.1 (Fizick):
  - Corrected enabling and disabling of temporal smooth for some modes.
  - Changed temporal smooth method to more fast but simpler, new tsmooth is similar to old tsmooth*2.
  - Restored median mode processing as was before version 3.0.
  - Partial ISSE optimization for speed increasing (Pentium3 or Athlon is needed now).
  - Updated doc.
- Changes 3.1 (June 27, 2004) from 3.0 (Fizick):
  - Add color correction at place of removed spots.
- Changes 3.0 (June 22, 2004) from 2.1 (Fizick):
  - Version 3.0 is major release update (probably alpha with bugs):
  - Add another motion detection method "motpn" (previous to next frame).
  - Add segments removing methods "seg"=1,2.
  - Change luma correction to local in segments (spots) removing mode.
  - Remove "mratio" parameter (reset as internal constant =3 as in all versions prior 2.1).
  - Change some padrãos.
  - Code reorganization.
  - Update doc.
- Changes 2.1 (June 14, 2004) from 2.0 (Fizick):
  - Add parameter "mratio" parameter (it was internal =3 in all previous versions).
  - Change padrão of "merode" to dependent from "mratio".
  - Update doc.
  - At last I begin to understand how the filter works at motion denoising stage :-).
- Changes 2.0 (June 10, 2004) from 1.3 (Fizick):
  - Version 2.0 is major release update (probably alpha with bugs):
  - Main interface code is rewrited, and now filter is native Avisynth plugin (not C-plugin).
  - Add parameter "median" instead of DeSpotMedian function,
  - Add parameter "show" instead of DeSpotMark, DeSpotMap, DeSpotMedianMap functions.
  - Replace parameter "mp" to parameter "merode" (relative)
  - Change "p1percent" to integer
  - Update doc.
- Changes 1.3 (June 7, 2004) from 1.2 (Fizick):
  - Remove parameter "weak" ( "p1percent" is more useful).
  - Add parameter "Dilate" to enlarge spots.
  - Fixed bug with processing field based video as interlaced by padrão - now padrão for any source is progressive.
  - Change parameters order to more functional.
  - Change padrão values of some parameters to more optimal.
  - Update doc.
- Changes 1.2 (June 01, 2004) from 1.1 (Fizick):
  - Added parameters Ranked, weak, maxpts, p1percent,
  - change mark mode to color spot with weak motion map.
- Changes 1.1 (May 31, 2004) from 1.0:
  - Source now is compatible with MS VC6, VC7.
- Changes 1.0 from 0.934 (Dec 30, 2003) (Fizick) (not public):
  - Added "tsmooth" parameter for temporal smoothing in static areas.
  - Changed filter name to DeSpot, filter file name to despot.dll,
  - and function names:
    ConditionalDenoise to DeSpot,
    ConditionalDenoiseMark to DeSpotMark,
    ConditionalDenoiseMap to DeSpotMap,
    ConditionalMedian to DeSpotMedian,
    ConditionalMedianMap to DeSpotMedianMap.
  - Corrected info.
- Changes 0.934 from 0.93c (Dec 20, 2003) (Fizick):
  - Added "fitluma" and "blur" parameters to reduce noticeability of deleted spots places.
  - Remove "per" parameter used previously for that.
  - New padrão value of "mp" parameter.
- Changes 0.93c from 0.93b (Nov 30, 2003)
  - More short filter name ctmedian.dll
  - Added version info to DLL
- Changes 0.93d from 0.93b (Nov 13, 2003) (Fizick, non public):
  - "per" parameter for more smoothed specks perimeter.
- Changes 0.93a from 0.93 (Nov 7, 2003) (Fizick, non public):
  - "sign" parameter for removing only black or white specks.
  - non optimized general version only.
- Changes 0.93 from 0.92 (Sep 27, 2003) (Kevin Atkinson)
  - Fix another nasty bug.
  - Included non optimized version.
  - Expanded the manual a bit
- Changes 0.92 from 0.91 (Sep 10, 2003) (Kevin Atkinson)
  - Fixed nasty bug.

`$Date: 2006/03/26 18:11:53 $ Portuguese translation by RoLon`