Desconvolución de señales 1D borrosas por un núcleo gaussiano

12

Convolví una señal aleatoria con un ruido gaussiano y agregado (ruido de Poisson en este caso) para generar una señal ruidosa. Ahora me gustaría desconvolver esta señal ruidosa para extraer la señal original usando el mismo gaussiano.

El problema es que necesito un código que haga el trabajo de desconvolución en 1D. (Ya he encontrado algunos en 2D, pero mi objetivo principal es 1D).

¿Puede sugerirme algunos paquetes o programas que puedan hacerlo? (Preferiblemente en MATLAB)

Gracias de antemano por la ayuda.

usuario1724
fuente
1
use la función deconv en MATLAB.
GOEKHAN GUEL
no funciona con ruido añadido ...
user1724
No puede desconvolucionar una señal . Puede estimar una convolución inversa dadas dos señales : la respuesta al impulso del sistema y la salida del sistema. ¿Cuál estás tratando de hacer?
Phonon
2
@Phonon: Bastante tarde con este comentario, pero hay métodos de desconvolución ciegos que no requieren conocimiento de la respuesta al impulso del sistema. Sin embargo, como puede imaginar, puede hacerlo mejor si conoce la respuesta al impulso.
Jason R
1
@JasonR Punto justo.
Phonon

Respuestas:

14

Lo expliqué una vez en StackOverflow .


Su señal se puede representar como un vector, y la convolución es la multiplicación con una matriz N-diagonal (donde N es la longitud del filtro). Supongo, por el bien de la respuesta, que el filtro es mucho más pequeño que la señal

Por ejemplo:

Su vector / señal es:

V1
V2
...
Vn

Su filtro (elemento convolucionario) es:

  [b1 b2 b3];

Entonces la matriz es nxn: (Sea llamado A):

[b2 b3 0  0  0  0.... 0]
[b1 b2 b3 0  0  0.... 0]
[0  b1 b2 b3 0  0.... 0]
.....
[0  0  0  0  0  0...b2 b3]

La convolución es:

A*v;

Y la deconvolución es

A^(-1) * ( A) * v;

Obviamente, en algunos casos la desconvolución no es posible. Estos son los casos en que tiene un singular A. Incluso las matrices que no son singulares, pero que están cerca de ser singulares, pueden ser problemáticas, ya que tendrán un gran error numérico. Puede estimarlo calculando el número de condición de la matriz.

Si A tiene una condición baja, puede calcular el inverso y aplicarlo en el resultado.


Ahora, veamos algunos ejemplos en Matlab:

Primero, hice una función que calcula la matriz de convolución.

function A = GetConvolutionMatrix(b,numA)
    A = zeros(numA,numA);
    vec = [b  zeros(1,numA-numel(b))];
    for i=1:size(A,1)
        A(i,:) = circshift(vec,[1 i]);
    end
end

Ahora, intentemos ver qué sucede con los diferentes núcleos:

    b = [1 1 1];
    A = GetConvolutionMatrix(b,10);
    disp(cond(A));

El número de condición es:

 7.8541

Este es problemático, como se esperaba. Después del promedio, es difícil recuperar la señal original.

Ahora, intentemos un promedio más suave:

b = [0.1 0.8 0.1];
A = GetConvolutionMatrix(b,10);
disp(cond(A));

El resultado es:

1.6667

Eso va bien con nuestra intuición, un promedio leve de la señal original es mucho más fácil de revertir.

También podemos ver cómo se ve la matriz inversa:

 figure;imagesc(inv(A));

ingrese la descripción de la imagen aquí

Aquí hay una línea de la matriz:

  0.0003   -0.0026    0.0208   -0.1640    1.2910   -0.1640    0.0208   -0.0026    0.0003   -0.0001

Podemos ver que la mayor parte de la energía en cada línea se concentra en 3-5 coeficientes alrededor del centro. Por lo tanto, para desconvolucionar, simplemente podemos convolucionar la señal nuevamente con esta aproximación:

   [0.0208   -0.1640    1.2910   -0.1640    0.0208]

