Python+OpenCV 实现图片无损旋转90°且无黑边


Posted in Python onDecember 12, 2019

0. 引言

Python+OpenCV 实现图片无损旋转90°且无黑边

有如上一张图片,在以往的图像旋转处理中,往往得到如图所示的图片。

Python+OpenCV 实现图片无损旋转90°且无黑边

然而,在进行一些其他图像处理或者图像展示时,黑边带来了一些不便。本文解决图片旋转后出现黑边的问题,实现了图片尺寸不变的旋转(以上提到的黑边是图片的一部分)。

1. 方法流程

(1)旋转图片,得到有黑边的旋转图片。

(2)找出图片区域(不含黑边)的位置。

(3)创建一个空图片(其实是矩阵)。

(4)将图片区域搬到此空图片。

2. 程序

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
This program is debugged by Harden Qiu.
You can send a e-mail to hardenqiu@foxmail.com for more details.
"""
import numpy as np
import cv2
def main():
  img = cv2.imread('.\\imgs\\img10.jpg')
  height, width = img.shape[:2]

  matRotate = cv2.getRotationMatrix2D((height * 0.5, width * 0.5), -90, 1)
  dst = cv2.warpAffine(img, matRotate, (width, height*2))
  rows, cols = dst.shape[:2]

  for col in range(0, cols):
    if dst[:, col].any():
      left = col
      break

  for col in range(cols-1, 0, -1):
    if dst[:, col].any():
      right = col
      break

  for row in range(0, rows):
    if dst[row,:].any():
      up = row
      break

  for row in range(rows-1,0,-1):
    if dst[row,:].any():
      down = row
      break

  res_widths = abs(right - left)
  res_heights = abs(down - up)
  res = np.zeros([res_heights ,res_widths, 3], np.uint8)

  for res_width in range(res_widths):
    for res_height in range(res_heights):
      res[res_height, res_width] = dst[up+res_height, left+res_width]

  cv2.imshow('res',res)

  cv2.imshow('img',img)
  cv2.imshow('dst', dst)
  cv2.waitKey(0)

if __name__ =='__main__':
  main()

说明:img表示原图,dst表示旋转后图片,res表示最终处理获取的图片。

运行程序,得到如图所示的图片,解决了遇到的问题。

Python+OpenCV 实现图片无损旋转90°且无黑边

3. 总结

本图像处理方法用到了以下几个重要函数:

cv2.getRotationMatrix2D

cv2.warpAffine

编程过程中,要理清楚图片各个像素点的横纵变化及其变化大小。在进行像素传递时,要注意对应关系。

以上这篇Python+OpenCV 实现图片无损旋转90°且无黑边就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基础教程之lambda表达式使用方法
Feb 12 Python
python 七种邮件内容发送方法实例
Apr 22 Python
Python3 能振兴 Python的原因分析
Nov 28 Python
Python中字典和JSON互转操作实例
Jan 19 Python
PyQt5每天必学之事件与信号
Apr 20 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
Jupyter notebook快速入门教程(推荐)
May 18 Python
导致python中import错误的原因是什么
Jul 01 Python
Python预测2020高考分数和录取情况
Jul 08 Python
公认8个效率最高的爬虫框架
Jul 28 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
Feb 02 Python
python开发人人对战的五子棋小游戏
May 02 Python
使用python去除图片白色像素的实例
Dec 12 #Python
用Python去除图像的黑色或白色背景实例
Dec 12 #Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
Dec 12 #Python
flask的orm框架SQLAlchemy查询实现解析
Dec 12 #Python
python实现批量处理将图片粘贴到另一张图片上并保存
Dec 12 #Python
Python FtpLib模块应用操作详解
Dec 12 #Python
Python PyInstaller库基本使用方法分析
Dec 12 #Python
You might like
php利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
php安装dblib扩展,连接mssql的具体步骤
2017/03/02 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
js 创建书签小工具之理论
2011/02/25 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
2012/12/13 Javascript
jQuery中(function(){})()执行顺序的理解
2013/03/05 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
jQuery实现简单的计时器功能实例分析
2017/08/29 jQuery
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
[40:03]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
python多重继承实例
2014/10/11 Python
python简单分割文件的方法
2015/07/30 Python
Python的UTC时间转换讲解
2019/02/26 Python
在django模板中实现超链接配置
2019/08/21 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
Python3 集合set入门基础
2020/02/10 Python
Python 如何实现访问者模式
2020/07/28 Python
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
爱尔兰电脑、家电和家具购物网站:Buy It Direct
2019/07/09 全球购物
什么是封装
2013/03/26 面试题
实习求职信
2013/12/01 职场文书
老师的检讨书
2014/02/23 职场文书
禁毒宣传活动总结
2014/08/26 职场文书
教书育人演讲稿
2014/09/11 职场文书
MySQL添加索引特点及优化问题
2022/07/23 MySQL