引言

在做图像处理方面的毕设,希望在正式处理图像之前先把图像处理得比较“正”,比如对下面的图片,希望它是堂正的,就不用歪着头看。所以用python的cv库写了一个自动矫正的程序。

注意

:为了让图像和背景尽量区别,最好使用纯黑的背景(比如黑衣服,还能吸光)

步骤

1.提取目标的边界,比如课本
2.将边界之内的部分填充白色,那么这张图片就变成了掩码
3.根据掩码,将原来的图片扣到新的图片里
4.根据边界的轮廓得到它的最小外接矩形
5.根据矩形的偏斜角度,旋转图像

代码

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import cv2def correctImage(path):img = cv2.imread('test2.bmp')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)"""将图片转化成二值图像"""ret, binary = cv2.threshold(gray,100,255,cv2.THRESH_BINARY)  """*** cv2.finContours 函数能求取图像的边界,返回的第一个值是用list存储的边界的数组每个边界又有多个点来组成*** cv2.RETR_EXTERNAL 参数的含义是仅求取外围的边界"""contours, hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)  """*** 下面的循环遍历了边界,找到含有最多点的那个边界的下标*** 这是我观察发现的(没有科学的论证),有其中一个边界的点是最多的,基本能通过这个边界画出物体的轮廓"""m = 0;index = 0for i in range(len(contours)):if len(contours[i]) > m:m = len(contours[i])index = i"""*** cv2.minAreaRect 函数能根据点集求最小的外接矩形(rect, rect[0] = 矩形中心, rect[1] = 矩形长和宽, rect[3] = 矩形的角度)角度的大小是[0,90], 表示的是x轴逆时针旋转到与rect的一边重合的角度,重合的那条边是举行的宽。"""rect = cv2.minAreaRect(contours[index])"""*** cv2.drawContours(  #函数能将边界画到图像里binary,            #第一个参数是目标图像contours=contours, #边界集contourIdx=-1,     #选择的边界的序号,-1表示选择集合内的所有的边界thickness=-1,      #表示边界内的图形的填充方式,-1表示filled方式,也就是填满颜色color=(255) )      #表示填充的颜色,255表示填充白色"""dst = np.zeros((img.shape))cv2.drawContours(binary,contours=contours,contourIdx=-1,color=(255),thickness=-1)"""cv2.copyTo(src,mask) 根据mask(掩码)来将img填充到dst"""dst = cv2.copyTo(img,binary)"""*** cv2.getRotationMatrix2D( #根据输入的参数,返回旋转矩阵(因为对图像的旋转操作是采用的矩阵相乘)centry, #旋转中心angel,  #旋转角度scale   #缩放)*** cv2.warpAffine(对图像进行旋转和缩放1st, #输入图像2sc, #旋转矩阵3rd, #输出图像大小4th, #输出5th, #flag6th  #填充颜色)"""angel = abs(rect[2])if angel > 60:angel = 90 - angelmat = cv2.getRotationMatrix2D(rect[0],angel, 1)rotimg = np.zeros((img.shape))rotimg = cv2.warpAffine(dst,mat,(img.shape[1],img.shape[0]),rotimg,1,0)im1 = imgim2 = binaryim3 = dstim4 = rotimgplt.subplot(2,2,1),plt.title('source')plt.imshow(im1,)plt.subplot(2,2,2),plt.title('contours')plt.imshow(im2,'gray')plt.subplot(2,2,3),plt.title('cppyTo')plt.imshow(im3)plt.subplot(2,2,4),plt.title('final')plt.imshow(im4)plt.show()correctImage('')

结果

第一张是原图,第二张是提取到的源码
第三张是根据掩码得到的填充
第四章是最终的旋转后的图形
左下角有一点缺陷,如果多几个灯光应该可以改正,总体效果还可以

参考

https://www.cnblogs.com/skyfsm/p/6902524.html

