±à¼ÍƼö: |
À´Ô´phpÖÐÎÄÍø
,ÕâÆªÎÄÕÂÖ÷Òª½éÉÜÁËpythonÊý×ÖͼÏñ´¦ÀíÖ®¹Ç¼ÜÌáÈ¡Óë·ÖË®ÁëËã·¨£¬ÏÖÔÚ·ÖÏí¸ø´ó¼Ò£¬Ò²¸ø´ó¼Ò×ö¸ö²Î¿¼¡£Ò»Æð¹ýÀ´¿´¿´°É |
|
¹Ç¼ÜÌáÈ¡Óë·ÖË®ÁëËã·¨Ò²ÊôÓÚÐÎ̬ѧ´¦Àí·¶³ë£¬¶¼·ÅÔÚmorphology×ÓÄ£¿éÄÚ¡£
1¡¢¹Ç¼ÜÌáÈ¡
¹Ç¼ÜÌáÈ¡£¬Ò²½Ð¶þֵͼÏñϸ»¯¡£ÕâÖÖËã·¨Äܽ«Ò»¸öÁ¬Í¨ÇøÓòϸ»¯³ÉÒ»¸öÏñËØµÄ¿í¶È£¬ÓÃÓÚÌØÕ÷ÌáÈ¡ºÍÄ¿±êÍØÆË±íʾ¡£
morphology×ÓÄ£¿éÌṩÁËÁ½¸öº¯ÊýÓÃÓڹǼÜÌáÈ¡£¬·Ö±ðÊÇSkeletonize£¨£©º¯ÊýºÍmedial_axis£¨£©º¯Êý¡£ÎÒÃÇÏÈÀ´¿´Skeletonize£¨£©º¯Êý¡£
¸ñʽΪ£ºskimage.morphology.skeletonize(image)
ÊäÈëºÍÊä³ö¶¼ÊÇÒ»·ù¶þֵͼÏñ¡£
Àý1£º
from skimage
import morphology,draw
import numpy as np
import matplotlib.pyplot as plt
#´´½¨Ò»¸ö¶þֵͼÏñÓÃÓÚ²âÊÔ
image = np.zeros((400, 400))
#Éú³ÉÄ¿±ê¶ÔÏó1(°×É«UÐÍ)
image[10:-10, 10:100] = 1
image[-100:-10, 10:-10] = 1
image[10:-10, -100:-10] = 1
#Éú³ÉÄ¿±ê¶ÔÏó2£¨XÐÍ£©
rs, cs = draw.line(250, 150, 10, 280)
for i in range(10):
image[rs + i, cs] = 1
rs, cs = draw.line(10, 150, 250, 280)
for i in range(20):
image[rs + i, cs] = 1
#Éú³ÉÄ¿±ê¶ÔÏó3£¨OÐÍ£©
ir, ic = np.indices(image.shape)
circle1 = (ic - 135)**2 + (ir - 150)**2 <
30**2
circle2 = (ic - 135)**2 + (ir - 150)**2 <
20**2
image[circle1] = 1
image[circle2] = 0
#ʵʩ¹Ç¼ÜËã·¨
skeleton =morphology.skeletonize(image)
#ÏÔʾ½á¹û
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2,
figsize=(8, 4))
ax1.imshow(image, cmap=plt.cm.gray)
ax1.axis('off')
ax1.set_title('original', fontsize=20)
ax2.imshow(skeleton, cmap=plt.cm.gray)
ax2.axis('off')
ax2.set_title('skeleton', fontsize=20)
fig.tight_layout()
plt.show() |
Éú³ÉÒ»·ù²âÊÔͼÏñ£¬ÉÏÃæÓÐÈý¸öÄ¿±ê¶ÔÏ󣬷ֱð½øÐйǼÜÌáÈ¡£¬½á¹ûÈçÏ£º

Àý2£ºÀûÓÃϵͳ×Ô´øµÄÂíͼƬ½øÐйǼÜÌáÈ¡
from skimage
import morphology,data,color
import matplotlib.pyplot as plt
image=color.rgb2gray(data.horse())
image=1-image #·´Ïà
#ʵʩ¹Ç¼ÜËã·¨
skeleton =morphology.skeletonize(image)
#ÏÔʾ½á¹û
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2,
figsize=(8, 4))
ax1.imshow(image, cmap=plt.cm.gray)
ax1.axis('off')
ax1.set_title('original', fontsize=20)
ax2.imshow(skeleton, cmap=plt.cm.gray)
ax2.axis('off')
ax2.set_title('skeleton', fontsize=20)
fig.tight_layout()
plt.show() |

