2012-04-21 11 views
11

voglio rilevare il logo all'interno dell'immagine per rimuoverlo, ho un'idea che è cercare oggetti che hanno il grande numero di pixel che poi rimuovono, un'altra idea è quella di scorrere tutti i pixel bianchi (ho invertito la mia immagine) e cercare i pixel che formano una regione ampia e quindi rimuovere questa regione, c'è un algoritmo migliore di questo, anche quali metodi in opencv mi aiuteranno a rilevare l'oggetto del numero di pixel di grandi dimensioni.come rilevare la regione di un gran numero di pixel bianchi usando opencv?

risposta

32

Ho un metodo per farlo. Non so se questo metodo è applicabile a tutti, ma funziona bene qui.

seguito è il codice (in Python):

immagine primo convertito in scala di grigi, ridimensionare immagini, applicare soglia, e fare un'immagine di maschera stessa dimensione e tipo di quella scala di grigi ridimensionata. (L'immagine della maschera è solo un'immagine nera)

import cv2 
import numpy as np 

img = cv2.imread('bus.png') 
img = cv2.resize(img,(400,500)) 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
ret,gray = cv2.threshold(gray,127,255,0) 
gray2 = gray.copy() 
mask = np.zeros(gray.shape,np.uint8) 

Ora trova i contorni nell'immagine della soglia. Filtra il contorno per un'area compresa tra 500 e 5000. Probabilmente sarà un grosso blob bianco, ovviamente non lettere. (Ricorda, quest'area è particolare per questa immagine .Non conosco le tue altre immagini. Dovrai trovarla da te). Ora disegna questo contorno sull'immagine della maschera piena di colore bianco.

contours, hier = cv2.findContours(gray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) 
for cnt in contours: 
    if 200<cv2.contourArea(cnt)<5000: 
     cv2.drawContours(img,[cnt],0,(0,255,0),2) 
     cv2.drawContours(mask,[cnt],0,255,-1) 

Below is the detected contour image:

detected contour drawn on the input image

Next is the mask image:

New mask image

Ora si inverte immagine utilizzando la funzione cv2.bitwise_not. Esiste un'opzione per dare una maschera dove diamo la nostra immagine maschera in modo tale che la funzione operi solo sull'area dell'immagine di input dove c'è il bianco nell'immagine della maschera.

cv2.bitwise_not(gray2,gray2,mask) 

E infine mostrare l'immagine:

cv2.imshow('IMG',gray2) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Ed ecco il risultato:

enter image description here


NOTA:

Sopra il metodo è fatto per conservare "ARANCIONE" in quadrato bianco. Ecco perché alcuni artefatti ci sono. Se non vuoi anche quell'arancia, può essere più accurata.

Basta trovare il rettangolo di delimitazione per i contorni filtrati dall'area e disegnare il rettangolo pieno di colore nero.

Codice:

import cv2 
import numpy as np 

img = cv2.imread('bus.png') 
img = cv2.resize(img,(400,500)) 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
ret,gray = cv2.threshold(gray,127,255,0) 
gray2 = gray.copy() 

contours, hier = cv2.findContours(gray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) 
for cnt in contours: 
    if 200<cv2.contourArea(cnt)<5000: 
     (x,y,w,h) = cv2.boundingRect(cnt) 
     cv2.rectangle(gray2,(x,y),(x+w,y+h),0,-1) 

cv2.imshow('IMG',gray2) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Risultato:

rilevati rettangoli di delimitazione:

enter image description here

Poi fillout quei rettangoli con il nero:

enter image description here

.515.053.691,36321 milioni

E 'meglio rispetto alle precedenti, naturalmente se non si vuole "arancione")

+0

perché hai ridimensionato l'immagine? – chostDevil

+0

È perché l'immagine è così grande che il mio schermo non può includerlo nel suo insieme. (Non è così importante qui, evitatelo se non vi piace. "Anche le immagini più piccole significano più velocemente le operazioni".), A proposito, quale metodo si voleva veramente? con ARANCIONE o senza ARANCIONE? –

+0

se si conosce C++, si prega di aggiornare la risposta in quanto non posso mappare tra python e C++ – chostDevil

1

È possibile utilizzare i filtri morfologici (forse filtri alternati sequenziali) per semplificare l'immagine multicolore e quindi utilizzare un algoritmo di segmentazione come spartiacque o un metodo di granulometria e scegliere l'oggetto più grande. Puoi trovare diverse implementazioni online. Ma questo funzionerà solo se il logo è discreto (ad esempio non sullo sfondo)

+0

che cosa si intende per (non sullo sfondo) – chostDevil

+0

@PatrickJones Voglio dire, se si tratta di un'immagine da qualche parte, e non uno di quei biglietti da visita in cui il logo è sotto il testo e occupa l'intera carta. O se la carta è divisa in più regioni di colore. Ci sono molti casi – sivann

+0

quali filtri morfologici o filtri sequenziali alternati si prega di discutere – chostDevil

Problemi correlati