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

这篇具有很好参考价值的文章主要介绍了如何将图片恢复水平位置?图片旋转矫正方法大全,ddddocr作者基于RotNet的旋转验证码深度学习识别模型Rotate-Captcha-Crack。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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预测图片旋转角度,可用于破解百度旋转验证码

测试效果:

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

本仓库实现了三类模型:

名称 Backbone 损失函数 跨域测试误差(越小越好) 大小(MB)
RotNet ResNet50 交叉熵 1.1548° 92.7
RotNetR RegNetY 3.2GFLOPs 交叉熵 1.2825° 69.8
RCCNet_v0_5 RegNetY 3.2GFLOPs MSE+余弦修正 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

相关文章

吾爱破解 - 简单聊聊旋转验证码攻防文章来源地址https://www.toymoban.com/news/detail-478836.html

到了这里,关于如何将图片恢复水平位置?图片旋转矫正方法大全,ddddocr作者基于RotNet的旋转验证码深度学习识别模型Rotate-Captcha-Crack的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 旋转图片两种方法

    这两种方法在旋转图像时,可能会产生一些不同的效果: rotate_image_new()旋转后的图像完全包含旋转前的内容,并且填充边界尽可能小 rotate_image() 保持原始图像的大小,并根据填充选项决定是否填充边界为白色。如果 if_fill_white 参数为 True,则填充边界为白色;否则,边界将保

    2024年02月11日
    浏览(27)
  • 图片矫正

            在平面图片处理时,因为镜头角度等原因,容易导致图像出现倾斜、变形等情况。为了方便后续处理常常需要进行图像矫正,其中主要技术原理是两种变换类型--仿射变换( Affine Transformation )和透视变换( Perspective Transformation )。         仿射变换是二维坐标间的

    2024年02月12日
    浏览(29)
  • ppt批量删除每页相同位置文稿(图片文字等)的方法

    第一步:打开视图-宏 第二步:输入宏名(可以是人以文字、字母或数字加字母,但不能是纯数字) 第三步:点击创建 第四步:复制以下文字 第五步:删除原来的“宏代码” 第六步:将复制的文字粘贴到打开的“宏代码”空白处 第七步:关闭或最小化“宏代码”文档 第八

    2024年02月16日
    浏览(114)
  • Uniapp 调用 原生安卓方法 使用cv 实现图片人脸识别 返回人脸位置和人脸数量

    效果: 安卓方法代码 uniapp代码

    2024年04月17日
    浏览(38)
  • 一文通透位置编码:从标准位置编码、欧拉公式到旋转位置编码RoPE

    关于位置编码和RoPE  应用广泛,是很多大模型使用的一种位置编码方式,包括且不限于LLaMA、baichuan、ChatGLM等等 我之前在本博客中的另外两篇文章中有阐述过(一篇是关于LLaMA解读的,一篇是关于transformer从零实现的),但自觉写的不是特别透彻好懂 再后来在我参与主讲的类C

    2024年02月08日
    浏览(52)
  • 电脑数据丢失如何恢复?最常见的2种数据恢复方法!

    大家使用电脑的时候是否有发生过不小心删除数据,或者数据不明丢失的情况呢?相信九成都是有的,那么当你的数据不小心删除或是丢失的话,有没有电脑数据恢复方法?其实很多人当自己电脑的数据丢失后,如果不是很重要的数据都会直接放弃找回,重新下载新的,也有

    2024年02月10日
    浏览(42)
  • RoPE(旋转式位置编码)

    出发点:“通过绝对位置编码的方式实现相对位置编码” 1.假设一个函数f()通过他能让q,k带上绝对位置信息 对q,k进行操作(f())使得他们带上位置m,n的绝对位置信息, 通过内积后,希望结果带上相对位置信息,因此假设存在下列恒等关系 2.根据以上的恒等式求出f()

    2024年02月11日
    浏览(49)
  • iPhone如何恢复出厂设置?苹果手机恢复出厂设置教程【3种方法】

    如果你的iPhone用了很长时间,觉得卡顿、速度慢,这时可以将iPhone恢复出厂设置。 那么,怎样才可以将苹果手机恢复出厂设置呢?接下来小编就给大家介绍将iPhone或iPad恢复出厂设置的详细操作方法。 如果你的iPhone可以开机并正常使用,可以进入【设置】-【通用】-【还原】

    2024年02月09日
    浏览(66)
  • 荣耀路由2S如何恢复出厂设置?荣耀路由2S恢复出厂设置的方法介绍

    荣耀路由2S不仅功能多种多样,每一个功能的设置方法也非常多,就连恢复出厂设置的方法也有三种。下面小编将这款荣耀路由2S恢复出厂设置的方法一一告诉大家,快来看看吧! 荣耀路由2S恢复出厂设置的方法介绍 方法一:路由器机身恢复出厂设置 华为路由2S的三个WAN/LAN接

    2024年02月07日
    浏览(37)
  • 一文通透位置编码:从标准位置编码、旋转位置编码RoPE到ALiBi、LLaMA 2 Long

    关于位置编码和RoPE  应用广泛,是很多大模型使用的一种位置编码方式,包括且不限于LLaMA、baichuan、ChatGLM等等 我之前在本博客中的另外两篇文章中有阐述过(一篇是关于LLaMA解读的,一篇是关于transformer从零实现的),但自觉写的不是特别透彻好懂 再后来在我参与主讲的类C

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包