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 math


def EnlargeEffectMirror(img, radius):
    """
    哈哈镜放大效果
    :param img: 图片
    :param radius: 半径
    :return: 变化后的数据
    """
    # 获取图片的高、宽、和维度
    h, w, n = img.shape
    cx = w / 2
    cy = h / 2

    r = int(radius / 2.0)
    new_img = img.copy()

    # 遍历调整图片
    for i in range(w):
        for j in range(h):
            tx = i - cx
            ty = j - cy
            distance = tx * tx + ty * ty
            if 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_img


def 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.shape
    center_x = width / 2
    center_y = height / 2
    new_data = img.copy()
    # 图像遍历
    for i in range(width):
        for j in range(height):
            tx = i - center_x
            ty = j - center_y
            theta = 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)))
            # 防止计算后坐标小于0
            if newx < 0 and newx > width:
                newx = 0
            if newy < 0 and newy > height:
                newy = 0
            if 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_data


def 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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp可视范围高度 - 用户屏幕可操作的屏幕高度 - 适用于APP、H5@公众号、纯H5@Chrome

可视范围高度 let heightPx uni.getWindowInfo().windowHeight uni.getWindowInfo().windowTop 官方手册 uni.getWindowInfo() | uni-app官网uni-app,uniCloud,serverless,uni.getWindowInfo()https://uniapp.dcloud.net.cn/api/system/getWindowInfo.html 实测数据 uni.ge…

【目标检测】2. RCNN

接上篇 【目标检测】1. 目标检测概述_目标检测包括预测目标的位置吗?-CSDN博客 一、前言 CVPR201 4经典paper:《 Rich feature hierarchies for accurate object detection and semantic segmentation》&#xff0c;https://arxiv.org/abs/1311.2524, 这篇论文的算法思想被称…

信息检索(十三):On Complementarity Objectives for Hybrid Retrieval

On Complementarity Objectives for Hybrid Retrieval 摘要1. 引言2. 相关工作2.1 稀疏和密集检索2.2 互补性 3. 提出方法3.1 Ratio of Complementarity (RoC)3.2 词汇表示&#xff08;S&#xff09;3.3 语义表示&#xff08;D&#xff09;3.4 互补目标 4. 实验4.1 实验设置4.2…

服务器病毒木马通用排查处理应急响应流程

目录 一、勒索病毒发作的特征 二、勒索病毒的应急响应 三、勒索病毒预防与事后加固 一、勒索病毒发作的特征 如果发现大量统一后缀的文件&#xff1b;发现勒索信在Linux/home、/usr等目录&#xff0c;在Windows 桌面或者是被加密文件的文件夹下。如果存在以上特…

Flutter-仿腾讯视频Banner效果

闲聊 人一旦运气差&#xff0c;喝水都能噎着。我又被发”毕业证“了&#xff0c;&#x1f62d;&#xff0c;对&#xff01;&#xff01;&#xff01;没有听错&#xff0c;发毕业证的当天上午刚讨论完需求&#xff0c;中午吃完饭&#xff0c;正常去公司前面的小公园溜达&#x…

供应链投毒预警 | 开源供应链投毒202402月报发布啦

概述 悬镜供应链安全情报中心通过持续监测全网主流开源软件仓库&#xff0c;结合程序动静态分析方式对潜在风险的开源组件包进行动态跟踪和捕获&#xff0c;发现大量的开源组件恶意包投毒攻击事件。在2024年2月份&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;…

openEuler-22.03-LTS-SP2更改阿里云yum安装源

备份文件/etc/yum.repos.d/openEuler.repo&#xff0c;并将文件替换为以下内容&#xff1a; [OS] nameOS baseurlhttps://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP2/OS/$basearch/ enabled1 gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/openeuler/openEuler-22.…

Tomcat(二)

一、搭建个人博客 二、状态页 默认的管理页面被禁用&#xff0c;启用方法如下 修改conf/conf/tomcat-users.xml 2.1 开启状态页&#xff08;本地访问&#xff09; 2.2 开启允许远程登录状态页 2.3 host manager

前端vue实现甘特图

