1 分割对象
EfficientSAM
https://github.com/yformer/EfficientSAM
2 计算在图像中最高点即y值最小点
import os
import cv2def read_images(folder_path):image_files = [f for f in os.listdir(folder_path) iff.endswith(".jpg") or f.endswith(".png")] # 获取文件夹中所有的jpg和png图片文件sorted_image_files = sorted(image_files, key=lambda x: int(''.join(filter(str.isdigit, os.path.splitext(x)[0]))))images = [] # 用来存储读取的图像for filename in sorted_image_files:# print(filename)image_path = os.path.join(folder_path, filename) # 构建完整的文件路径image = cv2.imread(image_path) # 使用OpenCV库读取图像文件# image = cv2.resize(image, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)images.append(image) # 将图像添加到列表中return imagesdef reprocess_image(img):# 读入图片# for i in range(len(images)):# img = images[i]# 显示图片# 将彩色图片转换成灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化处理# ret, thresh = cv2.threshold(gray, 50, 255, 0)# cv2.imshow("Binary Image", thresh)# cv2.waitKey(0)contour_image = img.copy()# 直接用灰度图寻找轮廓contours, hierarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 二值化处理后的图像再处理轮廓# contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(contour_image, contours, -1, (0, 255, 0), 3)cv2.imshow("contour_image", contour_image)cv2.waitKey(0)return contours, imgdef find_highest_y_point(contours, img):_highest_point = (0, 0)max_y = img.shape[0]for contour in contours:for point in contour:if point[0][1] < max_y:max_y = point[0][1]_highest_point = (point[0][0], point[0][1])# print(highest_point[0])# print(highest_point[1])# 在图像上标记最高点cv2.circle(img, _highest_point, 5, (0, 0, 255), -1)# 显示结果cv2.imshow('Highest Point', img)cv2.waitKey(0)cv2.destroyAllWindows()return _highest_pointif __name__ == '__main__':folder_path = "final-images" # 替换为你的文件夹路径highest_point = (0, 0)real_highest_y = 300if(read_images(folder_path) is not None):print("读取成功")print(len(read_images(folder_path)))for _image in read_images(folder_path):contours, img = reprocess_image(_image)highest_point = find_highest_y_point(contours, img)real_highest_y = img.shape[0] - highest_point[1]real_highest_y *= 0.25# print("最高点坐标:", highest_point)# print("最高点x坐标:", highest_point[0])# print("最高点y坐标:", highest_point[1])print(real_highest_y)else:print("读取失败")
分割后的图像
结果