Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之一 哈哈镜效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之一 哈哈镜效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之一 哈哈镜效果

一、简单介绍

二、简单哈哈镜实现的原理

1、图像拉伸放大

2、图像缩小

三、哈哈镜 拉伸放大 代码实现

四、哈哈镜 图像缩小 代码实现


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

二、简单哈哈镜实现的原理

现实生活中的哈哈镜,是指一种表面凸凹不平的镜子,可以反映出人像及物件的扭曲面貌。在图像处理中,哈哈镜效果是通过图像坐标变换来模拟真实的哈哈镜效果。具体算法过程如下:

输入图像f(x,y),宽高分别为Width和Height,设置图像中心坐标Center(cx,xy)为缩放中心点,图像上任意一点到中心点的相对坐标tx=x-cx,ty=y-cy。哈哈镜效果分为图像拉伸放大和图像缩小。

1、图像拉伸放大

对于图像拉伸放大,设置图像变换的半径为radius,哈哈镜变换后的图像为p(x,y)。

x=(tx/2)*(sqrt(tx*tx+ty*ty)/radius)+cx

y=(ty/2)*(sqrt(tx*tx+ty*ty)/radius)+cy

2、图像缩小

对于图像缩小,设置图像变换的半径为radius,哈哈镜变换后的图像为p(x,y)。

x=cos(atan2(ty,tx))*12*(sqrt(tx*tx+ty*ty)+cx

y=sin(atan2(ty,tx))*12*(sqrt(tx*tx+ty*ty)+cy

三、哈哈镜 拉伸放大 代码实现

1、编写代码

2、运行效果

3、具体代码

import cv2
import mathdef EnlargeEffectMirror(img, radius):"""哈哈镜放大效果:param img: 图片:param radius: 半径:return: 变化后的数据"""# 获取图片的高、宽、和维度h, w, n = img.shapecx = w / 2cy = h / 2r = int(radius / 2.0)new_img = img.copy()# 遍历调整图片for i in range(w):for j in range(h):tx = i - cxty = j - cydistance = tx * tx + ty * tyif distance < radius * radius:x = int(int(tx / 2.0) * (math.sqrt(distance) / r) + cx)y = int(int(ty / 2.0) * (math.sqrt(distance) / r) + cy)if x < w and y < h:new_img[j, i, 0] = img[y, x, 0]new_img[j, i, 1] = img[y, x, 1]new_img[j, i, 2] = img[y, x, 2]return new_imgdef TestEnlargeEffectMirror():"""测试哈哈镜放大效果:return: null"""img = cv2.imread("Images/DogFace.jpg")# 设置窗口属性,并显示图片cv2.namedWindow("Dog", cv2.WINDOW_KEEPRATIO)cv2.imshow("Dog", img)# 该值可以自行定义,它决定了哈哈镜的大小,当图像很大时,应该相应的调大enlarge_img = EnlargeEffectMirror(img, 400)# 设置窗口属性,并显示图片cv2.namedWindow("enlarge_img", cv2.WINDOW_KEEPRATIO)cv2.imshow("enlarge_img", enlarge_img)def main():TestEnlargeEffectMirror()cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':main()

需要注意的是:

  • 1)因为涉及很多浮点运算,所以需要加上转int()函数,保证最后的图像坐标为非负整数。
  • 2)另外,由于计算可能会导致最终的newx和newy出现超过图像范围的坐标,因此需要加if语句来确保图像遍历成功。

四、哈哈镜 图像缩小 代码实现

1、编写代码

2、运行效果

3、具体代码

def ReduceEffectMirror(img, compress):"""哈哈镜缩小效果:param img::param compress: 图像缩小数值,越大,压缩越严重:return:"""height, width, n = img.shapecenter_x = width / 2center_y = height / 2new_data = img.copy()# 图像遍历for i in range(width):for j in range(height):tx = i - center_xty = j - center_ytheta = math.atan2(ty, tx)radius = math.sqrt((tx * tx) + (ty * ty))newx = int(center_x + (math.sqrt(radius) * compress * math.cos(theta)))newy = int(center_y + (math.sqrt(radius) * compress * math.sin(theta)))# 防止计算后坐标小于0if newx < 0 and newx > width:newx = 0if newy < 0 and newy > height:newy = 0if newx < width and newy < height:new_data[j, i][0] = img[newy, newx][0]new_data[j, i][1] = img[newy, newx][1]new_data[j, i][2] = img[newy, newx][2]return new_datadef TestReduceEffectMirror():"""测试哈哈镜缩小效果:return: null"""img = cv2.imread("Images/DogFace.jpg")# 设置窗口属性,并显示图片cv2.namedWindow("Dog", cv2.WINDOW_KEEPRATIO)cv2.imshow("Dog", img)# 该值可以自行定义,它决定了哈哈镜的大小,当图像很大时,应该相应的调大reduce_img = ReduceEffectMirror(img, 12)# 设置窗口属性,并显示图片cv2.namedWindow("reduce_img", cv2.WINDOW_KEEPRATIO)cv2.imshow("reduce_img", reduce_img)def main():TestReduceEffectMirror()cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/549224.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打靶记录(个人学习笔记)

