一种基于OpenCV的图片倾斜矫正方法

需求描述:

对倾斜的图片进行矫正,返回倾斜角度和矫正后的图片。

解决方法:

1、各种角度点被投影到一个累加器阵列中,其中倾斜角度可以定义为在最大化对齐的搜索间隔内的投影角度。

2、以不同的角度旋转图像,并为每次迭代生成像素的直方图。

3、为了确定倾斜角度,比较峰值之间的最大差异,并使用这个倾斜角度,旋转图像来纠正倾斜。

#coding=utf-8
import cv2
import numpy as np

def rotate_image(image, angle):
    (h, w) = image.shape[: 2]
    center = (w // 2, h // 2)
    M = cv2.getRotationMatrix2D(center, angle, 1.0)
    corrected = cv2.warpAffine(image, M, (w, h), flags = cv2.INTER_CUBIC, \
        borderMode = cv2.BORDER_REPLICATE)
    return corrected

def determine_score(arr):
     histogram = np.sum(arr, axis = 2, dtype = float)
     score = np.sum((histogram[..., 1 :] - histogram[..., : -1]) ** 2, \
        axis = 1, dtype = float)
     return score

def correct_skew(image, delta = 0.1, limit = 5):
     thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + \
        cv2.THRESH_OTSU)[1]
     angles = np.arange(-limit, limit + delta, delta)
     img_stack = np.stack([rotate_image(thresh, angle) for angle \
        in angles], axis = 0)
     scores = determine_score(img_stack)
     best_angle = angles[np.argmax(scores)]
     corrected = rotate_image(image, best_angle)
     return best_angle, corrected
if __name__ == "__main__":
    file_path=r'D:/_21.png'
    img = cv2.imread(file_path, 0)
    angle, corrected = correct_skew(img)
    print(angle)
    cv2.imwrite(r'D:/temp_' + file_path.split('/')[-1], corrected)

执行结果:

矫正前:

矫正后:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Excel文件解析

在此模块的学习中,我们需要一个新的开源类库---Apahche POI开源类库。这个类库的用途是:解析并生成Excel文件(Word、ppt)。Apahche POI基于DOM方式进行解析,将文件直接加载到内存,所以速度比较快,适合Excel文件数据量不…

学习经验分享【32】本科/硕士开题报告、中期报告等写作经验分享

本科/硕士阶段首先就是要写开题报告,然后中期报告,这篇博文就是分享一下写报告的经验,避免被老师打回来。本人有丰富的写报告经验,有需要的朋友可添加文末联系方式与我联系。 一、本科开题报告的提纲 课题来源及研究的目的和意义…

js性能优化(五)

第五章开始啦~~~~~~~~~~~~~ 防抖和节流之前自己有学过一次,包括几种方式怎么实现,代码如何写花了两天有写过,这次算是更系统的一个复习加填补 十七、防抖与节流 为什么需要防抖和节流: 在一些高频率事件触发的场景下我们不希望…

51单片机

STC89C52 一.定时器 1.介绍 2.计时 2.定时器寄存器  2.1 定时器控制寄存器TCON  2.2 定时器模式寄存器TMOD  2.3 定时器如何定时10毫秒  2.4 定时器寄存器配置    2.4.1 TCON    2.4.2 TMOD    2.4.3 实现    2.4.5 按位操作 3.定时器中断  3.1 定…

d盘无法格式化说另一个正在使用怎么办

在日常生活和工作中,我们经常会遇到需要对电脑硬盘进行格式化的情况。然而,有时在尝试格式化D盘时,会遇到一个常见的错误提示:“另一个程序正在使用此文件,因此无法进行操作”。这个提示可能会让许多人感到困惑&#x…

《自动机理论、语言和计算导论》阅读笔记:p172-p224

《自动机理论、语言和计算导论》学习第 8 天,p172-p224总结,总计 53 页。 一、技术总结 1.Context-Free Grammar(CFG) 2.parse tree (1)定义 p183,But perhaps more importantly, the tree, known as a “parse tree”, when used in a …

C语言基础入门案例(1)

目录 第一题:实现大衍数列的打印 第二题:生成所有由1、2、3、4组成的互不相同且无重复数字的三位数,并计算总数 第三题:整数加法计算器 第四题:实现一个范围累加和函数 第五题:编写一个函数计算整数的阶…

Vue3基础笔记(3)高级绑定

