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 12 Python
基础的十进制按位运算总结与在Python中的计算示例
Jun 28 Python
wxpython中自定义事件的实现与使用方法分析
Jul 21 Python
python+mongodb数据抓取详细介绍
Oct 25 Python
使用tensorflow实现AlexNet
Nov 20 Python
python实现生命游戏的示例代码(Game of Life)
Jan 24 Python
django反向解析URL和URL命名空间的方法
Jun 05 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
利用Django模版生成树状结构实例代码
May 19 Python
python3 selenium自动化测试 强大的CSS定位方法
Aug 23 Python
python实现打砖块游戏
Feb 25 Python
python批量更改目录名/文件名的方法
Apr 18 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 print EOF实现方法
2009/05/21 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
2014/08/21 PHP
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
javascript中如何处理引号编码"
2013/08/15 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
js基础知识(公有方法、私有方法、特权方法)
2015/11/06 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
2019/08/26 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
python实现贪吃蛇小游戏
2020/03/21 Python
Python 从attribute到property详解
2020/03/05 Python
Python如何实现FTP功能
2020/05/28 Python
css3针对移动端卡顿问题的解决(动画性能优化)
2020/02/14 HTML / CSS
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
迪卡侬波兰体育用品商店:Decathlon波兰
2020/03/31 全球购物
Java中实现多态的机制是什么?
2014/12/07 面试题
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
二年级体育教学反思
2014/01/15 职场文书
投资意向书范本
2014/04/01 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
交通事故协议书范文
2014/04/16 职场文书
建筑安全责任书范本
2014/07/24 职场文书
房产公证书
2015/01/23 职场文书