1 什么是甘特图 甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。以提出者亨利L甘特先生的名字命名&#xff0c;是项目管理、生产排程、节点管理中非常常见的一个功能。 甘特图内在思想简单&#xff0c;即以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的…

24 OpenCV直方图反向投影

文章目录 参考反向投影作用calceackProject 反向投影mixchannels 通道图像分割示例 参考 直方图反向投影 反向投影 反向投影是反映直方图模型在目标图像中的分布情况简单点说就是用直方图模型去目标图像中寻找是否有相似的对象。通常用HSV色彩空间的HS两个通道直方图模型 作用…

【机器学习】BP神经网络Matlab实现

目录 1.背景2.原理3.代码实现 1.背景 BP神经网络&#xff08;Backpropagation Neural Network&#xff09;是一种机器学习算法&#xff0c;其通过反向传播算法来训练网络&#xff0c;使其能够学习输入数据的模式并进行预测或分类任务。BP神经网络通常包括输入层、隐藏层和输出…

Apache Doris 如何基于自增列满足高效字典编码等典型场景需求

自增列&#xff08;auto_increment&#xff09;是数据库中常见的一项功能&#xff0c;它提供一种方便高效的方式为行分配唯一标识符&#xff0c;极大简化数据管理的复杂性。当新行插入到表中时&#xff0c;数据库系统会自动选取自增序列中的下一个可用值&#xff0c;并将其分配…

Nginx 的安装、启动和关闭

文章目录 一、背景说明二、Nginx 的安装2.1、依赖的安装2.2、Nginx 安装2.3、验证安装 三、启动 Nginx3.1、普通启动3.2、如何判断nginx已启动3.3、通过配置启动3.4、设置开机启动 四、关闭 Nginx4.1、优雅地关闭4.2、快速关闭4.3、只关闭主进程4.4、使用nginx关闭服务 五、重启…

SpringBoot+Redis实现分布式WebSocket

什么是分布式WebSocket&#xff1f; 是指在分布式系统架构中实现WebSocket的通信机制&#xff0c;它允许在不同的服务器节点之间共享和同步WebSocket会话状态&#xff0c;从而实现跨多个服务器的实时消息传递。 在分布式环境中实现WebSocket的挑战主要包括以下几点&#xff1a…

基于支持向量机(svm)的人脸识别

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 数据集加载与可视化 from sklearn.datasets import fetch_lfw_people faces fetch_lfw_people(min_faces_per_person60) # Check out sample…

Memcached-分布式内存对象缓存系统

目录 一、NoSQL 介绍 二、Memcached 1、Memcached 介绍 1.1 Memcached 概念 1.2 Memcached 特性 1.3 Memcached 和 Redis 区别 1.4 Memcached 工作机制 1.4.1 内存分配机制 1.4.2 懒惰期 Lazy Expiration 1.4.3 LRU&#xff08;最近最少使用算法&#xff09; 1.4.4…

【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作

&#x1f38a;专栏【数据结构】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【勋章】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 ⭐树 &#x1f3f3;️‍&#x1f308;定义 &#x1f3f3;️‍…

【Maven篇】解锁 Maven 的智慧:依赖冲突纷争下的版本调停者

缘起 软件开发世界是一个充满无限可能的领域&#xff0c;但同时也伴随着诸多挑战。其中之一&#xff0c;就是依赖冲突的问题。在这篇文章中&#xff0c;我们将揭开 Maven 这位“版本调停者”的神秘面纱&#xff0c;深入探讨如何在版本纠纷的盛宴中解决依赖问题。 Maven&#…

如何选择合适的数据可视化工具?

如果是入门级的数据可视化工具&#xff0c;使用Excel插件就足够了&#xff01; Excel插件&#xff0c;tusimpleBI 是一款 Excel 图表插件&#xff0c;提供超过120项图表功能&#xff0c;帮助用户制作各种 Excel 所没有的高级图表&#xff0c;轻轻松松一键出图。 它能够制作10…

FPGA——DDR3的IP核

FPGA——DDR3的ip核 IP核配置基于MIG核代码基于AXI接口的DDR3 IP核配置 1 2 3 4 5 6 基于MIG核代码 控制MIG核的信号进行读写 module MIG_APP_Drive(input i_ui_clk ,input i_ui_rst ,input init_calib_…