当前位置: 首页 > 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)

相关文章:

  • linux-touch指令
  • 重学java 71.网络编程
  • 【AI开发】CRAG、Self-RAG、Adaptive-RAG
  • 服务器----阿里云服务器重启或关机,远程连接进不去,个人博客无法打开
  • Unity API学习之资源的动态加载
  • 作者推荐 | 探索分析从起源到现今的巅峰之旅(MySQL存储模型)
  • java如何分割字符串
  • 04 远程访问及控制
  • 如何定义和衡量一个产品的成功?
  • 复旦发布开源版本的EMO,只需输入一段音频和一张照片就可以让人物开始说话。
  • 50etf期权交易规则杠杆怎么计算?
  • 16.RedHat认证-Ansible自动化运维(中)
  • 苹果Mac电脑遭恶意软件攻击 Mac第三方恶意软件删除不了
  • rtthread stm32h743的使用(九)RT_WEAK报错
  • 手写操作系统
  • JavaScript-如何实现克隆(clone)函数
  • 0x05 Python数据分析,Anaconda八斩刀
  • Idea+maven+scala构建包并在spark on yarn 运行
  • javascript 哈希表
  • Java面向对象及其三大特征
  • Js基础——数据类型之Null和Undefined
  • nginx 负载服务器优化
  • PHP CLI应用的调试原理
  • React中的“虫洞”——Context
  • SQL 难点解决:记录的引用
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 解决iview多表头动态更改列元素发生的错误
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 面试总结JavaScript篇
  • 深入浅出webpack学习(1)--核心概念
  • 数据仓库的几种建模方法
  • 系统认识JavaScript正则表达式
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • Prometheus VS InfluxDB
  • ​​​​​​​​​​​​​​Γ函数
  • #1014 : Trie树
  • #pragma pack(1)
  • #VERDI# 关于如何查看FSM状态机的方法
  • #控制台大学课堂点名问题_课堂随机点名
  • (12)Linux 常见的三种进程状态
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (五)c52学习之旅-静态数码管
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)我也是一只IT小小鸟
  • (转载)OpenStack Hacker养成指南
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .Net mvc总结
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @拔赤:Web前端开发十日谈
  • @软考考生,这份软考高分攻略你须知道
  • [ NOI 2001 ] 食物链
  • [AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性