2016-04-19 7 views
1

Ich versuche, eine Grenze um ein Objekt zu zeichnen, sagen wir in diesem Fall eine Läsion Objekt in einem Bild mit einfachem Hintergrund mit nicht viel Lärm. Ich hatte das Bild aufgenommen und Pixelwerte gelesen.Arbeitend, um Grenze um ein Objekt zu zeichnen und das Objekt ist innerhalb des Bildes

Und versucht, XY-Koordinaten entlang der Grenze des Objekts mit aktiven Konturalgorithmus zu berechnen, aber die Grenze zeichnete sich auf Kanten des gesamten Bildes statt auf Grenze entlang des Objekts innen, die ich es nicht besser machen könnte, gut zu werden Koordinaten. Kannst du mir bitte vorschlagen, ob es eine bessere Möglichkeit gibt, eine Grenze um ein Objekt innerhalb des Bildes zu finden/zu ziehen oder sollte ich openCV mit Xcode besser verwenden, um eine IOS App zu erstellen? Bitte schlagen Sie vor.

+0

können Sie bitte ein Beispielbild posten? Es wird auch nützlich sein, den Code zu sehen, den Sie versucht haben, das Problem zu lösen. –

+0

Großartig. Beispielbild, das ich versuche, Grenze um das Objekt im Bild zu zeichnen: https://www.dropbox.com/s/c45hc2ph2kqot8m/Screen%20Shot%202016-04-19%20at%201.27.38%20PM.png ? dl = 0 Code, ich habe das gleiche in Dropbox zur besseren Ansicht hochgeladen. Ich habe versucht, mithilfe der Active-Contour-Algorithmus-Gleichung XY-Koordinaten entlang von Grenzen auf dem Objekt innerhalb des Bildes zu erkennen. Code-Link, Swift-Datei: https://www.dropbox.com/s/6p4ff0wosynxmte/pixelRead.swift?dl=0 Gibt es einen gemeinsamen Fehler bei der aktiven Kontur-Methode, dass es falsche XY-Koordinaten gibt? –

+0

Wie eng sollte die Grenze sein? Erwarten Sie eine tatsächliche Segmentierung? Begrenzungsbox? Irgendwas dazwischen? –

Antwort

1

Ich habe nicht versucht OpenCV aktive Konturen verwenden, aber die Tatsache, dass Sie in der Nähe von Schwarz haben und in der Nähe von weißer Kontur entlang der Bildkanten wahrscheinlich nicht

(Eingangsbild in den Kommentaren oben beschrieben) hilft input image

(dies ist ein opencv + python Prototyp)

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 

img = cv2.imread('skin.png') 
rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
red = rgb_img[:,:,0] 
height, width, channels = rgb_img.shape 

Maske erstellen und anwenden-fuelle

mask = np.zeros((height+2, width+2), np.uint8) 
flooded = red.copy() 

flags = 4 | cv2.FLOODFILL_MASK_ONLY 
cv2.floodFill(flooded, mask, (8, 8), 1, 2, 2, flags) 
plt.imshow(1-mask) 
plt.colorbar() 
plt.show() 

candidates mask ein Bit eines morphologischen cleanup

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7)) 
omask = cv2.morphologyEx(1-mask, cv2.MORPH_OPEN, kernel) 
plt.imshow(omask) 
plt.colorbar() 
plt.show() 

filtered candidates mask finden Konturen:

contours, hierarchy = cv2.findContours(omask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 

größte Fläche Kontur finden:

largest_contour = [] 
largest_area = 0 
for contour in contours: 
    area = cv2.contourArea(contour) 
    if area > largest_area: 
     largest_area = area 
     largest_contour = contour 

Anzeigefolge (eine CH Stimm von Rechteck und Umrisse):

x,y,w,h = cv2.boundingRect(largest_contour) 
cv2.drawContours(rgb_img, [largest_contour], -1, (0, 128, 128), 3) 
cv2.rectangle(rgb_img, (x,y), (x+w, y+h), (0, 0, 0), 2) 
plt.imshow(rgb_img) 
plt.show() 

result

Dies ist eine sehr einfache und einfache Lösung, die nicht perfekt ist. Es kann mit grabcut (auf Kosten der Rechenkomplexität) oder anderen Techniken verbessert werden.