如何将图片恢复水平位置?图片旋转矫正方法大全,ddddocr作者基于RotNet的旋转验证码深度学习识别模型Rotate-Captcha-Crack

news2024/11/26 1:43:33

基于边缘检测的图像旋转校正模型:

该模型首先使用边缘检测算法对图像进行边缘检测,然后找到边缘上的直线,并计算直线的角度。最后通过旋转图像来校正图像的角度。

import cv2
import numpy as np

# 加载图像
img = cv2.imread('skewed_image.jpg')

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 使用Canny算子查找边缘
edges = cv2.Canny(gray, 50, 150, apertureSize=3)

# 查找直线并计算旋转角度
lines = cv2.HoughLines(edges, 1, np.pi/180, 100)
angle = np.mean(lines[:, 0, 1]) * 180 / np.pi - 90

# 旋转图像进行校正
(rows, cols) = img.shape[:2]
center = (cols / 2, rows / 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
result = cv2.warpAffine(img, M, (cols, rows), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

# 显示图像
cv2.imshow('Original', img)
cv2.imshow('Corrected', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

基于Hough变换的图像旋转校正模型:

该模型基于Hough变换算法来检测图像中的直线,并计算直线角度,然后使用旋转矩阵将图像旋转到正确的角度。

import cv2
import numpy as np

# 加载图像
img = cv2.imread('skewed_image.jpg')

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 使用Canny算子查找边缘
edges = cv2.Canny(gray, 50, 150, apertureSize=3)

# 进行Hough变换,查找直线
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)

# 找到最长的线
max_len = 0
for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))
    length = np.sqrt((x1 - x2)**2 + (y1 - y2)**2)
    if length > max_len:
        max_len = length
        longest_line = [x1, y1, x2, y2]

# 计算旋转角度
dx = longest_line[2] - longest_line[0]
dy = longest_line[3] - longest_line[1]
angle = np.degrees(np.arctan2(dy, dx))

# 进行旋转校正
rows, cols = img.shape[:2]
rotation_matrix = cv2.getRotationMatrix2D((cols/2, rows/2), angle, 1)
result = cv2.warpAffine(img, rotation_matrix, (cols, rows), flags=cv2.INTER_CUBIC)

# 显示图像
cv2.imshow('Original Image', img)
cv2.imshow('Rotated Image', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

基于模板匹配的图像旋转校正模型:

该模型使用图像的局部特征来找到最优旋转角度,其主要思想是通过旋转图像来将其与预定义的模板进行匹配,并找到最小的匹配差异度,从而确定最优旋转角度。

import cv2
import numpy as np

# 加载图像和模板
img = cv2.imread('skewed_image.jpg')
template = cv2.imread('template.jpg', 0)

# 计算模板的旋转矩阵
(h, w) = template.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, 45, 1.0)

# 旋转模板并计算SIFT特征点
template = cv2.warpAffine(template, M, (w, h))
sift = cv2.SIFT_create()
(kps, descs) = sift.detectAndCompute(template, None)

# 计算图像的SIFT特征点并进行匹配
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(kps2, descs2) = sift.detectAndCompute(gray, None)
bf = cv2.BFMatcher()
matches = bf.match(descs, descs2)

# 找到最优旋转矩阵
matches = sorted(matches, key=lambda x:x.distance)
src_pts = np.float32([kps[m.queryIdx].pt for m in matches])
dst_pts = np.float32([kps2[m.trainIdx].pt for m in matches])
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
theta = -np.degrees(np.arctan2(M[0, 1], M[0, 0]))

