1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| def find_fish_kmeans(image): kernel = np.ones((5, 5), np.uint8) img = image.copy() if image is None: print("图像加载错误") sys.exit() else: if len(np.shape(image)) != 3: print("不是多通道图片,请确认图像类型") sys.exit() else: m, n, _ = np.shape(img) Z = np.float32(img.reshape((-1, 3))) print("Z的尺寸为[{}]".format(np.shape(Z))) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) K = 4 ret, label, center = cv2.kmeans( Z, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS) center = np.uint8(center) print("中心点坐标为") print(center) print("label的尺寸为[{}]".format(np.shape(label.flatten()))) img1 = center[label.flatten()] img1_kmeans = img1.reshape((img.shape)) center_zero = np.float32(center) red_max = (center_zero[0][2] - (center_zero[0] [0] + center_zero[0][1]) / 2.0) print red_max idmax = 0 for i in range(1, K): print(center_zero[i][2] - (center_zero[i] [0] + center_zero[i][1]) / 2.0) if (center_zero[i][2] - (center_zero[i][0] + center_zero[i][1]) / 2.0) > red_max: red_max = (center_zero[i][ 2] - (center_zero[i][0] + center_zero[i][1]) / 2.0) idmax = i zero = np.zeros(np.shape(center)) zero[idmax] = center[idmax] print("选取第[{}]类为鱼".format(idmax + 1)) print("坐标值为") print(zero) img2 = zero[label.flatten()] img2_kmeans = img2.reshape((img.shape)) return img1_kmeans, img2_kmeans, center, label
|