門戶網(wǎng)站建設(shè)工作匯報不受限制的搜索引擎
加上雨點(diǎn)噪聲
import cv2
import numpy as npdef get_noise(img, value=10):'''#生成噪聲圖像>>> 輸入: img圖像value= 大小控制雨滴的多少 >>> 返回圖像大小的模糊噪聲圖像'''noise = np.random.uniform(0, 256, img.shape[0:2])# 控制噪聲水平,取浮點(diǎn)數(shù),只保留最大的一部分作為噪聲v = value * 0.01noise[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 noisedef rain_blur(noise, length=10, angle=0,w=1):'''將噪聲加上運(yùn)動模糊,模仿雨滴>>>輸入noise:輸入噪聲圖,shape = img.shape[0:2]length: 對角矩陣大小,表示雨滴的長度angle: 傾斜的角度,逆時針為正w: 雨滴大小>>>輸出帶模糊的噪聲'''#這里由于對角陣自帶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) #高斯模糊這個旋轉(zhuǎn)后的對角核,使得雨有寬度#k = k / length #是否歸一化blurred = cv2.filter2D(noise, -1, k) #用剛剛得到的旋轉(zhuǎn)后的核,進(jìn)行濾波#轉(zhuǎn)換到0-255區(qū)間cv2.normalize(blurred, blurred, 0, 255, cv2.NORM_MINMAX)blurred = np.array(blurred, dtype=np.uint8)return blurreddef alpha_rain(rain,img,beta = 0.8):#輸入雨滴噪聲和圖像#beta = 0.8 #results weight#顯示下雨效果#expand dimensin#將二維雨噪聲擴(kuò)張為三維單通道#并與圖像合成在一起形成帶有alpha通道的4通道圖像rain = np.expand_dims(rain,2)rain_effect = np.concatenate((img,rain),axis=2) #add alpha channelrain_result = img.copy() #拷貝一個掩膜rain = np.array(rain,dtype=np.float32) #數(shù)據(jù)類型變?yōu)楦↑c(diǎn)數(shù),后面要疊加,防止數(shù)組越界要用32位rain_result[:,:,0]= rain_result[:,:,0] * (255-rain[:,:,0])/255.0 + 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]#對每個通道先保留雨滴噪聲圖對應(yīng)的黑色(透明)部分,再疊加白色的雨滴噪聲部分(有比例因子)cv2.imwrite('rain_result.png', np.uint8(rain_result))img = cv2.imread('cv.png')
noise = get_noise(img,value=500)
rain = rain_blur(noise,length=50,angle=-30,w=3)
alpha_rain(rain,img,beta=0.6)
加上光斑噪聲
利用一張光斑的圖像加在原始圖像上:
import numpy as np
import cv2
from PIL import Imageimage1 = cv2.imread('cub1.jpg')
image2 = cv2.imread('ban.jpg')height = image1.shape[0]
width = image1.shape[1]
image2 = cv2.resize(image2, (width, height), interpolation = cv2.INTER_LINEAR)
image = (image1 + image2) // 2cv2.imwrite('cv.png', np.uint8(image))