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编写的微博应用
Oct 17 Python
浅要分析Python程序与C程序的结合使用
Apr 07 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 Python
使用Python来开发微信功能
Jun 13 Python
Python将多个list合并为1个list的方法
Jun 27 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
Python比较配置文件的方法实例详解
Jun 06 Python
python使用opencv实现马赛克效果示例
Sep 28 Python
Python 3.6打包成EXE可执行程序的实现
Oct 18 Python
python将数组n等分的实例
Dec 02 Python
Python3爬虫里关于Splash负载均衡配置详解
Jul 10 Python
Numpy ndarray 多维数组对象的使用
Feb 10 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 array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
JQquery的一些使用心得分享
2012/08/01 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
webstorm+vue初始化项目的方法
2018/10/18 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
javascript如何实现create方法
2019/11/04 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
详解python字节码
2018/02/07 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
德国团购网站:Groupon德国
2018/03/13 全球购物
文员的职业生涯规划发展方向
2014/02/08 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
2015年小学校长工作总结
2015/05/19 职场文书
活着观后感
2015/06/03 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
详解Python flask的前后端交互
2022/03/31 Python