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实现多线程采集的2个代码例子
Jul 07 Python
详解python3实现的web端json通信协议
Dec 29 Python
python 内置函数filter
Jun 01 Python
LRUCache的实现原理及利用python实现的方法
Nov 21 Python
python实现自主查询实时天气
Jun 22 Python
Python3.8中使用f-strings调试
May 22 Python
python实现最大子序和(分治+动态规划)
Jul 05 Python
详解PyTorch手写数字识别(MNIST数据集)
Aug 16 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
Jan 09 Python
深入浅析python变量加逗号,的含义
Feb 22 Python
2021年pycharm的最新安装教程及基本使用图文详解
Apr 03 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Oct 16 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
session在php5.3中的变化 session_is_registered() is deprecated in
2013/11/12 PHP
php的curl封装类用法实例
2014/11/07 PHP
php截取中文字符串函数实例
2015/02/23 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
php实现算术验证码功能
2018/12/05 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
Yii 实现数据加密和解密
2021/03/09 PHP
浅谈javascript 面向对象编程
2009/10/28 Javascript
关于JS字符串函数String.replace()
2013/04/07 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
2015/10/29 Javascript
全面解析Bootstrap排版使用方法(文字样式)
2015/11/30 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
vue调用高德地图实例代码
2017/04/28 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
layui表格数据重载
2019/07/27 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
[01:03:33]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
详解supervisor使用教程
2017/11/21 Python
python中添加模块导入路径的方法
2021/02/03 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
2021/02/20 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
校园演讲稿汇总
2014/05/21 职场文书
2014年招生工作总结
2014/11/26 职场文书
教师工作证明范本
2015/06/12 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
python 中yaml文件用法大全
2021/07/04 Python