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类的定义、继承及类对象使用方法简明教程
May 08 Python
Python实现给文件添加内容及得到文件信息的方法
May 28 Python
用python实现的线程池实例代码
Jan 06 Python
Python实现修改IE注册表功能示例
May 10 Python
python删除本地夹里重复文件的方法
Nov 19 Python
numpy中矩阵合并的实例
Jun 15 Python
django Serializer序列化使用方法详解
Oct 16 Python
python opencv实现证件照换底功能
Aug 19 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
Python机器学习之PCA降维算法详解
May 19 Python
python实现双链表
May 25 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Jun 21 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调用数据库的存贮过程!
2006/10/09 PHP
php 什么是PEAR?(第二篇)
2009/03/19 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
php实现可运算的验证码
2015/11/10 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
PHP实现的激活用户注册验证邮箱功能示例
2017/06/06 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
javascript使用eval或者new Function进行语法检查
2010/10/16 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
2011/03/10 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
如何提高数据访问速度
2016/12/26 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
详解Node.js access_token的获取、存储及更新
2017/06/20 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
python字符串连接方式汇总
2014/08/21 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
python3对接mysql数据库实例详解
2019/04/30 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
HTML5+css3:3D旋转木马效果相册
2017/01/03 HTML / CSS
全球度假村:Club Med
2017/11/27 全球购物
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
网络维护管理员的自我评价分享
2013/11/11 职场文书
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
销售员岗位职责
2014/06/09 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
字节飞书面试promise.all实现示例
2022/06/16 Javascript