¡Este núcleo se ve interesante! Es un operador de afilado. Nuestra intuición es correcta, el afilado cancela el desenfoque.

Andrey Rubshtein
fuente
3
Esta respuesta merece más votos a favor
dinámico
1
¿Por qué crees que la matriz es tridiagonal? Para convolución circular será circulante. En la mayoría de los casos será Toeplitz. Echa un vistazo a mi solución.
Royi
Lea la respuesta: estoy analizando un caso en el que el filtro tiene 3 elementos. En la mayoría de los casos en el procesamiento de imágenes, el filtro es mucho más pequeño que la señal. Entonces sí, es una matriz de Toepliz, pero también es N-diagonal, donde N es la longitud del filtro. La convolución circular también es bastante inútil en el procesamiento de imágenes.
Andrey Rubshtein el
He actualizado la respuesta para evitar más confusión.
Andrey Rubshtein el
¿Has visto Gaussian Kernel que se implementa en 3 muestras?
Royi
5

Si ha agregado ruido aleatorio, no puede obtener la señal original ... Puede intentar separar las señales en el dominio de la frecuencia (si el ruido y la señal son de frecuencias diferentes). Pero parece que lo que está buscando es un filtro Wiener .

melopsitaco
fuente
5

Creo que esto sigue siendo un problema abierto.

Existen numerosos trabajos de investigación que intentan recuperar la señal original lo mejor que pueden.

Un enfoque clásico es a través de métodos basados ​​en Wavelet .

También hay enfoques de diccionario como este .

Puede obtener una visión más profunda del problema siguiendo la investigación realizada por David L. Donho, Michael Elad, Alfred M. Bruckstein, etc.

Paul Irofti
fuente
1
Un artículo reciente que utiliza la wavelet Morlet compleja de Nguyen, Farge & Schneider parece arrojar buenos resultados. Google este código bibliográfico: 2012PhyD..241..186N Un amigo mío usó este método con wavelets 2D en el medio interestelar con excelentes resultados. Todavía tengo que analizarlo en detalle.
PhilMacKay
3

Si entendí el problema correctamente, podemos formalizar el problema de la siguiente manera:

Tenemos un modelo de señal,

y=Hx+η

yHηx

η

No trabajé en la recuperación de la señal bajo el ruido de Poisson, pero busqué en Google y descubrí que este documento puede ser útil. Enfoques similares en ese contexto pueden ser útiles para este problema.

Deniz
fuente
3

Se sabe que la desconvolución de datos ruidosos es un problema mal planteado, ya que el ruido se amplía arbitrariamente en la señal reconstruida. Por lo tanto, se requiere un método de regularización para estabilizar la solución. Aquí, puede encontrar un paquete MATLAB que resuelve este problema implementando el algoritmo de regularización de Tikhonov:

https://github.com/soheil-soltani/TranKin .

usuario10939
fuente
3

Iré al comienzo de la pregunta. Hay funciones de desconvolución en MATLAB que se utilizan para aplicaciones de procesamiento de imágenes. Sin embargo, también puede usar estas funciones para señales 1D. Por ejemplo,

% a random signal
sig_clean = zeros(1,200); 
sig_clean(80:100)=100;

figure
subplot(1,3,1)
plot(sig_clean,'b-.','LineWidth',2)
legend('Clean Signal')

% convolve it with a gaussian
x=1:30;
h = exp(-(x-15).^2/20); h=h/sum(h);
sig_noisy = conv(sig_clean,h,'same');

% and add noise
sig_noisy = awgn(sig_noisy,0,'measured');

subplot(1,3,2)
plot(sig_noisy,'r')
hold on, plot(sig_clean,'b-.','LineWidth',3)
legend('Blurred and noise added signal','Clean Signal')

