(1) Conceito
O algoritmo de erosão e dilatação é um algoritmo de processamento morfológico básico de nível básico, comumente usado no processamento gráfico. A
operação de erosão pode eliminar o ruído e alguns valores de limite ao mesmo tempo, resultando no encolhimento geral da imagem de destino.
A operação de dilatação pode aumentar o valor do recurso de destino, resultando na ampliação geral da imagem de destino.
A combinação dos dois pode atingir o objetivo de dividir melhor os elementos gráficos independentes.
Kernel: A alma do algoritmo de erosão e expansão também é o que requer o design mais cuidadoso. De acordo com as características da imagem de destino, diferentes kernels devem ser definidos para produzir bons resultados. Mais profissionalmente, é chamado de "elemento estrutural" . Entre eles, o núcleo
, Ou seja, o ponto central do elemento estrutural é chamado de "ponto de ancoragem". Geralmente, o valor mínimo do pixel da área afetada do elemento estrutural é usado para substituir o valor do pixel do "ponto de ancoragem".
Em termos humanos: você imagina uma pintura de parede (imagem de destino), depois de anos, há muitas marcas manchadas na parede, muitas cores desbotadas ou alguns lugares estão mofados (ruído), feios e você segura um Pincel (núcleo/ elemento estrutural), que método deve ser usado para restaurar esta pintura de parede? Trata-se de desenhar o pincel linha por linha, conforme a figura abaixo:
Esta operação é
como reparar "corrosão" e "expansão"? Vejamos alguns casos pequenos, do raso ao profundo
(2) Caso
Vamos primeiro relembrar as operações de interseção (símbolo é ∩) e união (símbolo é ∪) na matemática do ensino médio
1: Suponha que existam dois arrays diferentes: A={1,2,3} ; B = {1,6,9} ;
Então A ∩ B = {1} A ∪ B = {1,2,3,6,9}
todos entendem a verdade, então a seguir,
2: Assuma que o array é uma 2*2
matriz simples
De acordo com a operação de interseção ∩, a mesma parte da matriz AB deve ser mantida, e as diferentes partes são excluídas (definidas como 0), então: De acordo com a operação de união ∪,
todas as partes das duas matrizes de AB são reservados, e se não excluídos, então:
E esta é a operação básica de erosão e expansão. Como é muito simples e fácil de entender aqui, vamos começar a entrar no link onde você não consegue entender quando deixa cair uma caneta e pegue-o. Análise de caso real ~
9*9
3: Assuma que uma imagem alvo de um pixel é identificada , e um conjunto 9*9
de arrays bidimensionais de RGB três canais de cores primárias são obtidos, assumindo que existem apenas duas cores de preto (0,0,0) e branco (255.255.255 ), como mostra a figura a seguir:
Nossos olhos humanos seguem o ponto W (branco), embora existam alguns ruídos no canto superior esquerdo, canto inferior esquerdo e canto inferior direito, ainda é fácil reconhecer que é um 2. Como fazer o 2 parecer mais conspícuo?
Neste momento, nosso algoritmo de erosão e expansão começa a funcionar,
definimos um "núcleo", que você pode entender simplesmente como "pincel" e "molde".
corrosão:
A regra da corrosão é: se houver W (branco) na área de 1, marque o ponto no centro do núcleo como W, se não houver W na área de 1, não precisa lidar com isso, isso é equivalente a "&&" e a operação começa a pintar:
a
primeira vez, pode-se ver que não há ponto branco W na área em forma de cruz, portanto, o ponto central não precisa ser mudar cor.
Na segunda vez, se houver um ponto branco W na área em forma de cruz, a cor do ponto central deve ser alterada para branco. Aqui, uso W+ para indicar que ele aparecerá após a pintura e continuarei a escovar. Se
o a cor é originalmente W, não há necessidade de alterá-la toda vez. Uma linha deve ser escovada e o resultado após a escovação:
pode-se descobrir que a cor de fundo preta está corroída e encolhida e a área alvo branca é ampliada, mas a imagem está uma bagunça, o que não é o que queremos. Neste
momento, devemos considerar a substituição do núcleo, ou seja, a alteração Coloque o "pincel"
primeiro passo:
Passo 2:
Comece a recursar sem parar. Depois que a tinta terminar:
você pode ver que o efeito de corrosão do núcleo triangular é melhor, pelo menos melhor que o da cruz. Claro, aqui está um exemplo simples para mostrar isso . Existem dois pontos principais em resumo
: 1) Imagens diferentes usam núcleos diferentes para ter diferentes efeitos de corrosão
(2) A corrosão aumenta as características da imagem de destino e reduz a influência da cor de fundo preto por meio de tradução e julgamento
Expansão:
A dilatação é realmente muito semelhante, exceto que presta atenção se há um B preto na área da forma nuclear. Se houver, pinte o ponto de ancoragem de preto.
Supondo que o núcleo dilatado também seja um pequeno triângulo, use o mesmo núcleo para expanda a imagem corroída acima. , vamos ver o que vai acontecer:
Passo 1: Descubra que é B, não precisa modificar
Passo 2: Se você encontrar B, mude o ponto de ancoragem do W+ para preto.
Continue a escovar e depois obtenha o resultado expandido:
Verificou-se que o fat 2 original ficou muito fino e até mesmo a linha horizontal abaixo foi considerada como ruído desaparecendo. É claro que, em situações reais, os valores de pixel da imagem de destino não podem apenas ter lamentáveis linhas de N colunas, então definitivamente não é O que é completamente eliminado é no máximo reduzido, e alguns ruídos menores serão eliminados.
Acontece que a área do fundo preto é ampliada.
Esta é a lógica de implementação subjacente de corrosão e expansão. Claro, se eu usar núcleos diferentes, os resultados da expansão serão diferentes. Ainda preciso tentar mais alguns e decidir de acordo com a situação real.
(4) Operações de abertura e fechamento
Seja a imagem alvo X, a erosão E e a dilatação D
operação aberta
Como no exemplo acima, corroer primeiro e depois expandir, que é chamado de: operação aberta (OPEN(X) = D(E(X))
por meio da operação aberta, pode remover pequenos pontos de ruído isolados, rebarbas nos gráficos e pequenas pontes entre duas áreas, enquanto o gráfico geral permanece praticamente inalterado
Fechar operação
Expandir primeiro, depois corroer, que é chamado de: operação fechada (CLOSE(X) = E(D(X)))
Por meio da operação fechada, os buracos nos gráficos principais podem ser reparados, pequenas rachaduras podem ser preenchidas e os recursos de destino pode ser mais completo
(acima As duas fotos são da busca casual do Baidu, tem muitas na internet, então vou pegar emprestadas)
(5) Perguntas:
Como o núcleo deve ser projetado?
O exemplo é apenas uma breve explicação. Na verdade, a expansão e a erosão na biblioteca de CV empacotada não precisam ser especialmente projetadas por nós. Ela pintará o ponto de ancoragem por padrão quando o "pincel" e a imagem de destino forem convoluídos e "pintado". no valor de cor mais escuro/mais claro, e a forma do núcleo é geralmente quadrada ou em forma de disco
Por que não é recomendado apagar o ruído na borda?
O ruído na borda não pode ser apagado, porque pode ser ruído no bloco atual, mas se for uma imagem pequena cortada de uma imagem grande, esses pontos na borda provavelmente serão os principais valores de recursos de outras imagens , que é a informação chave para o splicing
O núcleo deve ser 3*3? O núcleo tem que ser um ponto?
Não necessariamente, o núcleo também pode ser 4*4,5*5,9*9
, o núcleo também pode ter várias formas, não necessariamente um ponto
(6) Finalmente
Anexe uma foto do código do CV, existem muitos casos na Internet, então não vou mostrar aqui