图像水波特效

2022-05-29 10:06:50 浏览数 (1)

代码语言:javascript复制
import cv2
import math
import numpy as np
img=cv2.imread('C:/Users/xpp/Desktop/Lena.png')
rows,cols=img.shape[:2]
dst=np.zeros((rows,cols,3),dtype="uint8")
#定义水波特效参数
wavelength=20
amplitude=30
phase=math.pi/4
#获取中心点
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.0001)
            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('original',img)
cv2.imshow('result',dst)
cv2.waitKey()
cv2.destroyAllWindows()

算法:图像水波特效是围绕水波中心点进行波纹涟漪传递。如图,红轴表示水面,蓝色椭圆表示水波。

对于某个点x,其运动轨迹上的每个点都可以分解为与视线平行和垂直的2个方向上的位移,计算出垂直视线的位移y,即计算出水波导致像素点偏移位移。

0 人点赞