实验要求:

实验思路:
1.从输出图像开始运算,按照公式计算即可。或参考其他文章
https://blog.csdn.net/qq_38137411/article/details/83213297
2.本实验代码中不包含任何循环,通过尽可能使用numpy加速使时间从4.6s下降到约0.076s。建议是根据代码弄清楚各个numpy矩阵的含义和形式,方便理解。

实验效果:

实验代码:

import numpy as np
import cv2 as cvdef anamorphic(imgSrc):"""根据实验要求的公式实现图像变形为了尽可能的减少运行时间,所有的循环和各种运算都尽可能地使用了Numpy,因此在该函数中不包含任何循环,时间从4.6s优化到了0.076s:param imgSrc: 输入图像:return: imgDst time 变形后的图像 时间"""timeBegin = cv.getTickCount()  # 记录开始时间rows, cols, channels = imgSrc.shapecoordinateDst = np.zeros([rows, cols, 2])  # 储存输出图像中心归一化坐标coordinateSrc = np.zeros([rows, cols, 2])  # 储存输入图像中心归一化坐标coordinateFinal = np.zeros([rows, cols, 2])  # 储存输入图像的原坐标# 输出图像中心归一化coordinateDst[:, :, 1] = np.arange(cols)coordinateDst[:, :, 0] = np.arange(rows).reshape(-1, 1)coordinateDst = (coordinateDst - 0.5 * np.array([rows, cols])) / (0.5 * np.array([rows, cols]))# 实现映射r = np.sqrt(np.sum(coordinateDst ** 2, axis=2))  # 计算所有的rtheta = (1 - r) ** 2  # 计算所有的thetacoordinateSrc[:, :, 0] = np.cos(theta) * coordinateDst[:, :, 0] - np.sin(theta) * coordinateDst[:, :, 1]coordinateSrc[:, :, 1] = np.sin(theta) * coordinateDst[:, :, 0] + np.cos(theta) * coordinateDst[:, :, 1]# 计算r的掩码,此时的r的值只是为0和1r = np.expand_dims(r, 2).repeat(2, axis=2)  # 先复制并扩充一个维度r[r < 1] = -1r[r >= 1] = 0r[r == -1] = 1coordinateFinal += np.multiply(r, coordinateSrc)  # 对应于 f^-1 中的“otherwise”# 下面三句交换0 和 1r[r == 1] = -1r[r == 0] = 1r[r == -1] = 0coordinateFinal += np.multiply(r, coordinateDst)  # 对应于 f^-1 中的“if r >= 1”coordinateFinal = (coordinateFinal + 1) * np.array([0.5*rows, 0.5*cols])coordinateFinal = coordinateFinal.astype(np.int)  # 不能为np.uint8,可以试一试x = np.arange(rows).repeat(cols)  # x 为 [0, 0, 0, ..., 2, 2, 2, ..., rows-1]y = np.tile(np.arange(cols), rows)  # y 为 [0, 1, 2, ..., cols-1, 0, 1, 2, ...cols-1, ...]# imgDst为输出图像imgDst = imgSrc[coordinateFinal[x, y, 0], coordinateFinal[x, y, 1], :].reshape(rows, cols, channels)timeEnd = cv.getTickCount()  # 记录结束时间time = (timeEnd - timeBegin) / cv.getTickFrequency()  # 计算总时间return imgDst, time  # 0.076 simgSrc = cv.imread('../images/images3_2/lab2.png')
imgDst, time = anamorphic(imgSrc)
cv.imshow('imgSrc', imgSrc)
cv.imshow('imgDst', imgDst)
print('Successful!!!')
print('time: %.4f s' % time)
cv.waitKey(0)
cv.destroyAllWindows()

