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
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:
Next is the 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:
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:
Poi fillout quei rettangoli con il nero:
.515.053.691,36321 milioniE 'meglio rispetto alle precedenti, naturalmente se non si vuole "arancione")
È 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)
che cosa si intende per (non sullo sfondo) – chostDevil
@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
quali filtri morfologici o filtri sequenziali alternati si prega di discutere – chostDevil
- 1. Rilevare gruppi di pixel bianchi di un'immagine utilizzando OpenCV
- 2. OpenCV raggruppando i pixel bianchi
- 3. Selezione di una regione OpenCV
- 4. Il modo più veloce per ottenere il numero di pixel bianchi in un'immagine binaria utilizzando OpenCV
- 5. Regione di interesse opencv python
- 6. Gestire un gran numero di file
- 7. Come posso accedere ai pixel di un'immagine usando opencv-python?
- 8. OpenCV: ricerca di pixel lungo i rami a singolo pixel
- 9. come AND un gran numero di matrici di numeri?
- 10. Accesso ai pixel lungo la curva/percorso usando opencv
- 11. Gran numero di connessioni simultanee in parsimonia
- 12. Come posso prendere la media di 100 immagini usando opencv?
- 13. Capire la regione di interesse in openCV 2.4
- 14. OpenCV rilevare luci lampeggianti
- 15. opencv - termoretraibile oggetti pixel
- 16. Accelerare un gran numero di aggiornamenti e inserimenti mysql
- 17. gevent: lato negativo per generare un gran numero di greenlet?
- 18. Haskell che esporta un gran numero di funzioni
- 19. Come rilevare Edge of lips usando Opencv in iOS?
- 20. NumPy/OpenCV 2: come posso ritagliare una regione non rettangolare?
- 21. Gran numero di tabelle e consumo di memoria Ibernazione
- 22. Come rilevare il sole dal cielo spaziale in OpenCv?
- 23. come comprimere gli spazi bianchi in una regione?
- 24. come rilevare centro di un cerchio sfocato con OpenCV
- 25. Gran numero di Session_Start con lo stesso ID di sessione
- 26. Come rilevare la versione di Mac OS usando Python?
- 27. Google BigTable vs BigQuery per memorizzare gran numero di eventi
- 28. bocca Rilevare con OpenCV
- 29. Rimuovere la filigrana da un'immagine usando opencv
- 30. Split NSString per numero di spazi bianchi
perché hai ridimensionato l'immagine? – chostDevil
È 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? –
se si conosce C++, si prega di aggiornare la risposta in quanto non posso mappare tra python e C++ – chostDevil