( sig_noisy = sig_clean * h + noise) Entonces, ¿por qué no desvincular la señal de salida con la hfunción y obtener la señal (casi) de entrada? Estoy usando la deconvolución de Wiener aquí

sig_deconvolved=deconvwnr(sig_noisy,h,1);

subplot(1,3,3)
plot(sig_noisy,'r')
hold on, plot(sig_clean,'b-.','LineWidth',2)
hold on, plot(sig_deconvolved,'k--','LineWidth',2)
legend('Blurred and noise added signal','Clean Signal','Deconvolved Signal')

ingrese la descripción de la imagen aquí Alternativamente, si no conoce la hfunción, pero conoce la entrada y la salida, esta vez por qué no desvincular la señal de entrada con la salida que le dará la h^-1función. Luego puede usarlo como filtro para filtrar la señal ruidosa. ( sig_clean = sig_noisy * h^-1)

h_inv=deconvwnr(sig_clean,sig_noisy,1);

figure;
subplot(1,2,1)
plot(h_inv)
legend('h^-^1')


sig_filtered=conv(sig_noisy,h_inv,'same');
subplot(1,2,2)
plot(sig_noisy,'r')
hold on, plot(sig_clean,'b-.','LineWidth',2)
hold on, plot(sig_filtered,'k--','LineWidth',2)
legend('Blurred and noise added signal','Clean Signal','Filtered Signal')

ingrese la descripción de la imagen aquí

Espero que ayude.

Ozcan
fuente
2

La convolución es la multiplicación y suma de dos señales una sobre la otra. Estoy hablando de dos señales deterministas. Si desea desconvolucionar uno del otro, esto corresponde a la solución del sistema de ecuaciones. Como sabrás, el sistema de ecuaciones no siempre es solucionable. El sistema de ecuaciones puede estar sobredeterminado, subdeterminado o exactamente solucionable.

En caso de que agregue algo de ruido, perderá algo de información y no podrá recuperarla. Lo que puede hacer es nuevamente resolver el sistema lineal de ecuaciones considerando el hecho de que a cada coeficiente se le agrega un término de ruido. O como puede ver en otra respuesta a su pregunta, es posible que desee estimar primero la señal original a partir de la señal ruidosa y luego tratar de resolver el sistema de ecuaciones.

Es importante tener en cuenta que el ruido se agrega a los coeficientes multiplicados y resumidos. Por lo tanto, incluso podría darse el caso de que su sistema de ecuaciones eventualmente no sea solucionable de manera unívoca. Para estar seguro de que tiene una solución única, su matriz de coeficientes debe ser cuadrada y de rango completo.

GOEKHAN GUEL
fuente
2

Esto sería difícil de hacer. La convolución con un gaussiano es equivalente a la multiplicación con una transformada de Fourier del gaussiano en el dominio de la frecuencia. Esto resulta ser también un gaussiano en esencia, este es un filtro de paso bajo y realmente efectivo. Una vez que agrega ruido, se destruye toda la información que está en la "banda de detención" del gaussiano. No hay forma de recuperar eso.

La deconvolución se multiplica esencialmente con el inverso de la respuesta de frecuencia. Aquí está el problema: el inverso de la respuesta de frecuencia se vuelve muy, muy grande donde el Gaussiano original es muy pequeño. A estas frecuencias básicamente amplificarías el ruido en grandes cantidades. Incluso si todo estuviera completamente libre de ruido, lo más probable es que te encuentres con problemas numéricos.

Hilmar
fuente
2

Enfoques

Existen muchos métodos para la deconvolución (es decir, el operador de degradación es lineal e invariante en el tiempo / espacio).
Todos ellos tratan de lidiar con el hecho de que el problema está mal preparado en muchos casos.

Los mejores métodos son aquellos que agregan cierta regularización al modelo de los datos a restaurar.
Pueden ser modelos estadísticos (Priors) o cualquier conocimiento.
Para las imágenes, un buen modelo es una pieza suave o escasa de los gradientes.