图像自动裁剪和角度矫正相关推荐

  1. python自动裁剪图片_自动裁剪与Python / PIL的图像(Automatically cropping an ima

    谁能帮我弄清楚发生了什么事在我的图像自动裁剪脚本? 我有一个大的透明区域/空间PNG图像. 我想能够自动裁剪那个空间出来,剩下的要领. 原始图像具有正方形画布,最好这将是长方形的,只是封装分子. 这里 ...

  2. Python使用matplotlib保存图像时发生自动裁剪丢了部分标签信息解决方案(plt.savefig保存时丢失了部分标签字符)

    Python使用matplotlib保存图像时发生自动裁剪丢了部分标签信息解决方案(plt.savefig保存时丢失了部分标签字符) 目录

  3. 计算摄影 | 计算机如何学会自动裁剪图片(自动构图)?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 1 自动构图基础 1.1 什么是构图 自动裁剪用摄影的话语来说,就 ...

  4. 【计算摄影】计算机如何学会自动裁剪图片(自动构图)?

    大家好,这是专栏<计算摄影>的第三篇文章,这一个专栏来自于计算机科学与摄影艺术的交叉学科.今天我们讨论的问题是图像的自动裁剪/自动构图问题. 作者&编辑 | 言有三 1 自动构图基 ...

  5. 关于运用毫米波雷达图像自动检测高压线的调查研究

    关于运用毫米波雷达图像自动检测高压线的调查研究 ◆电子科技大学格拉斯哥学院2017级沈晨(2017200601035) [摘要]为了保证直升机驾驶中的安全,我们迫切需要制造出一款直升机高压线自动侦测报 ...

  6. python实现图像自动Gamma校正

    python实现图像自动Gamma校正 前言: 关于Gamma: Gamma校正是对动态范围内亮度的非线性存储/还原算法,即输入值进行的非线性操作,使输出值与输入值呈指数关系:从效果上来说Gamma校 ...

  7. python opencv:批量识别拼接图片分界线并进行自动裁剪

    本文主要内容 一 项目概要 二 项目流程 三 图像边缘提取 四 直线检测 五 项目代码 一 项目概要 在网上找图片素材时,有很多的图片是长图片,在一张图片上拼接了许多张图片,而很多时候我们需要单张图片 ...

  8. 通过Otsu算法实现条形码的角度矫正matlab仿真

    目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 3.1Otsu算法 3.2 条形码角度矫正 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下: ​ ...

  9. 如何让图片按比例响应式缩放、并自动裁剪的css技巧

    如何让图片按比例响应式缩放.并自动裁剪的css技巧 同时也适用于一些轮播父容器响应式缩放 响应式网站.移动端页面在DIV CSS布局中对于图片列表或图片排版时, 如果想要图片按比例缩放, 最简单的就是 ...

最新文章

  1. 站覆盖范围_你了解无线覆盖范围和穿墙能力吗?别再走进这些误区了
  2. iPhone开发四剑客之《iPhone开发秘籍》
  3. Android的启动脚本–init.rc
  4. Python第五课(字典)
  5. AddMvc 和 AddMvcCore 的区别
  6. CVPR 2020丨MAML-Tracker: 用目标检测思路做目标跟踪? 小样本即可得高准确率
  7. 海龟交易策略要点总结
  8. MCMC:Gibbs 采样(matlab 实现)
  9. centos7 减少/home分区空间,扩大/ 的空间
  10. Spring JDBC 【继承JdbcDaoSupport】
  11. Docker下安装Redis超详细步骤
  12. 记录Android Studio KeyMap 导入的问题
  13. C程序的一个简单错误[Error] ld returned 1 exit status
  14. amd cpu排行_2020英特尔cpu排行_2019 cpu天梯图 intel和amd cpu性能排行
  15. 一块硬盘的爱情故事,好揪心
  16. 怎么关闭win7计算机一键还原系统,win7一键还原按哪个键_win7一键还原
  17. 1. 简明误差卡尔曼滤波器(ESKF)及其推导过程
  18. Python - 面向对象编程
  19. 如何利用Dpabi,AFNI,FSL软件计算种子点的功能连接?
  20. 酒店网站建设需要多少钱

热门文章

  1. iPhone X适配 最简单粗暴的
  2. 海龟交易法则11_历史测试的谎言
  3. 2022年12月10日作业
  4. sql查询数据表某列的重复值并计数
  5. 最新系统漏洞--Google TensorFlow拒绝服务漏洞
  6. Oracle:获取数据库系统的当前时间
  7. linux获取系统信息(sysinfo函数的使用)
  8. Nginx负载均衡策略 - least_conn 最少连接
  9. POJ 1265 Area
  10. ubuntu 12.04 从硬盘安装过程