图像自动裁剪和角度矫正
引言
在做图像处理方面的毕设,希望在正式处理图像之前先把图像处理得比较“正”,比如对下面的图片,希望它是堂正的,就不用歪着头看。所以用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
图像自动裁剪和角度矫正相关推荐
- python自动裁剪图片_自动裁剪与Python / PIL的图像(Automatically cropping an ima
谁能帮我弄清楚发生了什么事在我的图像自动裁剪脚本? 我有一个大的透明区域/空间PNG图像. 我想能够自动裁剪那个空间出来,剩下的要领. 原始图像具有正方形画布,最好这将是长方形的,只是封装分子. 这里 ...
- Python使用matplotlib保存图像时发生自动裁剪丢了部分标签信息解决方案(plt.savefig保存时丢失了部分标签字符)
Python使用matplotlib保存图像时发生自动裁剪丢了部分标签信息解决方案(plt.savefig保存时丢失了部分标签字符) 目录
- 计算摄影 | 计算机如何学会自动裁剪图片(自动构图)?
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 1 自动构图基础 1.1 什么是构图 自动裁剪用摄影的话语来说,就 ...
- 【计算摄影】计算机如何学会自动裁剪图片(自动构图)?
大家好,这是专栏<计算摄影>的第三篇文章,这一个专栏来自于计算机科学与摄影艺术的交叉学科.今天我们讨论的问题是图像的自动裁剪/自动构图问题. 作者&编辑 | 言有三 1 自动构图基 ...
- 关于运用毫米波雷达图像自动检测高压线的调查研究
关于运用毫米波雷达图像自动检测高压线的调查研究 ◆电子科技大学格拉斯哥学院2017级沈晨(2017200601035) [摘要]为了保证直升机驾驶中的安全,我们迫切需要制造出一款直升机高压线自动侦测报 ...
- python实现图像自动Gamma校正
python实现图像自动Gamma校正 前言: 关于Gamma: Gamma校正是对动态范围内亮度的非线性存储/还原算法,即输入值进行的非线性操作,使输出值与输入值呈指数关系:从效果上来说Gamma校 ...
- python opencv:批量识别拼接图片分界线并进行自动裁剪
本文主要内容 一 项目概要 二 项目流程 三 图像边缘提取 四 直线检测 五 项目代码 一 项目概要 在网上找图片素材时,有很多的图片是长图片,在一张图片上拼接了许多张图片,而很多时候我们需要单张图片 ...
- 通过Otsu算法实现条形码的角度矫正matlab仿真
目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 3.1Otsu算法 3.2 条形码角度矫正 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下: ...
- 如何让图片按比例响应式缩放、并自动裁剪的css技巧
如何让图片按比例响应式缩放.并自动裁剪的css技巧 同时也适用于一些轮播父容器响应式缩放 响应式网站.移动端页面在DIV CSS布局中对于图片列表或图片排版时, 如果想要图片按比例缩放, 最简单的就是 ...
最新文章
- 站覆盖范围_你了解无线覆盖范围和穿墙能力吗?别再走进这些误区了
- iPhone开发四剑客之《iPhone开发秘籍》
- Android的启动脚本–init.rc
- Python第五课(字典)
- AddMvc 和 AddMvcCore 的区别
- CVPR 2020丨MAML-Tracker: 用目标检测思路做目标跟踪? 小样本即可得高准确率
- 海龟交易策略要点总结
- MCMC:Gibbs 采样(matlab 实现)
- centos7 减少/home分区空间,扩大/ 的空间
- Spring JDBC 【继承JdbcDaoSupport】
- Docker下安装Redis超详细步骤
- 记录Android Studio KeyMap 导入的问题
- C程序的一个简单错误[Error] ld returned 1 exit status
- amd cpu排行_2020英特尔cpu排行_2019 cpu天梯图 intel和amd cpu性能排行
- 一块硬盘的爱情故事,好揪心
- 怎么关闭win7计算机一键还原系统,win7一键还原按哪个键_win7一键还原
- 1. 简明误差卡尔曼滤波器(ESKF)及其推导过程
- Python - 面向对象编程
- 如何利用Dpabi,AFNI,FSL软件计算种子点的功能连接?
- 酒店网站建设需要多少钱