代码语言: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,即计算出水波导致像素点偏移位移。