Come rilevare la regione di un numero elevato di pixel bianchi utilizzando OpenCV?

Come rilevare la regione di un numero elevato di pixel bianchi utilizzando OpenCV?

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

Di seguito è riportato il codice ( in Python ):

Per prima cosa converti l'immagine in scala di grigi, ridimensiona l'immagine, applica la soglia e crea un'immagine maschera della stessa dimensione e tipo di quella dell'immagine ridimensionata in scala di grigi. (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. Molto probabilmente sarà una grande macchia bianca, ovviamente non lettere. (Ricorda, quest'area è specifica per questa immagine. Non conosco le altre tue immagini. Dovrai trovarla tu stesso). Ora disegna questo contorno sull'immagine della maschera riempita 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 inverti l'immagine usando cv2.bitwise_not funzione. Lì hai l'opzione per dare la maschera dove diamo la nostra immagine della maschera in modo che la funzione operi solo sull'area nell'immagine di input dove c'è il bianco nell'immagine della maschera.

cv2.bitwise_not(gray2,gray2,mask)

E infine mostra l'immagine :

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

Ed ecco il risultato:

NOTA:

Il metodo sopra è fatto per preservare "ARANCIONE" nel quadrato bianco. Ecco perché ci sono alcuni artefatti. Se non vuoi anche quell'arancia, può essere più preciso.

Trova il rettangolo di delimitazione per i contorni filtrati dall'area e disegna un 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:

retti di delimitazione rilevati:

Quindi riempi quei rettangoli con il nero:

È meglio del precedente , ovviamente se non vuoi "ARANCIONE")