# 旋转图像进行校正
(rows, cols) = img.shape[:2]
center = (cols / 2, rows / 2)
M = cv2.getRotationMatrix2D(center, theta, 1.0)
result = cv2.warpAffine(img, M, (cols, rows), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

# 显示图像
cv2.imshow('Original', img)
cv2.imshow('Corrected', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

基于特征点匹配的图像旋转校正模型:

该模型首先使用特征点检测算法来检测图像中的关键点,并计算其描述子。然后,通过计算两个图像的特征点之间的距离和实现旋转角度的估计和校正。

import cv2
import numpy as np

# 加载图像
img = cv2.imread('skewed_image.jpg')

# 使用SIFT特征点检测算法检测图像的关键点
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img,None)

# 旋转图像并使用同样的方法检测关键点
[h, w] = img.shape[:2]
M = cv2.getRotationMatrix2D((w/2,h/2),45,1.0)
img_rot = cv2.warpAffine(img,M,(w,h))
kp2, des2 = sift.detectAndCompute(img_rot,None)

# 匹配关键点并计算旋转角度
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
good = []
for m, n in matches:
    if m.distance < 0.5 * n.distance:
        good.append(m)
src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
dst_pts = np.float32([kp2[m.trainIdx.pt for m in good]).reshape(-1, 1, 2)
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
theta = -np.degrees(np.arctan2(M[0, 1], M[0, 0]))

#旋转图像进行校正
(rows, cols) = img.shape[:2]
center = (cols / 2, rows / 2)
M = cv2.getRotationMatrix2D(center, theta, 1.0)
result = cv2.warpAffine(img, M, (cols, rows), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

#显示图像
cv2.imshow('Original', img)
cv2.imshow('Corrected', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上两种方法的实现示例,使用OpenCV中的函数和库实现。其中基于模板匹配的方法旋转图像到与模板最佳匹配的角度,而基于特征点匹配的方法检测图像和旋转后的图像之间的关键点差异,并估计出最佳的旋转角度进行校正。这两个方法都可以在一定程度上对图像进行旋转校正,但需要注意的是,如果图像中的旋转角度过大或存在严重的非线性扭曲,则可能会降低这两种方法的效果。因此,在选择适当的图像旋转校正方法时,应考虑到具体应用场景,以及旋转程度和所需校正的精度等因素。
上述四种模型都可以用于图像旋转校正,但它们的优点和缺点各不相同,需要根据具体应用场景选择合适的模型。

https://www.python.org/downloads/windows/

ddddocr作者的旋转验证码识别模型Rotate-Captcha-Crack

Rotate-Captcha-Crack

https://github.com/Starry-OvO/rotate-captcha-crack

中文 | English

CNN预测图片旋转角度,可用于破解百度旋转验证码

测试效果:

test_result

本仓库实现了三类模型:

名称Backbone损失函数跨域测试误差(越小越好)大小(MB)
RotNetResNet50交叉熵1.1548°92.7
RotNetRRegNetY 3.2GFLOPs交叉熵1.2825°69.8
RCCNet_v0_5RegNetY 3.2GFLOPsMSE+余弦修正42.7774°68.7

RotNetd4nst/RotNet的PyTorch实现。RotNetR仅在RotNet的基础上替换了backbone,并将分类数减少至180。其在谷歌街景数据集上训练64个epoch(耗时2小时)得到的平均预测误差为1.2825°。目前RCCNet_v0_5效果较差,推荐使用RotNetR

跨域测试使用谷歌街景/Landscape-Dataset作为训练集,百度验证码作为测试集(特别鸣谢@xiangbei1997)

演示用到的百度验证码图片来自RotateCaptchaBreak

体验已有模型

准备环境

  • 支持CUDA10+的GPU(如需训练则显存还需要不少于4G)

  • 确保你的Python版本>=3.8 <3.11

  • 确保你的PyTorch版本>=1.11

  • 拉取代码并安装依赖库

git clone --depth=1 https://github.com/Starry-OvO/rotate-captcha-crack.git
cd ./rotate-captcha-crack
pip install .

注意不要漏了install后面那个.

  • 或者,使用虚拟环境
git clone --depth=1 https://github.com/Starry-OvO/rotate-captcha-crack.git
python -m venv ./rotate-captcha-crack --system-site-packages
cd ./rotate-captcha-crack
# 根据你的Shell类型挑选一个合适的脚本激活虚拟环境 例如./Script/Active.ps1
python -m pip install -U pip
pip install .

下载预训练模型

下载Release中的压缩包并解压到./models文件夹下

文件目录结构类似./models/RCCNet_v0_5/230228_20_07_25_000/best.pth

本项目仍处于beta阶段,模型名称会频繁发生变更,因此出现任何FileNotFoundError请先尝试用git回退到对应的tag

输入一个验证码图像并查看旋转效果

如果你的系统没有GUI,尝试把debug方法从显示图像改成保存图像

python test_captcha.py

使用http服务端

  • 安装额外依赖
pip install aiohttp httpx[cli]
  • 运行服务端
python server.py
  • 另开一命令行窗口发送图像
 httpx -m POST http://127.0.0.1:4396 -f img ./test.jpg

训练新模型

准备数据集

  • 我这里直接扒的谷歌街景和Landscape-Dataset,你也可以自己收集一些风景照并放到一个文件夹里,图像没有尺寸要求

  • train.py里配置dataset_root变量指向装有图片的文件夹

  • 不需要手动标注,dataset会在读取图片的同时自动完成矩形裁剪、缩放旋转等工作

训练

python train_RotNetR.py

在测试集上验证模型

python test_RotNetR.py

相关文章

吾爱破解 - 简单聊聊旋转验证码攻防

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/475761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【chatgpt】学习开源项目chatgpt-web,搭建自己的chatgpt服务,功能非常丰富有打字效果

目录 前言1&#xff0c;开源的chatgpt项目2&#xff0c;项目可以直接使用docker-compose跑起来3&#xff0c;关于打字模式SSE&#xff0c; octet-stream &#xff08;打字特效&#xff09;4&#xff0c;关于内容存储5&#xff0c;总结 前言 本文的原文连接是: https://blog.csd…

自动控制原理笔记-根轨迹法

目录 一&#xff0c;根轨迹的基本概念 1.根轨迹的基本概念 2.根轨迹方程 3.根轨迹方程的应用 二&#xff0c;根轨迹的绘制规则 【规则一】根轨迹有n条分支&#xff1a; 【规则二】根轨迹对称于实轴&#xff1a; 【规则三】根轨迹的起点和终点&#xff1a; 【规则四】…

BUUCTF-Web-[极客大挑战 2019]Upload

打开后可以看到是一个可以进行文件上传的页面&#xff0c;如下图所示 查看页面源代码&#xff0c;如下图所示&#xff0c;可以看到有js代码&#xff0c;说明存在前端验证的可能性 上传一个php文件&#xff0c;此处上传shell.php后页面如下图所示&#xff0c;显示不是图片 用bur…

前端存储 Cookie、Web Storage(localStorage 与 sessionStorage)

cookie 由来&#xff1a;cookie 最初的目的是为了维持前端存储的临时状态而产生的。原理&#xff1a; 浏览器发出无状态请求服务器返回响应&#xff0c;携带 cookie 信息浏览器发出接口请求&#xff0c;携带 cookie 信息之后就是前端与服务器建立完成连接后的接口返回了 生成机…

Qt 实现简单的tcp网络通信

文章目录 成品效果图&#xff1a;代码&#xff1a;工具头文件tool.hUI文件代码 ui_widget.h:窗口头文件 widget.h&#xff1a;窗口源文件widget.cpp: 相关代码说明&#xff1a;Qt获取本机ip:Qt 打开&#xff0c;监视服务端端口&#xff1a;Qt 客户端连接服务端&#xff1a;Qt 服…

自建小网站——在idea中如何运行一个vue项目完整过程

这些天Darren洋计划筹建一个属于自己的个人博客空间小网站&#xff0c;其中选择的就是vue项目类型的网站&#xff0c;因为在运行vue项目途中不是特别顺利&#xff0c;现整理了一下流程供大家参考学习。 一、从git上pull一个vue项目 先登录git官网&#xff0c;pull一个vue项目包…

【ElasticSearch】HTTP调用API

文章目录 数据格式HTTP操作索引操作映射操作文档操作(添加数据)高级查询定义数据查询所有文档匹配查询多字段匹配查询关键字精确查询多关键字精确查询指定查询字段过滤字段组合查询范围查询模糊查询*单字段排序多字段排序高亮查询分页查询聚合查询对某个字段取最大值 max对某个…

Channel Distillation: Channel-Wise Attention for Knowledge Distillation 原理与代码解析

paper&#xff1a;Channel Distillation: Channel-Wise Attention for Knowledge Distillation official implementation&#xff1a;https://github.com/zhouzaida/channel-distillation 存在的问题 教师模型传递的知识不够好&#xff0c;学生模型无法准确地从教师模型学习…

java基础语法总复习思维导图 + 重难点+面试题

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 【需要可修改的思维导图可以私信我&#xff0…

Packet Tracer - 静态路由故障排除

Packet Tracer - 静态路由故障排除 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 R1 G0/0 172.31.1.1 255.255.255.128 不适用 S0/0/0 172.31.1.194 255.255.255.252 不适用 R2 G0/0 172.31.0.1 255.255.255.0 不适用 S0/0/0 172.31.1.193 255.255…

Windows server 2012 R2系统怎么安装IIS管理器?

Windows server 2012 R2系统怎么安装IIS管理器&#xff1f;今天飞飞和你分享。服务器大本营&#xff0c;技术文章内容集合站发车啦&#xff01; 首先我们用电脑自带的远程连接桌面工具进入服务器&#xff0c;在任务栏左下角有个服务器管理器&#xff0c;单击打开 打开后在右上…

【致敬未来的攻城狮计划】— 连续打卡第十六天:FSP固件库系统定时器(滴答定时器SysTick)每2秒LED闪烁一次

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

跟着杰哥学强化学习:多臂老虎机问题

多臂老虎机问题 现在有3台外观一模一样的老虎机,每个老虎机的赔率是不同的,摇动一次需要1块钱,现在给你100块钱,如何获取最大的收益。 如果我们知道了每个老虎的赔率,那么只要选择收益最高的那个老虎机就可以了,但现在问题是并不知道每个老虎机的收益。为了简单,我们假…

linux 安装rocketmq

首先准备虚拟机一台 下载linux 64位 jdk1.8(自行百度资源) 下载 | RocketMQ (apache.org) cd /usr/local/ #这是我的本机的现有目录 mkdir rocketmq mkdir jdk 1.借助linux客户端工具,上传刚下载好的jdk安装包到java文件夹 2.借助linux客户端工具,上传刚下载好的二进制安装包…

「C/C++」C/C++软件跨平台思维

博客主页&#xff1a;何曾参静谧的博客 文章专栏&#xff1a;「C/C」C/C学习 目录 相关术语一、编写可移植的代码&#xff1a;二、使用跨平台的C库和框架&#xff1a;三、进行兼容性测试&#xff1a;四、用户界面设计&#xff1a; 相关术语 跨平台思维&#xff1a;是指在软件开…

D-Link DSL-2888A 远程命令执行漏洞(CVE-2020-24581/24579)

漏洞描述 D-Link DSL-2888A AU_2.31_V1.1.47ae55之前版本存在安全漏洞&#xff0c;该漏洞源于包含一个execute cmd.cgi特性(不能通过web用户界面访问)&#xff0c;该特性允许经过身份验证的用户执行操作系统命令。 在该版本固件中同时存在着一个不安全认证漏洞&#xff08;CVE…

【软考网络管理员】2023年软考网管初级常见知识考点(2)- 数据通信技术

【写在前面】也是趁着五一假期前再写几篇分享类的文章给大家&#xff0c;希望看到我文章能给软考网络管理员备考的您带来一些帮助&#xff0c;5月27号也是全国计算机软件考试统一时间&#xff0c;也就不用去各个地方找资料和代码了。紧接着我就把我整理的一些资料分享给大家哈&…

04 KVM虚拟化网络概述

文章目录 04 KVM虚拟化网络概述4.1 Linux Bridge4.2 Open vSwitch 04 KVM虚拟化网络概述 为了使虚拟机可以与外部进行网络通信&#xff0c;需要为虚拟机配置网络环境。KVM虚拟化支持Linux Bridge、Open vSwitch网桥等多种类型的网桥。如图1所示&#xff0c;数据传输路径为“虚…

InstructGPT 论文阅读笔记

目录 简介 数据集 详细实现 实验结果 参考资料 简介 InstructGPT 模型是在论文《Training language models to follow instructions with human feedback》被提出的&#xff0c;OpenAI在2022年1月发布了这篇文章。 论文摘要翻译&#x…

AttributeError: ‘Document‘ object has no attribute ‘pageCount‘ PyMuPDF库

这可能是由于PyMuPDF库更新导致的&#xff0c;里面的一些函数名发生了变化 1. AttributeError: Document object has no attribute pageCount 将 pageCount改为 page_count 2. AttributeError: Matrix object has no attribute preRotate 将preRotate改为prerotate 3.Attribut…