medial_axis¾ÍÊÇÖÐÖáµÄÒâ˼£¬ÀûÓÃÖÐÖá±ä»»·½·¨¼ÆËãǰ¾°£¨1Öµ£©Ä¿±ê¶ÔÏóµÄ¿í¶È£¬¸ñʽΪ£º
skimage.morphology.medial_axis (image,mask=None, return_distance=False)
mask: ÑÚÄ£¡£Ä¬ÈÏΪNone, Èç¹û¸ø¶¨Ò»¸öÑÚÄ££¬ÔòÔÚÑÚÄ£ÄÚµÄÏñËØÖµ²ÅÖ´ÐйǼÜËã·¨¡£
return_distance: boolÐÍÖµ£¬Ä¬ÈÏΪFalse.
Èç¹ûΪTrue, Ôò³ýÁË·µ»Ø¹Ç¼Ü£¬»¹½«¾àÀë±ä»»ÖµÒ²Í¬Ê±·µ»Ø¡£ÕâÀïµÄ¾àÀëÖ¸µÄÊÇÖÐÖáÏßÉϵÄËùÓеãÓë±³¾°µãµÄ¾àÀë¡£
import numpy
as np
import scipy.ndimage as ndi
from skimage import morphology
import matplotlib.pyplot as plt
#±àдһ¸öº¯Êý£¬Éú³É²âÊÔͼÏñ
def microstructure(l=256):
n = 5
x, y = np.ogrid[0:l, 0:l]
mask = np.zeros((l, l))
generator = np.random.RandomState(1)
points = l * generator.rand(2, n**2)
mask[(points[0]).astype(np.int), (points[1]).astype(np.int)]
= 1
mask = ndi.gaussian_filter(mask, sigma=l/(4.*n))
return mask > mask.mean()
data = microstructure(l=64) #Éú³É²âÊÔͼÏñ
#¼ÆËãÖÐÖáºÍ¾àÀë±ä»»Öµ
skel, distance =morphology.medial_axis(data,
return_distance=True)
#ÖÐÖáÉϵĵ㵽±³¾°ÏñËØµãµÄ¾àÀë
dist_on_skel = distance * skel
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8,
4))
ax1.imshow(data, cmap=plt.cm.gray, interpolation='nearest')
#ÓùâÆ×É«ÏÔʾÖÐÖá
ax2.imshow(dist_on_skel, cmap=plt.cm.spectral,
interpolation='nearest')
ax2.contour(data, [0.5], colors='w') #ÏÔʾÂÖÀªÏß
fig.tight_layout()
plt.show() |

2¡¢·ÖË®ÁëËã·¨
·ÖË®ÁëÔÚµØÀíѧÉϾÍÊÇÖ¸Ò»¸öɽ¼¹£¬Ë®Í¨³£»áÑØ×Åɽ¼¹µÄÁ½±ßÁ÷Ïò²»Í¬µÄ¡°»ãË®Å衱¡£·ÖË®ÁëËã·¨ÊÇÒ»ÖÖÓÃÓÚͼÏñ·Ö¸îµÄ¾µäËã·¨£¬ÊÇ»ùÓÚÍØÆËÀíÂÛµÄÊýѧÐÎ̬ѧµÄ·Ö¸î·½·¨¡£Èç¹ûͼÏñÖеÄÄ¿±êÎïÌåÊÇÁ¬ÔÚÒ»ÆðµÄ£¬Ôò·Ö¸îÆðÀ´»á¸üÀ§ÄÑ£¬·ÖË®ÁëËã·¨¾³£ÓÃÓÚ´¦ÀíÕâÀàÎÊÌ⣬ͨ³£»áÈ¡µÃ±È½ÏºÃµÄЧ¹û¡£
·ÖË®ÁëËã·¨¿ÉÒԺ;àÀë±ä»»½áºÏ£¬Ñ°ÕÒ¡°»ãË®ÅèµØ¡±ºÍ¡°·ÖË®Áë½çÏÞ¡±£¬´Ó¶ø¶ÔͼÏñ½øÐзָ¶þֵͼÏñµÄ¾àÀë±ä»»¾ÍÊÇÿһ¸öÏñËØµãµ½×î½ü·ÇÁãÖµÏñËØµãµÄ¾àÀ룬ÎÒÃÇ¿ÉÒÔʹÓÃscipy°üÀ´¼ÆËã¾àÀë±ä»»¡£
ÔÚÏÂÃæµÄÀý×ÓÖУ¬ÐèÒª½«Á½¸öÖØµþµÄÔ²·Ö¿ª¡£ÎÒÃÇÏȼÆËãÔ²ÉϵÄÕâЩ°×É«ÏñËØµãµ½ºÚÉ«±³¾°ÏñËØµãµÄ¾àÀë±ä»»£¬Ñ¡³ö¾àÀë±ä»»ÖеÄ×î´óÖµ×÷Ϊ³õʼ±ê¼Çµã£¨Èç¹ûÊÇ·´É«µÄ»°£¬ÔòÊÇÈ¡×îСֵ£©£¬´ÓÕâЩ±ê¼Çµã¿ªÊ¼µÄÁ½¸ö»ãË®ÅèÔ½¼¯Ô½´ó£¬×îºóÏཻÓÚ·ÖɽÁë¡£´Ó·ÖɽÁë´¦¶Ï¿ª£¬ÎÒÃǾ͵õ½ÁËÁ½¸ö·ÖÀëµÄÔ²¡£
Àý1£º»ùÓÚ¾àÀë±ä»»µÄ·ÖɽÁëͼÏñ·Ö¸î
import numpy
as np
import matplotlib.pyplot as plt
from scipy import ndimage as ndi
from skimage import morphology,feature
#´´½¨Á½¸ö´øÓÐÖØµþÔ²µÄͼÏñ
x, y = np.indices((80, 80))
x1, y1, x2, y2 = 28, 28, 44, 52
r1, r2 = 16, 20
mask_circle1 = (x - x1)**2 + (y - y1)**2 <
r1**2
mask_circle2 = (x - x2)**2 + (y - y2)**2 <
r2**2
image = np.logical_or(mask_circle1, mask_circle2)
#ÏÖÔÚÎÒÃÇÓ÷ÖË®ÁëËã·¨·ÖÀëÁ½¸öÔ²
distance = ndi.distance_transform_edt(image)
#¾àÀë±ä»»
local_maxi =feature.peak_local_max(distance,
indices=False, footprint=np.ones((3, 3)),
labels=image) #ѰÕÒ·åÖµ
markers = ndi.label(local_maxi)[0] #³õʼ±ê¼Çµã
labels =morphology.watershed(-distance, markers,
mask=image) #»ùÓÚ¾àÀë±ä»»µÄ·ÖË®ÁëËã·¨
fig, axes = plt.subplots(nrows=2, ncols=2,
figsize=(8, 8))
axes = axes.ravel()
ax0, ax1, ax2, ax3 = axes
ax0.imshow(image, cmap=plt.cm.gray, interpolation='nearest')
ax0.set_title("Original")
ax1.imshow(-distance, cmap=plt.cm.jet, interpolation='nearest')
ax1.set_title("Distance")
ax2.imshow(markers, cmap=plt.cm.spectral, interpolation='nearest')
ax2.set_title("Markers")
ax3.imshow(labels, cmap=plt.cm.spectral, interpolation='nearest')
ax3.set_title("Segmented")
for ax in axes:
ax.axis('off')
fig.tight_layout()
plt.show() |

