用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - python代码库

图片转换特效 水波 波浪滤镜

2022-09-07 作者: Python自学举报

[python]代码库

#!/usr/bin/env python
# encoding: utf-8
'''
图片转换特效 水波特效滤镜
'''
import cv2, math
import numpy as np


class picture:

    def __init__(self):
        self.path = 'assets/picture.jpeg'

    def hello(self):
        return self

    def run(self):
        # 读取原始图像
        img = cv2.imread(self.path)
        # 获取图像行和列
        rows, cols = img.shape[:2]
        # 新建目标图像
        dst = np.zeros((rows, cols, 3), dtype="uint8")
        # 定义水波特效参数
        #越大越疏
        wavelength = 50
        #越大越密
        amplitude = 30
        phase = math.pi / 1.1
        # 获取中心点
        centreX = 0.5
        centreY = 0.5
        radius = min(rows, cols) / 2
        # 设置水波覆盖面积
        icentreX = cols * centreX
        icentreY = rows * centreY

        # 图像水波特效
        for i in range(rows):
            for j in range(cols):
                dx = j - icentreX
                dy = i - icentreY
                distance = dx * dx + dy * dy

                if distance > radius * radius:
                    x = j
                    y = i
                else:
                    # 计算水波区域
                    distance = math.sqrt(distance)
                    amount = amplitude * math.sin(distance / wavelength * 2 * math.pi - phase)
                    amount = amount * (radius - distance) / radius
                    amount = amount * wavelength / (distance + 0.00001)
                    x = j + dx * amount
                    y = i + dy * amount
                # 边界判断
                if x < 0:
                    x = 0
                if x >= cols - 1:
                    x = cols - 2
                if y < 0:
                    y = 0
                if y >= rows - 1:
                    y = rows - 2
                p = x - int(x)
                q = y - int(y)

                # 图像水波赋值
                dst[i, j, :] = (1 - p) * (1 - q) * img[int(y), int(x), :] + p * (1 - q) * img[int(y), int(x), :]
                + (1 - p) * q * img[int(y), int(x), :] + p * q * img[int(y), int(x), :]

        # 显示图像
        cv2.imshow('src', img)
        cv2.imshow('dst', dst)
        cv2.waitKey()
        cv2.destroyAllWindows()


if __name__ == '__main__':
    picture().hello().run()

[代码运行效果截图]


图片转换特效 水波 波浪滤镜


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...