¿Cómo eliminar el otro objeto de la figura usando opencv?

Aug 20 2020

Intenté detectar las líneas amarillas en la siguiente imagen, pero el logo (color amarillo) también estará marcado. Mi pregunta es ¿cómo enmascarar el logo?

Utilizo el código estándar de Hough Transform. Mi código es el siguiente:

import cv2
import numpy as np
img = cv2.imread('Road3.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


low_yellow=np.array([18, 94, 140])
up_yellow=np.array([48, 255, 255])
 mask=cv2.inRange(hsv, low_yellow, up_yellow)
 edges = cv2.Canny(mask,75,150)

 lines = cv2.HoughLinesP(edges,1,np.pi/180,50,maxLineGap=250)
  for line in lines:
 x1,y1,x2,y2 = line[0]
 cv2.line(img,(x1,y1),(x2,y2),(0,255,0),5)

 cv2.imshow('image', img)
 cv2.imshow("edges", edges)
 k = cv2.waitKey(0)
 cv2.destroyAllWindows()

Respuestas

Ahx Aug 20 2020 at 18:49

Puede utilizar un enfoque de coincidencia de plantillas de varias escalas.

Quieres eliminar la siguiente imagen:

    1. Detecta la imagen
    import cv2
    import imutils
    import numpy as np
    
    template = cv2.imread("template/template.jpg")
    template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
    template = cv2.Canny(template, 50, 200)
    (h, w) = template.shape[:2]
    
    image = cv2.imread('nnEGw.jpg')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    found = None
    
    for scale in np.linspace(0.2, 1.0, 20)[::-1]:
         resized = imutils.resize(gray, width=int(gray.shape[1] * scale))
         r = gray.shape[1] / float(resized.shape[1])
    
         if resized.shape[0] < h or resized.shape[1] < w:
             break
    
         edged = cv2.Canny(resized, 50, 200)
         result = cv2.matchTemplate(edged, template, cv2.TM_CCOEFF)
         (_, maxVal, _, maxLoc) = cv2.minMaxLoc(result)
    
         if found is None or maxVal > found[0]:
             found = (maxVal, maxLoc, r)
    
    (_, maxLoc, r) = found
    (startX, startY) = (int(maxLoc[0] * r), int(maxLoc[1] * r))
    (endX, endY) = (int((maxLoc[0] + w) * r), int((maxLoc[1] + h) * r))
    
    cv2.rectangle(image, (startX, startY), (endX, endY), (0, 0, 255), 2)
    cv2.imwrite("result/edges2.png", image)
    

      1. Rellena el rectángulo
    cv2.rectangle(image, (startX, startY), (endX, endY), (255, 255, 255), -1)
    

      1. Aplicar transformación de Hough
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
    low_yellow = np.array([18, 94, 140])
    up_yellow = np.array([48, 255, 255])
    mask = cv2.inRange(hsv, low_yellow, up_yellow)
    edges = cv2.Canny(mask, 75, 150)
    
    lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 50, maxLineGap=250)
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 5)
    
        # cv2.imshow('image', img)
        cv2.imwrite("result/edges3.png", edges)