一、信息收集 1、主机发现 通过nmap对此网段进行扫描&#xff0c;可以确定靶机ip为192.168.189.144 2、端口扫描 确定了靶机ip之后&#xff0c;我们来扫描端口 发现80端口开放&#xff0c;先访问80端口 用插件识别出一些信息 Wappalyzer插件获得信息&#xff1a;Web服务&am…

基于spring boot的钢材销售管理系统的设计与实现

钢材销售管理系统 摘 要 本系统为用户而设计制作钢材销售管理系统&#xff0c;旨在实现钢材销售智能化、现代化管理。本钢材销售管理自动化系统的开发和研制的最终目的是将钢材销售的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更…

基于深度学习YOLOv8+Pyqt5的工地安全帽头盔佩戴检测识别系统(源码+跑通说明文件)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;318安全帽 获取完整源码源文件7000张已标注的数据集训练好的模型配置说明文件 可有偿59yuan一对一远程操作配置环境跑通程序 效果展示&#xff08;图片检测批量检测视频检测摄像头检测&#xff09; 基于深度学习YOLOv8Pyqt…

hadoop分布式环境搭建

准备三台centos虚拟机 。&#xff08;master&#xff0c;slave1&#xff0c;slave2&#xff09; (hadoop、jdk文件链接&#xff1a;https://pan.baidu.com/s/1wal1CSF1oO2h4dkSbceODg 提取码&#xff1a;4zra) 前四步可参考hadoop伪分布式环境搭建详解-CSDN博客 1.修改主机名…

REDHAWK——连接(续)

文章目录 前言一、突发 IO1、数据传输①、输入②、输出 2、突发信号相关信息 (SRI)3、多输出端口4、使用复数数据①、在 C 中转换复数数据 5、时间戳6、端口统计①、C 二、消息传递1、消息生产者①、创建一个消息生产者②、发送消息 2、消息消费者①、创建消息消费者②、注册接…

学习笔记Day8:GEO数据挖掘-基因表达芯片

GEO数据挖掘 数据库&#xff1a;GEO、NHANCE、TCGA、ICGC、CCLE、SEER等 数据类型&#xff1a;基因表达芯片、转录组、单细胞、突变、甲基化、拷贝数变异等等 常见图表 表达矩阵 一行为一个基因&#xff0c;一列为一个样本&#xff0c;内容是基因表达量。 热图 输入数据…

【大模型】直接在VS Code(Visual Studio Code)上安装CodeGeeX插件的过程

文章目录 一、什么是CodeGeeX&#xff08;一&#xff09;我理解的CodeGeeX&#xff08;二&#xff09;优缺点 二、CodeGeex下载、安装、注册&#xff08;一&#xff09;安装VS Code(Visual Studio Code)&#xff08;二&#xff09;下载安装CodeGeeX&#xff08;三&#xff09;注…

OpenCV 新版滴 4.5.1 发布啦!

发布亮点&#xff1a; OpenCV Github 项目终于突破50000 stars&#xff01;新的里程碑~ 这次发布的特性包括&#xff1a; 集成更多的GSoC 2020 项目的结果&#xff0c;包括&#xff1a; 开发了OpenCV.js DNN 模块&#xff0c;以方便再网页中使用&#xff0c;并提供了相关教…

鼎阳SDS6204示波器波形读取速率的测试

现在的合肥光源是1秒注入一次&#xff0c;以后的新光源注入频率要求能达到1秒10次&#xff0c;这要求设备每次注入都要把直线的束流流强以及储存环的逐束团流强都测出来。 对于直线加速器&#xff0c;FCT的波形是ns级的脉宽&#xff0c;就近几路FCT信号接到一个示波器里&#…

【SpringMVC】SpringMVC的整体执行流程

概述&#xff1a;MVC是一种设计模式&#xff0c;SpringMVC是按照MVC模式实现的优秀框架&#xff0c;可以帮助我们更简洁的完成Web开发&#xff0c;并且天然与Spring集成。后端项目分为Service层&#xff08;处理业务&#xff09;、Dao层&#xff08;数据库操作&#xff09;、En…

Springboot-软件授权License

无意中看到了一个简单方便的授权方式&#xff0c;只需几步就可集成到boot项目中。 先上地址&#xff1a;smart-license: 保护个人与企业的软件作品权益&#xff0c;降低盗版造成的损失。PS&#xff1a;因个人精力有限&#xff0c;不再提供该项目的咨询答疑服务。 Smart-licen…

MacOS本地使用Docker Desktop 搭建Minio容器

1. 下载docker Desktop docker官网&#xff1a;https://www.docker.com/products/docker-desktop/ 根据自己的型号进行选择&#xff0c;我的M系列芯片&#xff0c;选择的是Apple-Chip&#xff0c;记得需要看到最后噢&#xff01; 最后有坑点解决办法&#xff01; 最后有坑点解…