cv2和numpy模块实现下雨效果


用到的包

import cv2
import numpy as np

初次模糊

def get_noise(img,value = 10):

    noise = np.random.uniform(0,256,img.shape[0:2])
    v = value * 0.01
    noise[np.where(noise < (256 - v))] = 0

    k = np.array([ [0,0.1,0],
                 [0.1,8,0.1],
                 [0,0.1,0] ])

    noise = cv2.filter2D(noise,-1,k)

    """cv2.imshow('img',noise)
    cv2.waitKey()
    cv2.destroyWindow('img')"""
    return noise

再次模糊

def rain_blur(noise,length = 10,angle = 0,w = 1):
    trans = cv2.getRotationMatrix2D((length / 2,length / 2),angle - 45,1 - length / 100)
    dig = np.diag(np.ones(length))
    k = cv2.warpAffine(dig,trans,(length,length))
    k = cv2.GaussianBlur(k,(w,w),0)
    blurred = cv2.filter2D(noise,-1,k)
    cv2.normalize(blurred,blurred,0,255,cv2.NORM_MINMAX)
    blurred = np.array(blurred,dtype = np.uint8)

    return blurred

第一种效果

def alpha_rain(rain,img,beta = 0.8):
    rain = np.expand_dims(rain,2)
    rain_effect = np.concatenate((img,rain),axis = 2)

    rain_result = img.copy()
    rain = np.array(rain,dtype = np.float32)
    rain_result[:,:,0] = rain_result[:,:,0] * (255 - rain[:,:,0]) / 255 + beta * rain[:,:,0]
    rain_result[:,:,1] = rain_result[:,:,1] * (255 - rain[:,:,0]) / 255 + beta * rain[:,:,0]
    rain_result[:,:,2] = rain_result[:,:,2] * (255 - rain[:,:,0]) / 255 + beta * rain[:,:,0]

    #把图像设定为灰度
    #rain_result = cv2.cvtColor(rain_result,cv2.COLOR_RGB2GRAY)
    cv2.imshow('rain_effct_result',rain_result)
    k = cv2.waitKey()
    #按s保存图片
    if k == ord('s'):
        cv2.imwrite('girl_1.jpeg',rain_result,[int(cv2.IMWRITE_JPEG_QUALITY),100])
        cv2.destroyWindow('rain_effct_result')
    else:
        cv2.destroyWindow('rain_effct_result')

第二种效果

def add_rain(rain,img,alpha = 0.9):
    rain = np.expand_dims(rain,2)
    rain = np.repeat(rain,3,2)

    result = cv2.addWeighted(img,alpha,rain,1 - alpha,1)

    #result = cv2.cvtColor(result,cv2.COLOR_RGB2GRAY)
    cv2.imshow('rain_effct',result)
    k = cv2.waitKey()
    if k == ord('s'):
        cv2.imwrite('girl_2.png',result,[int(cv2.IMWRITE_PNG_COMPRESSION),3])
        cv2.destroyWindow('rain_effct')
    else:
        cv2.destroyWindow('rain_effct')

开始运行

img = cv2.imread('girl.jpeg')
noise = get_noise(img,value = 500)
rain = rain_blur(noise,length = 50,angle = -30,w = 3)
alpha_rain(rain,img,beta=0.6)
add_rain(rain,img)

静态文件

效果1

效果2

似乎不能上传png文件,所以改成了jpg格式