2014-05-15 17 views
6

W mojej obecnej analizie danych mam kilka segmentowanych obrazów, jak na przykład poniżej.Dopasuj krzywą do segmentowanego obrazu

Mój problem polega na tym, że chciałbym dopasować wielomian lub splajn (s. Jednowymiarowy) do pewien obszar (czerwony) w segmencie obrazu. (wynikiem będzie czarna linia).

Zwykle używam czegoś w rodzaju regresji ortogonalnej, problem polega na tym, że ta potrzebuje jakiejś funkcji dopasowania, której nie mam w tym przypadku. Więc jaki byłby najlepszy sposób, aby to zrobić z python/numpy? Czy istnieje jakiś standardowy algorytm dla tego rodzaju problemu?

example

UPDATE: wydaje moje umiejętności rysunkowe nie są chyba najlepsze, czerwony obszar na zdjęciu mogą również mieć jakieś szumy i nie muszą być całkowicie podłączone (nie może być małe luki spowodowane na hałas).

UPDATE2: Ogólnym celem będzie posiadanie sparametryzowanej krzywej p (t), która zwraca pozycję tj. P (t) => (x, y) dla t w [0,1]. gdzie t = 0 początek czarnej linii, t = 1 koniec czarnej linii.

+3

Musisz eksperymentować, ale wszystko, czego potrzebujesz powinny być dostępne w ['skimage.morphology'] (http://scikit-image.org/docs/dev/api/skimage.morphology.html). Zgaduję, że będziesz chciał zrobić ['closing'] (http://scikit-image.org/docs/dev/api/skimage.morphology.html #closing), aby usunąć szum, przed konwersją lub po niej na obraz binarny, prawdopodobnie przez progowanie, a następnie ['szkieletuj] (http://scikit-image.org/docs/dev/api/skimage.morphology.html#skimage.morphology.skeletonize). – Jaime

+0

Załóżmy, że dostaję akceptowalnego szkieletu z mojej tablicy. Jaki byłby następny krok do uzyskania wielomianu/splajnu. – jrsm

+1

Warto zajrzeć na stronę Stack Exchange http://dsp.stackexchange.com/, jeśli zamierzasz robić coś bardziej skomplikowanego. – Hooked

Odpowiedz

3

Użyłem scipy.ndimage i this gist jako szablonu. To sprawia, że ​​jesteś prawie na miejscu, będziesz musiał znaleźć rozsądny sposób na sparametryzowanie krzywej z najbardziej skostniałego obrazu.

from scipy.misc import imread 
import scipy.ndimage as ndimage 

# Load the image 
raw = imread("bG2W9mM.png") 

# Convert the image to greyscale, using the red channel 
grey = raw[:,:,0] 

# Simple thresholding of the image 
threshold = grey>200 

radius = 10 
distance_img = ndimage.distance_transform_edt(threshold) 
morph_laplace_img = ndimage.morphological_laplace(distance_img, 
                (radius, radius)) 
skeleton = morph_laplace_img < morph_laplace_img.min()/2 

import matplotlib.cm as cm 
from pylab import * 
subplot(221); imshow(raw) 
subplot(222); imshow(grey, cmap=cm.Greys_r) 
subplot(223); imshow(threshold, cmap=cm.Greys_r) 
subplot(224); imshow(skeleton, cmap=cm.Greys_r) 
show() 

enter image description here

Można znaleźć inne odpowiedzi, które odwołują skeletonization użyteczną, przykładem, że jest tutaj:

Problems during Skeletonization image for extracting contours

+0

Wydaje się, że to już działa całkiem nieźle, moim pomysłem było podzielenie szkieletu na N segmentów i użycie go jako węzła do interpolacji splajtowej, ale nie jestem jeszcze pewien. – jrsm