·ÖË®ÁëËã·¨Ò²¿ÉÒÔºÍÌݶÈÏà½áºÏ£¬À´ÊµÏÖͼÏñ·Ö¸î¡£Ò»°ãÌݶÈͼÏñÔÚ±ßÔµ´¦ÓнϸߵÄÏñËØÖµ£¬¶øÔÚÆäËüµØ·½ÔòÓнϵ͵ÄÏñËØÖµ£¬ÀíÏëÇé¿ö
Ï£¬·ÖɽÁëÇ¡ºÃÔÚ±ßÔµ¡£Òò´Ë£¬ÎÒÃÇ¿ÉÒÔ¸ù¾ÝÌݶÈÀ´Ñ°ÕÒ·ÖɽÁë¡£
Àý2£º»ùÓÚÌݶȵķÖË®ÁëͼÏñ·Ö¸î
import matplotlib.pyplot
as plt
from scipy import ndimage as ndi
from skimage import morphology,color,data,filter
image =color.rgb2gray(data.camera())
denoised = filter.rank.median(image, morphology.disk(2))
#¹ýÂËÔëÉù
#½«ÌݶÈÖµµÍÓÚ10µÄ×÷Ϊ¿ªÊ¼±ê¼Çµã
markers = filter.rank.gradient(denoised, morphology.disk(5))
<10
markers = ndi.label(markers)[0]
gradient = filter.rank.gradient(denoised, morphology.disk(2))
#¼ÆËãÌݶÈ
labels =morphology.watershed(gradient, markers,
mask=image) #»ùÓÚÌݶȵķÖË®ÁëËã·¨
fig, axes = plt.subplots(nrows=2, ncols=2,
figsize=(6, 6))
axes = axes.ravel()
ax0, ax1, ax2, ax3 = axes
ax0.imshow(image, cmap=plt.cm.gray, interpolation='nearest')
ax0.set_title("Original")
ax1.imshow(gradient, cmap=plt.cm.spectral,
interpolation='nearest')
ax1.set_title("Gradient")
ax2.imshow(markers, cmap=plt.cm.spectral, interpolation='nearest')
ax2.set_title("Markers")
ax3.imshow(labels, cmap=plt.cm.spectral, interpolation='nearest')
ax3.set_title("Segmented")
for ax in axes:
ax.axis('off')
fig.tight_layout()
plt.show() |

|