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、具体代码

python">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、具体代码

python">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()


http://www.niftyadmin.cn/n/5436810.html

相关文章

视频技术1:使用ABLMediaServer推流rtsp

ABLMediaServer定位是高性能、高稳定、开箱即用、商用级别的流媒体服务器 下边展示了如何把1个mp3作为输入源&#xff0c;转换为rtsp流的过程。 作用&#xff1a;用rtsp模拟摄像头的视频流 1、启动ABLMediaServer ABLMediaServer-2024-03-13\WinX64\ABLMediaServer.exe 配…

Lua面向对象

封装 实现了New方法&#xff0c;相当于创建了一个表obj&#xff0c;并设置元表可以通过obj表去访问__index指向表中的数据 继承 通过大G表传入字符串创建表&#xff0c;

Spring事务扩展点-TransactionSynchronization

文章目录 什么是TransactionSynchronization怎么用&#xff1f;一些弊端 什么是TransactionSynchronization Spring 提供的 TransactionSynchronization 是一个非常重要的扩展点&#xff0c;它允许开发者参与到 Spring 管理的事务生命周期中的特定阶段&#xff0c;从而能够在事…

一键入门Ubuntu22!

目录 一、安装 二、常用目录 三、常用指令 四、用户指令 五、ssh与scp 六、服务相关 七、Python与Pycharm 八、Vim编辑器 九、Ubuntu22下使用Mysql 十、Ubuntu22下使用mongodb 十一、Ubuntu22下使用redis Ubuntu是一个基于Debian的开源操作系统&#xff0c;由Canoni…

【c++】内联-引用-重载

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.【c】内联函数 1.1 背景 1.2 内联函数的概念 1.3 内联函数的特性 1.4 宏和内联的小知识 宏的优缺点&#xff1f; C有哪些技术替代…

Nadaraya-Watson核回归

目录 基本原理 ​编辑 核函数的选择 带宽的选择 特点 应用 与注意力机制的关系 参考内容 在统计学中&#xff0c;核回归是一种估计随机变量的条件期望的非参数技术。目标是找到一对随机变量 X 和 Y 之间的非线性关系。 在任何非参数回归中&#xff0c;变量 Y 相对于变量…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Polygon)

多边形绘制组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Polygon(value?: {width?: string | number, height?: string | number}) 从API version 9开始&#xff0…

QT项目日志

想用QT写一个图书管理系统 在文件这块卡了很久&#xff0c;因为用C的文件IO没法直接写入QString类型&#xff0c;而QString类型转化为String存在储存格式上的问题&#xff08;储存中文会存在乱码&#xff09; 最后通过ChatGPT解决了。。。 在您的代码中&#xff0c;主要问题在…