2011-06-08 23 views
6

Estoy suprimiendo las bajas frecuencias DC de varios bloques (desiguales) en una imagen en el dominio Dicrete Cosine Transform (DCT). Después de eso, se hace una DCT inversa para recuperar la imagen solo con las porciones de alta frecuencia restantes.¿Cómo obtener una imagen clara después de la supresión de baja frecuencia de la imagen?

cvConvertScale(img , img_32); //8bit to 32bit conversion 
cvMinMaxLoc(img_32, &Min, &Max); 
cvScale(img_32 , img_32 , 1.0/Max); //quantization for 32bit 

cvDCT(img_32 , img_dct , CV_DXT_FORWARD); //DCT 
//display(img_dct, "DCT"); 

cvSet2D(img_dct, 0, 0, cvScalar(0)); //suppress constant background 

//cvConvertScale(img_dct, img_dct, -1, 255); //invert colors 

cvDCT(img_dct , img_out , CV_DXT_INVERSE); //IDCT 
//display(img_out, "IDCT"); 

enter image description here enter image description here enter image description here

El objetivo es identificar y aislar elementos que está presente en altas frecuencias de regiones detectadas previamente en la imagen. Sin embargo, en varios casos, el texto es muy delgado y tenue (bajo contraste). En estos casos, la IDCT crea imágenes que son tan oscuras que incluso las partes de alta frecuencia se vuelven demasiado débiles para que funcionen los análisis posteriores.

¿Qué manipulaciones existen para que podamos obtener una imagen más clara del IDCT después de la supresión de fondo? CvEqualizeHist() da demasiado ruido.

EDIT:

Whole picture subido aquí como belisarius preguntó. La supresión de baja frecuencia no se realiza en toda la imagen, sino en un ROI pequeño establecido en el rectángulo delimitador más pequeño alrededor de porciones de texto/baja frecuencia.

+1

son aquellas letras cifradas? –

+1

Establecer el coeficiente DCT '(0, 0)' a cero no eliminará ningún ruido. Simplemente restará el nivel de gris de toda la imagen con una constante (que es el nivel medio de gris de la imagen original). La nueva imagen contendrá tanto ruido de alta frecuencia como el original. – rwong

+2

En las tres muestras de prueba en su captura de pantalla, creo que un umbral simple debería poder separar el texto del fondo. Es posible que desee echar un vistazo a los algoritmos de umbral binario. – rwong

Respuesta

4

Basándonos en su imagen de ejemplo, comencemos con una posible estrategia para aislar el texto.

El código está en Mathematica.

(* Import your image*) 
i1 = Import["http://i.stack.imgur.com/hYwx8.jpg"]; 
i = [email protected]; 

(*Get the red channel*) 
j = i[[All, All, 1]] 
(*Perform the DCT*) 
t = FourierDCT[j]; 
(*Define a high pass filter*) 
truncate[data_, f_] := 
    Module[{i, j}, 
    {i, j} = Floor[Dimensions[data]/Sqrt[f]]; 
    PadRight[Take[data, -i, -j], Dimensions[data], 0.] 
    ]; 

(*Apply the HP filter, and do the reverse DCT*) 
k = Image[FourierDCT[truncate[t, 4], 3]] // ImageAdjust 

enter image description here

(*Appy a Gradient Filter and a Dilation*) 
l = Dilation[GradientFilter[k, 1] // ImageAdjust, 5] 

enter image description here

(*Apply a MinFilter and Binarize*) 
m = Binarize[MinFilter[l, 10], .045] 

enter image description here

(*Perform a Dilation and delete small components to get a mask*) 
mask = [email protected][m, 10] 

enter image description here

(*Finally apply the mask*) 
ImageMultiply[mask, [email protected]] 

enter image description here

Continuará ...

Editar

de contestar a preguntas comentarios:

La descripción de GradientFilter se encuentra en "más información" aquí: http://reference.wolfram.com/mathematica/ref/GradientFilter.html.

La descripción MinFilter está en "más información" aquí: http://reference.wolfram.com/mathematica/ref/MinFilter.html

+0

parece que esto es todo. solo algunas preguntas más: ¿el filtro de gradiente es el mismo que el de la función de gradiente de morfología en OpenCV? En segundo lugar, ¿qué es un MinFilter (lo siento, estas cosas pueden tener equivalentes de OpenCV ligeramente diferentes para mí). – AruniRC

+0

@AruniRC Lo sentimos, no hay OpenCV aquí, pero actualicé la publicación con la descripción de los operadores utilizados. –

+0

gracias, las cosas están claras ahora.el objetivo no era aislar las porciones de alta frecuencia de toda la imagen, sino de alguna manera "limpiar" las regiones que obtuve después de unos pocos filtros simples como el ancho de trazo, etc. – AruniRC

3

Puede mejorar el contraste aplicando una transformación de ley de potencia positiva simple antes de aplicar la transformación de coseno discreto o después de la IDCT. Eso moverá los tonos de gris más separados. Prueba esto:

cvPow(img, img_hicontrast, 1.75); // Adjust the exponent to your needs 
cvConvertScale(img_highcontrast, img_32); 
+0

esto parece prometedor. algunos ajustes más que ver con los resultados, pero podría funcionar. – AruniRC

+0

Tinker con el exponente. O intente colocar cvPow después del DCT inverso. – susmits

+0

colocándolo después de DCT inversa no hace mucha diferencia. Supongo que los valores son tan bajos que incluso el poder no los separa demasiado. – AruniRC

3

Si un simple umbral (+ quizá alguna apertura morfológica) no es suficiente, sugeriría intentar usar un filtro de difusión: suaviza el ruido en zonas sin bordes, pero conserva las aristas muy . Después de eso, la segmentación debería ser más fácil.

Si los bordes se vuelven demasiado tenues después del filtrado del dominio de frecuencia, pintarlos demasiado con el resultado de cvCanny() antes de filtrar puede ayudar mucho, especialmente si logra encontrar el nivel de suavizado correcto, para obtener solo los bordes útiles.

Cuestiones relacionadas