import cv2
import numpy as np
import matplotlib.pylab as pylab
from skimage.segmentation import (morphological_chan_vese,morphological_geodesic_active_contour,inverse_gaussian_gradient, checkerboard_level_set)
#定义存储迭代函数
def store_evolution_in(lst):
def _store(x):
lst.append(np.copy(x))
return _store
img=cv2.imread('C:/Users/xpp/Desktop/Lena.png')#原始图像
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将彩色图片转换为灰度图片
gimage=inverse_gaussian_gradient(gray)
init_lvl_set=np.zeros(gray.shape,dtype=np.int8)
init_lvl_set[10:-10, 10:-10]=1
evolution=[]
callback=store_evolution_in(evolution)#存储迭代
lvl_set=morphological_chan_vese(gray,30,init_level_set=init_lvl_set,smoothing=3,iter_callback=callback)
fig,axes=pylab.subplots(2,1,figsize=(8,6))
axes=axes.flatten()
set=morphological_geodesic_active_contour(gimage,400,init_lvl_set,smoothing=1,balloon=-1,threshold=0.7,iter_callback=callback)
axes[0].imshow(img,cmap="gray")
axes[0].set_axis_off()
axes[0].contour(lvl_set,[0.5],colors='r')
axes[0].set_title("Morphological GAC segmentation",fontsize=12)
axes[1].imshow(lvl_set,cmap="gray")
axes[1].set_axis_off()
contour=axes[1].contour(evolution[100],[0.5],colors='g')
contour.collections[0].set_label("Iteration 100")
contour=axes[1].contour(evolution[200], [0.5], colors='y')
contour.collections[0].set_label("Iteration 200")
contour = axes[1].contour(evolution[-1], [0.5], colors='r')
contour.collections[0].set_label("Iteration " + str(len(evolution)-1))
axes[1].legend(loc="upper right")
axes[1].set_title("Morphological GAC evolution",fontsize=12)
fig.tight_layout()
pylab.show()
算法:形态学测地线活动轮廓(MorphGAC,morphological geodesic active contour)是指一组用于图像分割的方法(类似于活动轮廓算法)。形态学蛇算法比活动轮廓算法更快且在数值上更稳定,因为它们在二进制数组上使用形态学运算符(如膨胀/腐蚀),而活动轮廓算法是在浮点数组上求解偏微分方程。
本文分享自 图像处理与模式识别研究所 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!