2016-07-08 6 views
0

Ich hatte gehofft, jemand könnte mir mit einem Bildverarbeitungsproblem helfen. Meine Fliegenembryonen sind auf die Zellkerne im peripheren Nervensystem (PNS) - Anlage 1 - gefärbt. Diese Zellkerne bilden Cluster in jedem der embryonalen Segmente der Fliege. Mein Ziel ist es, diese Cluster von Zellkernen zu verwenden, jede der embryonalen Segmente (dh einem Blob oder Punkt pro Segment) zu beschriften - Befestigung 2.Imaging Processing - Clustern von Zellen in Gruppen in Fly Embryos Bilder

PNS Stain

PNS Stain showing blobs

Ich habe einigen Erfolg hatte durch tun Gaußsche Unschärfe der markierten Kerne (so dass jeder Cluster von Kernen einen Blob bildet) und dann adaptive Schwellenwertbildung, um diese "Blobs" zu identifizieren. Es ist jedoch keine sehr robuste Methode - einige Cluster bilden keine oder mehrere Cluster zusammen. Ich verwende scikit-Bild meiner Analyse zu tun, hier ist der relevante Teil meines Codes, die ich habe mit:

EmbryoBlur = Gaußsche (Embryo, sigma = (10,5))

ClusteredCells = threshold_adaptive (EmbryoBlur, block_size = 151, method = "mean")

jemand irgendwelche anderen Strategien muss vorschlagen, so dass es robust einen einzigen Punkt oder Blob pro Cluster von Kernen bildet?

Auch wenn jemand eine Strategie konzeptionell erklären möchte, könnte ich es auch in scikit-image implementieren.

Vielen Dank!

Antwort

0

Das sieht aus wie ein Problem, das mit Erwartungsmaximierung (EM) für ein Gaussian Mixture Model beide anderen http://www.ics.uci.edu/~smyth/courses/cs274/notes/EMnotes.pdf

gelöst werden kann verwandter Ansatz ist K-Means-Clustering (kurz in dem obigen Link bedeckt) von diesen versuchen Daten zu gruppieren, indem die Varianz innerhalb eines Clusters verringert wird. Für K-Mittel wird dies normalerweise mit einer Abstandsmetrik gemacht, während EM Wahrscheinlichkeiten für das Clustering verwendet.

Der einzige Nachteil mit beiden Ansätzen ist, wie viele Cluster gibt es, bevor Sie Segment wissen, haben die data.Unfortunately ich keine Kenntnis von Scikit haben, aber dies wird hoffentlich einige Ideen in

0

zu sehen geben Ich weiß nicht, ob das genau das ist, wonach Sie suchen, aber ich habe ein Skript zusammengefügt, das eine Gaußsche Unschärfe ausführt und dann eine Zufallswanderersegmentierung (ähnlich der Wasserscheide) verwendet, um die Kerne aus dem Hintergrund und der Zellmatrix zu füllen und zu segmentieren .

Sie können mit den Werten spielen, um die Unschärfe (Sigma) und die untere und obere Schwelle für die Segmentierung zu erhöhen oder zu verringern.

Ich testete es auf dem PNS Fleck Bild, aber ich musste den weißen Rand zuschneiden.

#griffinc StackOverflow 

import numpy as np 
import matplotlib.pyplot as plt 

from skimage.io import imread 
from skimage.segmentation import random_walker 
from skimage.color import rgb2grey 
from scipy.ndimage.filters import gaussian_filter 


#change this to your personal image directory 
image = imread(r'C:\Users\YOURNAMEHERE\Desktop\mge1v.png') 
grey_image = rgb2grey(image) 

blurred = gaussian_filter(grey_image, sigma=6) #play with sigma for blur amount 


#Get markers for random walk 
def get_markers(grey_array, bottom_thresh, top_thresh): 

    markers = np.zeros_like(grey_array) 
    markers[grey_array < bottom_thresh] = 1 
    markers[grey_array > top_thresh] = 2 

    return markers 


#perform Random Walker, fills in positive regions 
#play with .1 and .15 to set the thresholds for the labels 
segmentation = random_walker(blurred, get_markers(blurred, .1, .125), beta=130, mode='bf') 


#Plot images 
fig, axes = plt.subplots(2, 2, figsize=(12, 11)) 

ax0, ax1, ax2, ax3 = axes.ravel() 

ax0.imshow(image, cmap=plt.cm.gray, interpolation='nearest') 
ax0.set_title("Original") 

ax1.imshow(grey_image, cmap=plt.cm.gray, interpolation='nearest') 
ax1.set_title("Grey") 

ax2.imshow(blurred, cmap=plt.cm.gray) 
ax2.set_title("Gaussian Blur") 

ax3.imshow(segmentation, cmap=plt.cm.gray) 
ax3.set_title("Random Walk Segmented") 

for ax in axes.ravel(): 
    ax.axis('off') 

fig.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None) 


plt.show() 

Ausgang:

The output of the question image, had to crop out the white