Cómo reconocer histogtwigs con una forma específica en opencv / python

Quiero segmentar imágenes (de revistas) en partes de texto e imagen. Tengo varios histogtwigs para varios ROI en mi imagen. Yo uso opencv con python (cv2).

Quiero reconocer los histogtwigs que se ven así.

http://sofes.miximages.com/histogram/image_tutorial-6.png

Como es una forma típica para una región de texto. ¿Cómo puedo hacer eso?

Edit: Gracias por su ayuda hasta ahora.

Comparé los histogtwigs que obtuve de mis ROI con un histogtwig de muestra que proporcioné:

hist = cv2.calcHist(roi,[0,1], None, [180,256],ranges) compareValue = cv2.compareHist(hist, samplehist, cv.CV_COMP_CORREL) print "ROI: {0}, compareValue: {1}".format(i,compareValue) 

Suponiendo que el ROI 0, 1, 4 y 5 son regiones de texto y ROI es una región de imagen, obtengo una salida como esta:

  • ROI: 0, compareValue: 1.0
  • ROI: 1, compareValue: -0.000195522081574 <— clasificado incorrecto
  • ROI: 2, compareValue: 0.0612670248952
  • ROI: 3, compareValue: -0.000517370176887
  • ROI: 4, compareValue: 1.0
  • ROI: 5, compareValue: 1.0

¿Qué puedo hacer para evitar una clasificación errónea? Para algunas imágenes, la tasa de clasificación errónea es aproximadamente del 30%, lo que es demasiado alto.

(También probé con CV_COMP_CHISQR, CV_COMP_INTERSECT, CV_COMP_BHATTACHARYY y (hist * samplehist) .sum () pero también proporcionan valores de comparación erróneos)

(Consulte la sección EDITAR al final en caso de que haya entendido mal la pregunta):

Si desea dibujar los histogtwigs, he enviado una muestra de python a OpenCV, y puede obtenerla desde aquí:

http://code.opencv.org/projects/opencv/repository/entry/trunk/opencv/samples/python2/hist.py

Se utiliza para dibujar dos tipos de histogtwigs. El primero aplicable a las imágenes en color y en escala de grises como se muestra aquí: http://opencvpython.blogspot.in/2012/04/drawing-histogram-in-opencv-python.html

La segunda es exclusiva para la imagen en escala de grises que es igual a la imagen en la pregunta.

Os mostraré el segundo y su modificación.

Considere una imagen completa como a continuación:

introduzca la descripción de la imagen aquí

Necesitamos dibujar un histogtwig como has mostrado. Compruebe el siguiente código:

 import cv2 import numpy as np img = cv2.imread('messi5.jpg') mask = cv2.imread('mask.png',0) ret,mask = cv2.threshold(mask,127,255,0) def hist_lines(im,mask): h = np.zeros((300,256,3)) if len(im.shape)!=2: print "hist_lines applicable only for grayscale images" #print "so converting image to grayscale for representation" im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) hist_item = cv2.calcHist([im],[0],mask,[256],[0,255]) cv2.normalize(hist_item,hist_item,0,255,cv2.NORM_MINMAX) hist=np.int32(np.around(hist_item)) for x,y in enumerate(hist): cv2.line(h,(x,0),(x,y),(255,255,255)) y = np.flipud(h) return y histogram = hist_lines(img,None) 

Y debajo está el histogtwig que tenemos. Recuerda que es histogtwig de imagen completa. Para eso, no hemos dado None por máscara.

introduzca la descripción de la imagen aquí

Ahora quiero encontrar el histogtwig de alguna parte de la imagen. La función de histogtwig de OpenCV tiene una función de máscara para eso. Para el histogtwig normal, debe configurarlo None . De lo contrario tienes que especificar la máscara.

La máscara es una imagen de 8 bits, donde el blanco indica que la región debe usarse para los cálculos del histogtwig, y ​​el negro significa que no debería.

Así que utilicé una máscara como la de abajo (creada con pintura, tienes que crear tu propia máscara para tus propósitos).

introduzca la descripción de la imagen aquí

Cambié la última línea de código de la siguiente manera:

 histogram = hist_lines(img,mask) 

Ahora vea la diferencia a continuación:

introduzca la descripción de la imagen aquí

(Recuerde que los valores están normalizados, por lo que los valores que se muestran no son un conteo real de píxeles, normalizados a 255. Cámbielo a su gusto).

EDITAR:

Creo que malinterpreté tu pregunta. Necesitas comparar histogtwigs, ¿verdad?

Si eso es lo que querías, puedes usar la función cv2.compareHist .

Hay un tutorial oficial sobre esto en C ++ . Puedes encontrar su código Python correspondiente aquí.

Puede utilizar una métrica de correlación simple.

  • asegúrese de que el histogtwig que calcula y su referencia están normalizados (es decir, representan probapilidades)

  • para cada cálculo de histogtwig (dado que myRef y myHist son matrices numpy):

    metric = (myRef * myHist).sum()

  • esta métrica es una medida de cuánto se ve el histogtwig como su referencia.