2017-05-10 2 views
0

Ich versuche, um die Anzahl der richtigen Antworten erhalten ein Muster der Antwort des Modells und ein Beispiel für ein Antwortblatt, so dass ich cv2.bitwise_and Funktion dann mache ich Erosion und Dilatation für das resultierende Bild, um die Objekte zu zählen, die die richtigen Antworten darstellen, aber es funktioniert nicht gut. Hier zwei Beispiele Bilder, die ich verwende:bitwise_and zwei Bilder und Zählen der resultierenden Objekte

enter image description here

enter image description here

Das ist das Ergebnis:

enter image description here

so erkennt es drei Kreise statt 2. I versucht, die Anzahl der Iterationen in Erosion und Dilatation zu ändern und die Form der StructuringElement ändern, aber immer noch die falschen Antworten bekommen. Hier ist mein Code:

import numpy as np 
import cv2 
from PIL import Image 
img1 = cv2.imread("model_c3.png") 
img2 = cv2.imread("ex_c3.png") 

retval1, img1 = cv2.threshold(img1,225,255,cv2.THRESH_BINARY_INV) 
retval2, img2 = cv2.threshold(img2,225,255,cv2.THRESH_BINARY_INV) 
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) 
img1gray = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) 

mask = cv2.bitwise_and(img1gray, img2gray,img2) 

el = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) 
e = cv2.erode(mask, el, iterations=2) 
d = cv2.dilate(e, el, iterations=7) 

im, contours, hierarchy = cv2.findContours(
    d, 
    cv2.RETR_LIST, 
    cv2.CHAIN_APPROX_SIMPLE 
) 

centers = [] 
radii = [] 
for contour in contours:  
    br = cv2.boundingRect(contour) 

    m = cv2.moments(contour) 
    center = (int(m['m10']/m['m00']), int(m['m01']/m['m00'])) 
    centers.append(center) 

print("There are {} circles".format(len(centers)))  


cv2.imshow('result.png',d) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

Antwort

0

ich ein paar Dinge in Ihrem Code geändert.

Es macht wenig Sinn, das RGB-Bild zu schwellen und es dann in grau zu konvertieren. Anstatt beide Bilder zu ANDIEREN und dann morphologische Operationen auszuführen, um das Ergebnis zu bereinigen, sollten Sie beide Bilder einfach für eine ordnungsgemäße UND-Operation vorbereiten. Machen Sie die Kreise in einem Bild größer und im anderen Bild kleiner. Auf diese Weise kompensieren Sie auch die kleine Verschiebung, die Sie zwischen beiden Bildern haben (der Grund für alle Artefakte in Ihrem UND-Ergebnis).

Ich bin nicht sicher, wenn Sie voll und ganz die Funktionen verstehen Sie verwenden, weil man sie in eine seltsame Art und Weise mit fremden Parameter verwenden ...

Bitte beachten Sie, dass Ich habe gerade ein paar Dinge in Ihrem Code zu machen Arbeit. Dies soll keine perfekte Lösung sein.

enter image description here

import numpy as np 
import cv2 
#from PIL import Image 
img1 = cv2.imread("d://1.png") 
img2 = cv2.imread("d://2.png") 

img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) 
img1gray = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) 
retval1, img1bin = cv2.threshold(img1gray,128,255,cv2.THRESH_BINARY_INV) 
retval2, img2bin = cv2.threshold(img2gray,128,255,cv2.THRESH_BINARY_INV) 

el = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) 
e = cv2.erode(img1bin, el, iterations=2) 
cv2.imshow("e", e) 
d = cv2.dilate(img2bin, el, iterations=7) 
result = cv2.bitwise_and(e, d) 
cv2.imshow("d", d) 

im, contours, hierarchy = cv2.findContours(
    result, 
    cv2.RETR_LIST, 
    cv2.CHAIN_APPROX_SIMPLE 
) 

centers = [] 
radii = [] 
for contour in contours: 
    br = cv2.boundingRect(contour) 

    m = cv2.moments(contour) 
    center = (int(m['m10']/m['m00']), int(m['m01']/m['m00'])) 
    centers.append(center) 

print("There are {} circles".format(len(centers))) 


cv2.imshow('result',result) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 
0

Sein scheint der falsche positive blob kleiner als die anderen Blobs ist. Filtern Sie die Konturen der Fläche ...

area = cv2.contourArea(contour) 

http://docs.opencv.org/trunk/dd/d49/tutorial_py_contour_features.html

+0

habe ich versucht, dies aber nicht für alle echt positive Blobs in anderen Bildern sind größer als die falsch-positiven ones.It erhöhte den Fehler in einigen Bildern –

Verwandte Themen