Pero por el bien de la respuesta, se tomará un enfoque paramétrico simple: -Minimizar el error de mínimos cuadrados entre los datos restaurados en el modelo y las mediciones.

Modelo

El modelo de mínimos cuadrados es simple.
La función objetivo en función de los datos viene dada por:

f(x)=12hxy22

El problema de optimización viene dado por:

argminxf(x)=argminx12hxy22

Donde son los datos a restaurar, es el núcleo borroso (gaussiano en este caso) es el conjunto de medidas dadas. El modelo supone que las mediciones se dan solo para la parte válida de la convolución. Es decir, si y entonces donde .h y x R n h R k y R m m = n - k + 1xhy
xRnhRkyRmm=nk+1

Esta es una operación lineal en espacio finito, por lo tanto, se puede escribir usando una Forma Matriz:

argminxf(x)=argminx12Hxy22

Donde es la matriz de convolución.HRm×n

Solución

La solución de mínimos cuadrados viene dada por:

x^=(HTH)1HTy

Como se puede ver, requiere una inversión de matriz.
La capacidad de resolver esto adecuadamente depende del número de condición del operador que obedece a . cond ( H ) =HTHcond(H)=cond(HTH)

Análisis de número de condición

¿Qué hay detrás de este número de condición?
Se podría responder con álgebra lineal.
Pero un enfoque más intuitivo, en mi opinión, sería pensarlo en el dominio de frecuencia.

Básicamente, el operador de degradación atenúa la energía de, generalmente, alta frecuencia.
Ahora, dado que en frecuencia esto es básicamente una multiplicación sabia de elementos, uno diría que la forma más fácil de invertirlo es la división sabia de elementos por el filtro inverso.
Bueno, es lo que se hizo arriba.
El problema surge con los casos en que el filtro atenúa la energía prácticamente en cero. Entonces tenemos problemas reales ...
Esto es básicamente lo que nos dice el número de condición, cuán fuerte se atenuaron algunas frecuencias en relación con otras.

ingrese la descripción de la imagen aquí

Arriba se podía ver el número de condición (usando unidades [dB]) en función del parámetro Gaussian Filter STD.
Como se esperaba, cuanto mayor es la ETS, peor es el número de condición, ya que una ETS más alta significa un LPF más fuerte (los valores que bajan al final son problemas numéricos).

Solución numérica

Conjunto de Gaussian Blur Kernel fue creado.

ingrese la descripción de la imagen aquí

Los parámetros son , y . Los datos son aleatorios y no se agregaron ruidos.k = 31 m = 270n=300k=31m=270

En MATLAB, el Sistema Lineal se resolvió utilizando pinv()el Pseudo Inverso basado en SVD y el \operador.

ingrese la descripción de la imagen aquí

Como se puede ver, usando el SVD la solución es mucho menos sensible como se esperaba.

¿Por qué hay un error?
Buscando una solución (para la ETS más alta):

ingrese la descripción de la imagen aquí

Como se podía ver, la señal se restaura muy bien, excepto por el inicio y el final.
Esto se debe al uso de la convolución válida, que nos dice poco sobre esas muestras.

ruido

Si agregamos ruido, ¡las cosas se verían de otra manera!
La razón por la que los resultados fueron buenos antes se debe al hecho de que MATLAB podría manejar el DR de los datos y resolver las ecuaciones a pesar de que tenían un número de condición grande.

Pero un número de condición grande significa que el filtro inverso amplifica fuertemente (para revertir la atenuación fuerte) algunas frecuencias.
Cuando estos contienen ruido, significa que el ruido se amplificará y la restauración será mala.

ingrese la descripción de la imagen aquí

Como se puede ver arriba, ahora la reconstrucción no funcionará.

Resumen