一.Class绑定 数据绑定的一个常见需求场景师操纵元素的CSS class列表,因为class是attribute,我们可以和其他attribute一样使用v-bind将他们和动态的字符串绑定,但是在处理较为复杂的绑定时,拼接字符串容易出现错误。因此Vue专门为…

ZJJ-2A直流绝缘监视继电器额定电流3.1mA额定电压110VDCJOSEF约瑟

系列型号 JJJ-1绝缘监视继电器; ZJJ-1/A绝缘监视继电器; ZJJ-1A绝缘监视继电器; ZJJ-2型直流绝缘监视继电器 ZJJ-2直流绝缘监视继电器; ZJJ-2B直流绝缘监视继电器; ZJJ-2AC直流绝缘监视继电器; 用途…

【基础物理实验】【AFM虚拟实验】基于AFM的物质表面微观结构及力学性质表征仿真实验(上)【北京航空航天大学】

基于AFM的物质表面微观结构及力学性质表征仿真实验 说明: 本次实验为本科生《基础物理实验》课程中的虚拟实验部分,在虚拟实验平台中进行。 一、实验目的: 1. 掌握AFM的基本成像原理及系统结构; 2. 掌握AFM的基本操作技巧及操…

什么是云安全

云安全和网络安全有所不同,因为云安全一词 比网络安全更涵盖整个企业基础设施。一般来说,当人们提到云安全时,指的是第三方服务提供商提供的 IaaS 云环境。在这种情况下,云安全不仅包括网络安全工具,还包括服务器、容器…

数据结构7:栈

文章目录 头文件Stack.h 实现文件 测试文件test.c 经典题目 头文件 Stack.h #pragma once #include<stdio.h> #include<stdlib.h> #include<string.h> #include<assert.h>#define CAPACITY_INIT 4typedef int STDataType;typedef struct Stack {STDa…

云端运维:我的成长轨迹与荣耀印记

云端运维&#xff1a;我的成长轨迹与荣耀印记 关于博主 ​ 我是一名运维领域的博客平台博主&#xff0c;也是一名对技术充满热情的探索者。在运维这条道路上&#xff0c;我不断积累知识、提升技能&#xff0c;力求将最新的技术理念和实践经验分享给更多志同道合的朋友。我热衷…

Python代码打包成exe程序

国内镜像源 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple阿里云 https://mirrors.aliyun.com/pypi/simple/豆瓣 https://pypi.douban.com/simple/ 百度云 https://mirror.baidu.com/pypi/simple/中科大 https://pypi.mirrors.ustc.edu.cn/simple/华为云 https://mirror…

Jmeter参数化的 4 种方式用法总结

参数化就是用变量代替数据的过程&#xff0c;总结参数化的4种方式&#xff1a; 1、用户自定义变量 用户自定义变更有两种方法&#xff1a; &#xff08;1&#xff09;在测试计划面板中的用户定义的变量设置 说明&#xff1a;在此用户定义的变量对所有测试计划都会生效 &…

家居网购项目(权限验证+事务管理)

文章目录 1.过滤器权限认证1.程序框架图2.web.xml3.编写AdminAuthorization4.编写MemberAuthorization5.细节6.结果展示1.未登录可以任意浏览商品2.点击添加购物车提示登录3.点击后台管理&#xff0c;提示管理员登录4.也做了其余资源的访问验证 2.事务管理1.思路分析2.重写JDBC…

Python数据容器(一)

一.数据容器入门 1.Python中的数据容器&#xff1a;一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为1个元素&#xff0c;每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 2.数据容器根据特点的不同&#xff0c;如&#…

2A大电流线性稳压器具备两种输出电压范围

概述 PCD3931 是一款低噪声、低压差线性稳压器 (LDO)&#xff0c;可提供 2A 输出电流&#xff0c;最大压降仅为 160mV。该器件提供两种输出电压范围。 PCD3931 的输出电压可通过外部电阻分压器在 0.5V 至 5.5V 范围内进行调节。PCD3931 集低噪声、高 PSRR 和高输出电流能力等特…

24年重庆三支一扶报名照不通过怎么处理?

24年重庆三支一扶报名照不通过怎么处理&#xff1f;

消化内科专科护士理论考试案例选择题及答案

电大搜题 多的用不完的题库&#xff0c;支持文字、图片搜题&#xff0c;包含国家开放大学、广东开放大学、超星等等多个平台题库&#xff0c;考试作业必备神器。 公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#…