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使用cookie库操保存cookie详解
Mar 03 Python
老生常谈Python序列化和反序列化
Jun 28 Python
Python WXPY实现微信监控报警功能的代码
Oct 20 Python
python微信跳一跳系列之自动计算跳一跳距离
Feb 26 Python
Python打印输出数组中全部元素
Mar 13 Python
selenium+python设置爬虫代理IP的方法
Nov 29 Python
Python实现的简单线性回归算法实例分析
Dec 26 Python
Python代理IP爬虫的新手使用教程
Sep 05 Python
手把手教你Python yLab的绘制折线图的画法
Oct 23 Python
Python selenium的基本使用方法分析
Dec 21 Python
手动安装python3.6的操作过程详解
Jan 13 Python
Python如何输出整数
Jun 07 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
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
php下使用无限生命期Session的方法
2007/03/16 PHP
php 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
使用PHP开发留言板功能
2019/11/19 PHP
jQuery插件zepto.js简单实现tab切换
2015/06/16 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
2015/11/02 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
2017/04/21 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
Python实现身份证号码解析
2015/09/01 Python
python类中super()和__init__()的区别
2016/10/18 Python
详解python中的Turtle函数库
2018/11/19 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
python实现基于朴素贝叶斯的垃圾分类算法
2019/07/09 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
python 使用shutil复制图片的例子
2019/12/13 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
python中spy++的使用超详细教程
2021/01/29 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
HEMA英国:荷兰原创设计
2018/08/28 全球购物
多媒体专业自我鉴定
2014/02/28 职场文书
商场主管竞聘书
2014/03/31 职场文书
环保倡议书格式范文
2014/05/14 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
竞选大学学委演讲稿
2014/09/13 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python