介绍
算法介绍上一篇随笔中很详细。
实现和效果
# coding:utf8 import cv2 import numpy as np from skimage import io as sio from skimage.segmentation import felzenszwalb import matplotlib.pyplot as plt from _felzenszwalb_cy import _felzenszwalb_cython def felzenszwalb_test(img,sigma,kernel,k, min_size): # 先使用纹理特征滤波,再计算距离 img = np.asanyarray(img, dtype=np.float) / 255 # rescale scale to behave like in reference implementation k = float(k) / 255. img = cv2.GaussianBlur(img, (kernel, kernel), sigma) height, width = img.shape[:2] num = height * width edges = np.zeros(((height - 1) * width * 2 + height * (width - 1) * 2, 3)) # 使用RGB距离,计算四邻域 index = np.array([i for i in range(height * width)]) index = index.reshape((height, width)) to_left = np.sqrt(((img[:, 1:] - img[:, :-1]) ** 2).sum(axis=2)) to_right = to_left to_up = np.sqrt(((img[1:] - img[:-1]) ** 2).sum(axis=2)) to_down = to_up last, cur = 0, 0 last, cur = cur, cur + (width - 1) * height edges[last: cur, 0] = index[:, 1:].reshape(-1) edges[last: cur, 1] = index[:, :-1].reshape(-1) edges[last: cur, 2] = to_left.reshape(-1) last, cur = cur, cur + (width - 1) * height edges[last: cur, 0] = index[:, :-1].reshape(-1) edges[last: cur, 1] = index[:, 1:].reshape(-1) edges[last: cur, 2] = to_right.reshape(-1) last, cur = cur, cur + (height - 1) * width edges[last: cur, 0] = index[1:].reshape(-1) edges[last: cur, 1] = index[:-1].reshape(-1) edges[last: cur, 2] = to_up.reshape(-1) last, cur = cur, cur + (height - 1) * width edges[last: cur, 0] = index[:-1].reshape(-1) edges[last: cur, 1] = index[1:].reshape(-1) edges[last: cur, 2] = to_down.reshape(-1) # 将边按照不相似度从小到大排序 edges = [edges[i] for i in range(edges.shape[0])] edges.sort(key=lambda x: x[2]) # 构建无向图(树)