Pergunta

Atualmente, estou desenvolvendo um pedaço de software usando opencv e qt que pontos de dados parcelas. Eu preciso ser capaz de preenchimento em uma imagem a partir de dados incompletos. Quero interpolar entre os pontos que eu tenho. Alguém pode recomendar uma biblioteca ou função que poderia me ajudar. Eu pensei que talvez o método opencv remapear mas eu não consigo chegar a esse trabalho.

Os dados são uma matriz 2-d de valores de intensidade. Eu quero criar uma imagem de algum tipo. É um projeto da escola.

Foi útil?

Solução

Ufa! sujeito grande.

A resposta "certa" depende muito em seu domínio do problema e vários detalhes do que você está fazendo.

Interpolação em mais de 1 dimensão requer fazer algumas escolhas. Eu vou assumir que você está tramando em uma grade regular, mas que alguns de seus pontos de grade não têm dados. Big pergunta: são os pontos que faltam escassa, ou eles fazer grandes bolhas

Você não pode adicionar informações, então você está apenas tentando estabelecer algo que irá olhar OK.

sugestão conceitualmente simples (mas a implementação pode ser algum trabalho):

Para cada região de dados em falta, identificar todos os pontos de borda. Isso é encontrar os X nesta figura

oooxxooo
oox..xoo 
oox...xo
ox..xxoo
oox.xooo
oooxoooo

onde os. Do são os pontos de dados em falta, eo xeo de ter dados (para um único ponto ausente, este será os quatro vizinhos mais próximos). Preencha cada ponto de dados em falta com uma média ao longo dos pontos de borda em torno deste blob. Para tornar mais suave, peso por cada ponto 1/d em que d é a distância taxidriver (delta x + y delta) entre os dois pontos ..


Desde antes tivemos quaisquer detalhes:

Na ausência desse tipo de informação, você já tentou em frente interpolação linear? Se os dados forem razoavelmente densa isso pode fazer isso por você, e é bastante simples de código in-line quando necessário.

O próximo passo é geralmente um spline cúbico, mas para isso você provavelmente vai querer pegar uma implementação existente.


Quando eu preciso de algo mais poderoso do que uma interpolação linear rápida, eu costumo usar ROOT (e escolher uma das as classes TSpline), mas isso pode ser mais sobrecarga do que você precisa.

Como observado nos comentários, raiz é grande , e enquanto ele é rápido, ele não tentar forçá-lo a fazer as coisas da maneira ROOT, por isso pode ter um grande efeito sobre o seu programa.


A interpolação linear entre (ou mesmo extrapolação de) dois pontos (x1, y1) e (x2, y2) dá-lhe

 y_i = (x_i-x1)*(y2-y1)/(x2-x1)

Outras dicas

A interpolação é um assunto complexo. Há um número infinito de maneiras para interpolar um conjunto de pontos, e isso supondo que você realmente fazer desejo de fazer interpolação, e não a suavização de qualquer espécie. (AN reproduz interpolação os pontos de dados originais exatamente.) e, claro, a natureza 2-d deste problema torna as coisas mais difíceis.

Existem vários esquemas comuns para interpolação dos dados dispersos em 2-d. Na verdade, para aqueles que têm acesso a ela, um papel muito agradável está disponível (Richard Franke, "interpolação de dados dispersos: testes de alguns métodos"., Matemática da Computação de 1982)

Talvez o método mais comum usado é baseado em uma triangulação de seus dados. Apenas construir uma triangulação do domínio de seus pontos de dados. Então qualquer ponto dentro do casco convexo dos dados deve situar-se dentro de exatamente um dos triângulos, ou ele vai ser em uma borda compartilhada. Isso permite que você interpolar linearmente dentro do triângulo. Se você estiver usando MATLAB, então a função gridData está disponível para esta finalidade expressa.)

O problema ao tentar preencher uma imagem retangular completa de pontos espalhados é que muito provavelmente os dados não se estende aos 4 cantos do array. Nesse caso, um esquema baseado triangulação irá falhar, pois os cantos da matriz não mentem dentro do casco convexo dos pontos dispersos. Uma alternativa é, em seguida, a utilização de "funções de base radial (RBF" muitas vezes abreviada). Há muitos desses esquemas que podem ser encontrados, incluindo Kriging, quando usado pela comunidade geoestatística.

http://en.wikipedia.org/wiki/Kriging

Finalmente, inpainting é o nome para um esquema de interpolação onde os elementos são dados em uma matriz, mas onde existem elementos em falta. O nome, obviamente, refere-se ao que é feito por um conservador de arte que precisa para reparar uma lágrima ou rip em uma valiosa peça de arte.

http://en.wikipedia.org/wiki/Inpainting

A idéia por trás inpainting é tipicamente para formular um problema do valor limite. Isto é, definir uma equação diferencial parcial na região onde existe um furo. Usando os valores limites conhecidos, preencher o buraco resolvendo o PDE para os elementos desconhecidos. Isso pode ser computacionalmente intensivas se houver um grande número de elementos desconhecidos, uma vez que normalmente requer a solução de pelo menos um sistema de escassa maciça de equações lineares. Se o PDE é um não-linear, então torna-se um problema mais intensa ainda. Um simples, razoavelmente boa escolha para o PDE é o Laplaciano, o que resulta em um sistema linear que extrapola bem. Mais uma vez, eu posso oferecer uma solução para um usuário MATLAB.

http://www.mathworks.com/matlabcentral/fileexchange/4551

melhores escolhas para o PDE pode vir de EDPs não-lineares. Uma vez que tal é a equação de Navier / Stokes. É bem adequado para modelar os tipos de superfícies normalmente visto, mas é também mais difícil de lidar. Como em muitas facetas da vida, você recebe o que você paga.

Considerando que este é um projeto escolar simples, provavelmente a técnica de interpolação mais fácil de implementar é a "vizinhos mais próximos"

Para cada dados em falta apontar-lhe encontrar o "cheio" ponto de dados mais próxima e usar isso como o valor.

Se você quer melhorar as retults um pouco mais, então você pode Vamos dizer, encontrar K mais próximo pontos de dados, e utilizar a sua média ponderada como o valor do seu ponto de dados em falta.

o peso poderia ser proporcional à distância do ponto a partir do ponto de dados em falta.

Existem zilhões de outras técnicas, mas vizinho mais próximo é provavelmente o mais fácil de implementar.

Se eu entendo que sua necessidade é a seguinte.

Eu acho que você tem um subconjunto de x, y, intensidade para uma dimensão de L por W e você deseja preencher para todo x variando de 0 a L e Y variando de 0 a W.

Se esta é a sua pergunta, em seguida, solução é fazer com que outras intensidades usando filtros.

Eu acho filtro Bayer ou filtro Gaussian iria fazer o trabalho para você.

Você pode google esses filtros e você vai obter respostas para implementar.

O melhor de sorte.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top