加雨

加雨,第1张

加雨 1、读取图像
  • img = cv2.imread('demo.jpg')
    

2、根据图像生成随机噪声
  • 生成跟图像相同大小的噪声(均匀分布)

    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)
    

    返回生成的噪声

3、对噪声加运动模糊

根据仿射变换得到模糊核

#获得仿射变化矩阵,由于对角阵自带45度的倾斜,所以减去了45度,三个参数分别表示:中心点的位置,旋转角度,等比例缩放
trans = cv2.getRotationMatrix2D((length/2, length/2), angle-45, 1-length/100.0)
#生成对角矩阵(雨线的长度)
dig = np.diag(np.ones(length))  
#生成模糊核,通过对对角矩阵的仿射变换,得到模糊核,三个参数分别表示为:对角矩阵,仿射变换矩阵,输出的大小
k = cv2.warpAffine(dig, trans, (length, length)) 

对模糊核进行高斯模糊,使得雨有宽度

k = cv2.GaussianBlur(k, (w, w), 0) #高斯模糊这个旋转后的对角核,使得雨有宽度,高斯矩阵为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)

方法一、透明度赋值
rain_result = img.copy()
rain_result[:, :, 0] = rain_result[:, :, 0] * (255 - rain[:, :, 0])/255.0 + beta*rain[:, :, 0]
rain_result[:, :, 1] = rain_result[:, :, 1] * (255 - rain[:, :, 0])/255.0 + beta*rain[:, :, 0]
rain_result[:, :, 2] = rain_result[:, :, 2] * (255 - rain[:, :, 0])/255.0 + beta*rain[:, :, 0]

加雨的结果图为:

方法二、加权
rain = np.expand_dims(rain, 2)
rain = np.repeat(rain, 3, 2)
#加权合成新图
result = cv2.addWeighted(img, alpha, rain, 1-alpha, 1)

得到的雨天图像

epeat(rain, 3, 2)
#加权合成新图
result = cv2.addWeighted(img, alpha, rain, 1-alpha, 1)


得到的雨天图像

![addweight](http://www.kaotop.com/file/tupian/20220425/411ec1e333f24f045893453a6cb0dd40.png)

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/732699.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存