用OpenCv将图片变成水中倒影的形式


前言

在我们生活的环境中有许多美丽的自然风景,如果将这些优美风景图加上类似于在湖边的镜像效果,则能更好地体现出其立体感,使其更具欣赏性。本文使用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()

---
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值