当前位置: 首页 > news >正文

PCA 在图像分析上的应用

同一物体旋转角度求取

直接上代码:

import cv2, os
import numpy as np
import timedef perform_pca(image, num_components):# 将图像转换为浮点型img_float = np.float32(image)img_flatten = img_float.reshape(-1, 2)# 计算均值和协方差矩阵mean, eigenvectors = cv2.PCACompute(img_flatten, mean=None, maxComponents=num_components)return mean, eigenvectorsdef rotate_coords(coords, theta):"""绕原点旋转坐标点集。参数:coords: 坐标点集,每个元素是一个(x, y)的元组。theta: 旋转角度,以弧度为单位。返回:旋转后的坐标点集。"""# 定义旋转矩阵rotation_matrix = np.array([[np.cos(theta), -np.sin(theta)],[np.sin(theta), np.cos(theta)]])# 将坐标点集转换为NumPy数组以便进行矩阵运算coords_array = np.array(coords)# 应用旋转矩阵rotated_coords = np.dot(coords_array, rotation_matrix)return rotated_coordsdef judge_direction1(mean, vector, center_x, center_y):v = np.array([center_x - mean[0][0], center_y - mean[0][1]])if np.dot(v, vector) < 0:vector = -vectorreturn vectordef judge_direction2(mean, vector, image, img_path):edge_image = cv2.Canny(image, 50, 200)file_name = img_path.split("/")[-1]save_path = "/home/xxx/下载/mask/result/"x_angle = vector_angle(vector,np.array([1, 0]))edge_non_zero_coords = cv2.findNonZero(edge_image)edge_non_zero_coords = edge_non_zero_coords - mean[0]edge_non_zero_coords = rotate_coords(edge_non_zero_coords, np.radians(x_angle))min_x, min_y = np.min(edge_non_zero_coords, axis=0)[0]max_x, max_y = np.max(edge_non_zero_coords, axis=0)[0]new_image = np.zeros((int(max_y-min_y)+1, int(max_x - min_x)+1), np.uint8)for coord in edge_non_zero_coords:x, y = coord[0]new_image[int(y - min_y), int(x - min_x)] = 255# cv2.imwrite(save_path + file_name, new_image)if max_x - min_x > max_y - min_y:if abs(max_x) > abs(min_x):vector = -vectorelse:if abs(max_y) > abs(min_y):vector = -vectorreturn vectordef get_vector(img_path):image = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)h, w = image.shapecenter_x = int(w / 2)center_y = int(h / 2)non_zero_coords = cv2.findNonZero(image)# 执行PCAnum_components = 2mean, eigenvectors = perform_pca(non_zero_coords, num_components)vector = eigenvectors[0]vector = judge_direction2(mean, vector, image, img_path)return vectordef vector_angle(v1, v2):# 计算点积dot_product = np.dot(v1, v2)# 计算向量的模norm_v1 = np.linalg.norm(v1)norm_v2 = np.linalg.norm(v2)# 计算余弦值cos_theta = dot_product / (norm_v1 * norm_v2)# 计算弧度制的夹角theta_rad = np.arccos(np.clip(cos_theta, -1.0, 1.0))# 将弧度制转换为角度制theta_deg = np.degrees(theta_rad)# 确定角度的方向性cross_product = np.cross(v1, v2)if cross_product < 0:theta_deg = 360 - theta_degreturn 360 - theta_degdef get_angle(img_path1, img_path2):vector1 = get_vector(img_path1)vector2 = get_vector(img_path2)angle = vector_angle(vector1, vector2)print(vector1, vector2, angle)return angleif __name__ == "__main__":img_path1 = "/home/xxx/下载/mask/mask3/0.jpg"img_path2 = "/home/xxx/下载/mask/mask3/32.jpg"get_angle(img_path1, img_path2)
http://www.lryc.cn/news/374973.html

相关文章:

  • springboot项目mapper无法自动装配,未找到 ‘userMapper‘ 类型的Bean解决办法.
  • TC3xx A\B SWAP机制的小细节(2)
  • 双绞线(网线)的制作与测试
  • 高效处理海量慢SQL日志文件:Java与JSQLParser去重方案详解
  • 企业内部、与合作伙伴/客户文档协作如何高效安全地收集资料?
  • 用Unity创造自己的绿洲
  • 服务器数据恢复—KVM虚拟机被误删除如何恢复虚拟磁盘文件?
  • 工具清单 - 看板工具
  • Go微服务: 分布式之发送带有事务消息的示例
  • 【go】go初始化命令总结
  • vue音乐播放条
  • halcon实现浓淡补正,中间值补正-抽取暗
  • 太速科技-FMC213V3-基于FMC兼容1.8V IO的Full Camera Link 输入子卡
  • GPU短缺和模型效率的推动
  • linux在文件夹中查找文件内容
  • 算法:11. 盛最多水的容器
  • Hazelcast 分布式缓存 在Seatunnel中的使用
  • 分数限制下,选好专业还是选好学校?
  • 软件改为开机自启动
  • 集群down机的应急和恢复测试(非重做备机)
  • 【数据库系统概论复习】关系数据库与关系代数笔记
  • 赛氪网受邀参加上海闵行区翻译协会年会,共探科技翻译创新之路
  • 项目管理进阶之EVM(挣值管理)
  • PLSQL、Oracle以及客户端远程连接服务器笔记(仅供参考)
  • Win快速删除node_modules
  • 【机器学习】基于顺序到顺序Transformer机器翻译
  • TEA 加密的 Java 实现
  • 鸿蒙开发电话服务:【@ohos.telephony.data (蜂窝数据)】
  • Maven认识与学习
  • “深入探讨Redis主从复制:原理、配置与优化“