OpenCV实验(6):图像变形相关推荐

  1. opencv mat release thrown_【OpenCV+Python】图像与视频处理入门

    图像处理入门 之前我们已经讲过了OpenCV在各个平台上安装的方法了,从今天开始,正式进入实战部分.首先我们需要做的就是如何读取图像并显示出来,这是图像处理的最基本的部分. 首先我们来了解几个函数. ...

  2. python下:用 matplotlib.pyplot 显示 Opencv 读取的图像

    在涉及图像处理时,我们通常用opencv去读取并处理图像,而用matplotlib去显示图像,因为opencv有很强的图像处理能力,而matplotlib有很强的可视化能力,可以方便的可视化分析实验的 ...

  3. 图像控制点 形变_基于控制点的图像变形方法的研究与实现

    基于控制点的图像变形方法的研究与实现 林军 ; 李新华 [期刊名称] <北京电力高等专科学校学报 ( 自然科学版 ) > [年 ( 卷 ), 期] 2011(028)005 [摘要] 根据 ...

  4. 2020-2021学年——图像图形编程实践实验4_Canny图像边缘检测

    Canny图像边缘检测 实验目的 了解并掌握使用微分算子进行图像边缘检测的基本原理: 了解Canny边缘检测原理与实现,进一步理解图像锐化的实质. 实验设备 PC机.matlab2018b 实验原理 ...

  5. OpenCV实验(一):砖块的检测与位姿估计,窗户的检测与位姿估计

    本次实验包含两个题目 砖块的检测与位姿估计 窗户的检测与位姿估计 2019-4-28更新: 针对4类RGB-D数据,已将深度数据和可见光数据进行对齐 给出数据读取的代码demo 给出相机的内参信息 注 ...

  6. Python,OpenCV中的图像修复——cv2.inpaint()

    Python,OpenCV中的图像修复--cv2.inpaint 1. 效果图 2. 原理 3. 源码 参考 image inpainting 图像修改 这篇博客将介绍如何通过OpenCV中图像修复的 ...

  7. OpenCV 【十二】OpenCV如何扫描图像、利用查找表和计时

    目录 OpenCV如何扫描图像.利用查找表和计时 1.函数计算时间测试case 2. Mat图像的存储机理 3. 像素遍历的3--4种方式 4. 实例 OpenCV如何扫描图像.利用查找表和计时 如何 ...

  8. 解密 | OpenCV加载图像大小是有限制的 ?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 问题来由 最近有人问一个问题,就是它有个大小800MB的图像文件, ...

  9. python使用openCV加载图像、并将BGR格式转换成HSV格式、定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)、并使用mask信息进行颜色分离、BGR格式的图像转化为RGB、并可视化

    python使用openCV加载图像.并将BGR格式转换成HSV格式.定义HSV格式中需要分离颜色的掩码(掩模)区间(mask).并使用mask信息进行颜色分离.将BGR格式的图像转化为RGB.可视化 ...

最新文章

  1. GNU make manual 翻译( 一百二十一)
  2. Py之pixellib:pixellib库的简介、安装、经典案例之详细攻略
  3. mysql 常用数据库连接池_常见的数据库连接池
  4. 电脑小写字母怎么切换_苹果电脑双系统如何切换?苹果电脑双系统切换方法
  5. pythongui界面实例_wxPython:python首选的GUI库实例分享(5)
  6. Python求1~300之间所有的完数
  7. tx2使用远程开机后分辨率不正确
  8. 厦门大学847信号与系统考研参考书目
  9. 计算机教室电气设计规范,车库电气设计规范.docx
  10. UniBeast:在任何支持基于英特尔处理器的PC上安装OS X优胜美地
  11. iOS-性能优化的那些事
  12. java 二维向量_二维向量的叉积是标量还是向量?
  13. 产品专利和方法专利对比分析
  14. Thinkpad E430 移除网卡白名单
  15. 我的理想200字计算机工程师,我的理想工程师作文(我的理想是做一名工程师)...
  16. 微信怎么收银行卡的消息服务器,微信零钱提现,这样操作,可以免去手续费
  17. 回顾一年的工作历程_回顾历程、总结经验、展望未来
  18. 新手看过来----讨厌的运算符
  19. 民法典实施后,夫妻共同债务如何认定?
  20. 微型计算机不可少,[单选] 微型计算机中必不可少的输入和输出设备是()。

热门文章

  1. 老菜鸟看软件开发的管理 二
  2. VS Code 扩展 WebTS 早期预览版发布;微软开源其搜索服务的 SPTAG 算法
  3. 手机技巧:安卓微信 8.0.38 内测版本功能一览
  4. Python_shutil模块
  5. python shutil_python中shutil模块
  6. maven中的GROUPID和ARTIFACTID是什么?作用是啥?
  7. python中getattr详解
  8. makefile中的all和.PHONY的作用
  9. 什么是redis,redis能做什么,redis的应用场景【转】
  10. PTA-单链表基本操作