在我们生活的环境中有许多美丽的自然风景,如果将这些优美风景图加上类似于在湖边的镜像效果,则能更好地体现出其立体感,使其更具欣赏性。本文使用opencv实现这种效果:首先将图像扭曲,然后为了体现出水纹效果,将图片与自然环境中的水面进行图像融合,最后与原图像拼接即可。
图像扭曲的目的是为了模仿出自然环境下自然风景在水面反射后,产生扭曲的效果。本文采用图像的像素位置偏移的方法使图像变得扭曲。将图像的像素坐标偏移 7Sin(0.2t)个位置(式中t为图像像素的纵坐标)
原图:
扭曲变换的图像:
为了使图像呈现的效果更加的自然,本文采用水面图像和风景图像融合的方法。将两张图像的R、G、B三个通道的值均乘以0.5后,在将两张图像的R、G、B三个通道相加在一起,即可使风景图像获得波纹的效果。如果改变两张图像的R、G、B的比例,可以使自然环境和水面在图像中的比重改变。
图像拼接采用cv2.flip()函数实现。首先将图像翻转,再将图1和图4上下拼接在一起即可。
import cv2
import numpy as np
water=cv2.imread('water.jpg')
enviorment=cv2.imread('enviorment.jpg')
water=cv2.imread('water.jpg')
#print(water.shape)
#print(enviorment.shape)
#new_dog=dog[:250,:200]
#img_add=cv2.add(new_dog//2,cat//2)
#cv2.imshow('new_img',np.hstack((cat,new_dog,img_add)))
#print(enviorment.shape[0:2])
#new_water=cv2.resize(water,[500,500],interpolation=cv2.INTER_AREA)
new_enviorment=cv2.resize(enviorment,[300,300],interpolation=cv2.INTER_AREA)
water=cv2.resize(water,[300,300],interpolation=cv2.INTER_AREA)
#new_enviorment1=cv2.add(new_enviorment*0.01,water*0.99)
#print(type(new_enviorment))
#new1_enviorment=new_enviorment[[1:40],[1:40]]
#new_enviorment[0:10,0:10]
print(new_enviorment.shape)
#对横坐标进行处理,像素点乘A*tsin(B*t),,t=np.array([0:499])
t = np.arange(0,300)
sint=7*np.sin(0.2*t)
int_sint=sint.astype(int)
new_enviorment1=new_enviorment[t+int_sint]
print(t)
#cv2.imshow('new_enviorment1',new_enviorment1)
#new_enviorment1=cv2.flip(new_enviorment1,0)
new_enviorment1=cv2.add(new_enviorment1//2,water//2)
new_enviorment2= np.zeros((600,300, 3), np.uint8)
new_enviorment2[0:300,0:300] = new_enviorment
new_enviorment2[300:600,0:300] = new_enviorment1[0:300,0:300]
u = np.arange(280,320)
sinu=np.sin(u)
int_sinu=sinu.astype(int)
#new_enviorment1=new_enviorment[t+int_sint]
new_enviorment3= new_enviorment2[u+int_sinu]
#new_enviorment1=cv2.vconcat(new_enviorment, new_enviorment1);
#img_add=cv2.add(new_water//2,new_enviorment//2)
#img_mul=cv2.multiply(new_water,new_enviorment)
#print(np.multiply(new_water, new_enviorment))
#cv2.imshow('img_mul',np.multiply(new_water, new_enviorment))
#cv2.imshow('img_add',img_add)
#cv2.imshow('new_water',new_water)
cv2.imshow('new_enviorment',new_enviorment2)
cv2.imshow('new_enviorment1',new_enviorment1)
cv2.imshow('new_enviorment3',new_enviorment3)
key = cv2.waitKey(0)
if key == ord('q'):
cv2.destroyAllWindows()
---
。