The morphological hit-or-miss operator can detect nodes in a skeleton (green).
When changing the SE, it's possible to extract the end points (blue) of the skeleton ex:
EndPointsBranchedPoints-ConvexHullFails.png
using different kind of pixels configuration (structuring elements):
SE_branchedpoints.png

Several libs provides hit-or-miss operator, and mathematical morphologyl operators:
Iterative morphological erosion on a skeleton or on an edge can gives an anisotropy of a particle:

Spectrum orientation 06.png
I was interested in morphological skeleton to classify binary shapes on their skeleton. A first try can be to prune a skeleton one end points pixel after another:
skelEP.png
to get a kind of end-point spectrum:
spectrum01.png
Of course, it's slow, that's why converting a skeleton into a graph could be useful.

Regarding the edge, opencv provides things such convexhull, convexity (I found it incomplete).
For example to analyse the bending of a contour, skimage provides a polygonal approximation, it's possible to get positive/negative (red/yellow points) "bending" domains of a contour curve:
contour01.png


Le ven. 30 nov. 2018 à 11:48, Deepa <deepamahm.iisc@gmail.com> a écrit :
Just to be clear, I am just looking for  ways of parsing the nodes and edges from the image

Thanks

On Fri, Nov 30, 2018 at 3:06 PM Deepa <deepamahm.iisc@gmail.com> wrote:
I checked the sknw package .
I'm using the input matrix data of the skeleton image that is created using Mathematica.
Here is my code that is written to highlight all the nodes and edges

from skimage.morphology import skeletonize
from skimage import data
import sknw
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as spio
import networkx as nx
from networkx.drawing.nx_pydot import write_dot
mat = spio.loadmat('file.mat', squeeze_me=True)
print(type(mat))
print(type(mat.get('Expression1')))
print(mat.get('Expression1'))
img1 = mat.get('Expression1')
print(img1)
ske = skeletonize(img1).astype(np.uint16)
# build graph from skeleton
graph = sknw.build_sknw(ske)

# draw image
plt.imshow(img1, cmap='gray')

# draw edges by pts
for (s,e) in graph.edges():
    ps = graph[s][e]['pts']
    plt.plot(ps[:,1], ps[:,0], 'green')

# draw node by o
node, nodes = graph.node, graph.nodes()
ps = np.array([node[i]['o'] for i in nodes])
plt.plot(ps[:,1], ps[:,0], 'r.')
#pos = nx.nx_agraph.graphviz_layout(graph)
#print(pos)
#plt.findpath(img1)
# title and show
plt.title('Build Graph')
plt.show()

Please find the input  file.mat file here. Even with sknw package I face the same problem when there are multiple edges.Please the output image attached. Some edges are not highlighted in green.

Could you please suggest how this can be improved?

On Thu, Nov 29, 2018 at 7:33 PM <imagepy@sina.com> wrote:
please see my mail earlier,skan and sknw on github.


----- 原始邮件 -----
发件人: Leena Chourey<leenagour@gmail.com>
收件人: Mailing list for scikit-image (http://scikit-image.org)<scikit-image@python.org>
主题: [scikit-image] Re: Converting an image to a skeleton
日期: 2018-11-29 19:40

I need solution for same. Pls share.

On Thu, 29 Nov 2018, 16:37 Deepa, <deepamahm.iisc@gmail.com> wrote:

I would like to generate a skeleton out of an image. The resulting output of the skeleton image has disconnected edges. 

import skimage
from skimage import data,io,filters
import numpy as np
import cv2
import matplotlib.pyplot as plt
from skimage.filters import threshold_adaptive,threshold_mean
from skimage.morphology import binary_dilation
from skimage import feature
from skimage.morphology import skeletonize_3d

imgfile = "Bagah.jpeg"
im = cv2.imread(imgfile)
image = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
thresh = threshold_mean(image)
thresh = threshold_mean(thresh)

binary = image > thresh
#dilate = skimage.morphology.binary_dilation(binary)
gaussian = skimage.filters.gaussian(binary)
edges = filters.sobel(gaussian)
#dilate = feature.canny(edges)#binary,sigma=0)
skeleton = skeletonize_3d(gaussian)#binary)
fig, axes = plt.subplots(nrows=2,ncols=2, figsize=(8, 2))

ax = axes.ravel()
ax[0].imshow(gaussian, cmap=plt.cm.gray)

ax[0].set_title('gaussian')

ax[1].imshow(skeleton, cmap=plt.cm.gray)
ax[1].set_title('skeleton')

for a in ax:
 a.axis('off')

plt.show()

Please find the attachments of my input and output files.
I would like to translate this skeleton into a graph with nodes and edges.

Could someone suggest how to obtain a skeleton with connected edges?

I’m protected online with Avast Free Antivirus. Get it here — it’s free forever.

_______________________________________________
 scikit-image mailing list -- scikit-image@python.org
 To unsubscribe send an email to scikit-image-leave@python.org

_______________________________________________
scikit-image mailing list -- scikit-image@python.org
To unsubscribe send an email to scikit-image-leave@python.org

来自新浪邮箱触屏版

_______________________________________________
scikit-image mailing list -- scikit-image@python.org
To unsubscribe send an email to scikit-image-leave@python.org
_______________________________________________
scikit-image mailing list -- scikit-image@python.org
To unsubscribe send an email to scikit-image-leave@python.org


--
http://dip4fish.blogspot.fr/
Dedicated to Digital Image Processing for FISH, QFISH and other things about the telomeres.