Soy nuevo en el Procesamiento de la Imagen en Python y estoy tratando de resolver un problema común. Tengo una imagen con una firma de una persona. Quiero encontrar a los bordes y recortar para ajustarse a la firma en la imagen.

De La Imagen De Entrada

Cómo detectar el borde y recortar una imagen en Python

Salida Esperada

Cómo detectar el borde y recortar una imagen en Python

Traté de Canny, Detección de bordes y recortar la imagen utilizando una lista de las soluciones existentes (artículos & respuestas) utilizando PIL, CV2, pero ninguno parece funcionar. Estoy buscando una solución de trabajo.

Algunas de las soluciones que he intentado:

  1. https://www.quora.com/How-can-I-detect-an-object-from-static-image-and-crop-it-from-the-image-using-openCV

  2. Recortar Imagen desde todos los lados después de la detección de bordes

  3. Cómo recortar más grande rectángulo de una imagen

y muchos más… Ninguno funcionó aunque parece muy sencillo. Me encontré con errores o no se espera que la salida utilizando cualquiera de las soluciones existentes.

  • ¿Por qué usted va para la detección de bordes cuando lo que desea es una binarización ??
  • Ir a través de todos los puntos y mantener siempre la max(x) y max(y), y min(x) y min(y)., a Continuación, su firma está contenida en el rectángulo de la última valores anteriores. Añadir algo de espacio en blanco (d) con max(y)+d, min(y)-d, etc.
InformationsquelleAutor Kartik Rokde | 2017-06-06

1 Comentario

  1. 22

    Lo que usted necesita es umbralización. En OpenCV esto se puede lograr usando cv2.umbral().

    Me tomó un tiro a él. Mi planteamiento era el siguiente:

    1. Convertir a escala de grises
    2. Umbral de la imagen para obtener sólo la firma y nada más
    3. Encontrar donde los píxeles que se muestran en los umbrales concretos de la imagen
    4. De cultivos alrededor de la región en el original en escala de grises
    5. Crear un nuevo umbrales concretos de la imagen de la cosecha que no es tan estricto para mostrar

    Aquí fue mi intento, creo que funcionó bastante bien.

    import cv2
    import numpy as np
    
    # load image
    img = cv2.imread('image.jpg') 
    rsz_img = cv2.resize(img, None, fx=0.25, fy=0.25) # resize since image is huge
    gray = cv2.cvtColor(rsz_img, cv2.COLOR_BGR2GRAY) # convert to grayscale
    
    # threshold to get just the signature
    retval, thresh_gray = cv2.threshold(gray, thresh=100, maxval=255, type=cv2.THRESH_BINARY)
    
    # find where the signature is and make a cropped region
    points = np.argwhere(thresh_gray==0) # find where the black pixels are
    points = np.fliplr(points) # store them in x,y coordinates instead of row,col indices
    x, y, w, h = cv2.boundingRect(points) # create a rectangle around those points
    x, y, w, h = x-10, y-10, w+20, h+20 # make the box a little bigger
    crop = gray[y:y+h, x:x+w] # create a cropped region of the gray image
    
    # get the thresholded crop
    retval, thresh_crop = cv2.threshold(crop, thresh=200, maxval=255, type=cv2.THRESH_BINARY)
    
    # display
    cv2.imshow("Cropped and thresholded image", thresh_crop) 
    cv2.waitKey(0)

    Y aquí está el resultado: Cómo detectar el borde y recortar una imagen en Python

    • Wow, que trabajó como un encanto..! Gracias por la respuesta. Para guardar la imagen, acabo de cambiar el pasado 2 líneas con cv2.imwrite('output.png',thresh_crop)
    • Yep! Hay que hacer notar que me cambia el tamaño de ella, aunque por lo que si desea que el tamaño original, mejor comentario que cambiar el tamaño de la línea y la entrada img en lugar de rsz_img en cvtColor() en la siguiente línea.
    • tenga en cuenta que si usted va a hacer esto en las imágenes que podría ser peor (más oscura de las sombras, de papel rizado un poco, de fondo detrás de la hoja) es posible que necesite usar un poco de los métodos más sofisticados. Este Desbordamiento de respuesta es más robusto mediante el procesamiento de esas dificultades primera. Vale la pena un vistazo!

Dejar respuesta

Please enter your comment!
Please enter your name here