Si uno conoce exactamente al Operador de degradación y la SNR es muy buena, los métodos simples de desconvolución funcionarán.
El principal problema de la deconvolución es la intensidad con que el operador de degradación atenúa las frecuencias.
Cuanto más se atenúa, más SNR se necesita para restaurar (esta es básicamente la idea detrás del filtro Wiener ).
¡Las frecuencias que se establecieron en cero no se pueden restaurar!

En la práctica, para tener resultados estables debería agregar algunos antecedentes.

El código está disponible en mi StackExchange Signal Processing Q2969 Repositorio de GitHub .

Royi
fuente
2

En general, un método para manejar el problema que se generaliza sustancialmente a un problema de extracción de dos o más componentes es tomar los espectros G¹, G² ⋯, Gⁿ de las señales # 1, # 2, ..., #n, tabular el total cuadrado Γ (ν) = | G¹ (ν) | ² + | G² (ν) | ² + ⋯ + | Gⁿ (ν) | ² en cada frecuencia ν, y normalizar G₁ (ν) ≡ G¹ (ν) * / Γ (ν), G₂ (ν) ≡ G² (ν) * / Γ (ν), ..., G_n (ν) ≡ Gⁿ (ν) * / Γ (ν). El problema con la mala definición y el ruido corresponde al hecho de que Γ (ν) ~ 0 es posible para algunas frecuencias ν. Para manejar esto, agregue otra "señal" para extraer G⁰ (ν) = constante - la señal de "ruido". Ahora Γ (ν) se limitará estrictamente a continuación. Es casi seguro que esto está relacionado con la regularización de Tikhonov, pero nunca encontré ni establecí ningún resultado de equivalencia u otra correspondencia. Es más simple y más directo e intuitivo.

Alternativamente, puede tratar los G's como vectores equipados con un producto interno adecuado, por ejemplo, «G, G '» ≡ ∫ G (ν) * G' (ν) dν, y tomar (G₀, G₁, ⋯, G_n) como un dual (por ejemplo, el inverso generalizado) de (G⁰, G¹, ⋯, Gⁿ), suponiendo, por supuesto, que los vectores componentes sean linealmente independientes.

Para la deconvolución gaussiana, uno establecería n = 1, G⁰ = la señal de "ruido" y G¹ = la señal de "Gauss".

RockBrentwood
fuente
1

La respuesta proporcionada por Andrey Rubshtein fallará miserablemente en presencia de ruido, ya que el problema descrito es muy sensible al ruido y a los errores de modelado. Es una buena idea construir una matriz de convolución, pero el uso de la regularización en la inversión es absolutamente obligatorio en un problema como este. Un método de regularización muy simple y directo (aunque computacionalmente costoso) es la descomposición del valor singular truncado (TSVD). Métodos como Tikhonov Regularization y Total Variation RegularizationVale la pena echarle un vistazo. La regularización de Tikhonov (y su forma general) tiene una forma apilada muy elegante que es fácil de implementar en Matlab. Consulte el libro: Problemas inversos lineales y no lineales con aplicaciones prácticas de Samuli Siltanen y Jennifer Mueller.

Pekkiini
fuente
1

En realidad, la pregunta no está clara. Pero las respuestas carificaron lo que has pedido. Puede construir un sistema de ecuaciones algebraicas lineales como aconsejan algunas personas, eso es correcto, pero la matriz construida sobre la señal conocida se denomina mal condicionada. Eso significa que cuando intentas invertirlo, los errores de truncamiento matan la solución y recibes números aleatorios como resultado. El enfoque común es el límite extremo. Minimiza la norma de solución || x || con restricción || Ax - y || <delta. Entonces está buscando una x con la norma más pequeña que no permita que la diferencia entre Ax e y sea grande. Es muy simple que necesite agregar el llamado parámetro de regularización en la diagonal principal de la matriz obtenida en la aplicación de mínimos cuadrados. Se llama regularización de Tikhonov. Tengo muestras de codificación que hacen eso,

Andrew Polar
fuente