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服务器与android客户端socket通信实例
Nov 12 Python
python单例模式实例分析
Apr 08 Python
基于wxpython实现的windows GUI程序实例
May 30 Python
python开发利器之ulipad的使用实践
Mar 16 Python
numpy的文件存储.npy .npz 文件详解
Jul 09 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 Python
python中Lambda表达式详解
Nov 20 Python
Python ORM编程基础示例
Feb 02 Python
详解Python requests模块
Jun 21 Python
Python Django获取URL中的数据详解
Nov 01 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
PHP HTML代码串 截取实现代码
2009/06/29 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
javascript操作excel生成报表全攻略
2014/05/04 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
浅谈js中StringBuffer类的实现方法及使用
2016/09/02 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
python将ansible配置转为json格式实例代码
2017/05/15 Python
从请求到响应过程中django都做了哪些处理
2018/08/01 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
python3安装crypto出错及解决方法
2019/07/30 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
Django分组聚合查询实例分享
2020/04/29 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
草船借箭教学反思
2014/02/03 职场文书
先进集体获奖感言
2014/02/13 职场文书
项目经理聘任书
2014/03/29 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
如何使用PyCharm及常用配置详解
2021/06/03 Python