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根据出生日期返回年龄的方法
Mar 26 Python
python编程开发之日期操作实例分析
Nov 13 Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 Python
使用python对文件中的数值进行累加的实例
Nov 28 Python
python 批量解压压缩文件的实例代码
Jun 27 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 Python
Python实现投影法分割图像示例(二)
Jan 17 Python
python上传时包含boundary时的解决方法
Apr 08 Python
Python之变量类型和if判断方式
May 05 Python
python如何支持并发方法详解
Jul 25 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
Jul 30 Python
python读写数据读写csv文件(pandas用法)
Dec 14 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
COM in PHP (winows only)
2006/10/09 PHP
php中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
php和editplus正则表达式去除空白行
2015/04/17 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
使用jquery+CSS实现控制打印样式
2014/12/31 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
js实现图片轮播效果
2015/12/19 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
微信小程序 video详解及简单实例
2017/01/16 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
vue-router定义元信息meta操作
2020/12/07 Vue.js
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
Python修改Excel数据的实例代码
2013/11/01 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
CSS3 毛玻璃效果
2019/08/14 HTML / CSS
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
如何保障Web服务器安全
2014/05/05 面试题
《三袋麦子》教学反思
2014/03/02 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
HTTP中的Content-type详解
2022/01/18 HTML / CSS
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js