1、高斯平滑
import cv2
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
def gaussBlur(image,sigma,H,W,_boundary='fill',_fillvalue=0):
gaussKenrnel_x=cv2.getGaussianKernel(sigma,W,cv2.CV_64F)
gaussKenrnel_x=np.transpose(gaussKenrnel_x)
gaussBlur_x=signal.convolve2d(image,gaussKenrnel_x,mode='same',boundary=_boundary,fillvalue=_fillvalue)
gaussKenrnel_y=cv2.getGaussianKernel(sigma,H,cv2.CV_64F)
gaussBlur_xy=signal.convolve2d(gaussBlur_x,gaussKenrnel_y,mode='same',boundary=_boundary,fillvalue=_fillvalue)
return gaussBlur_xy
image=cv2.imread("/home/xiaomingming/profile/xmm.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("image",image)
#H,W=image.shape
blurImage=gaussBlur(image,5,51,51,'symm')
blurImage=np.round(blurImage)
blurImage=blurImage.astype(np.uint8)
cv2.imshow("blurImage",blurImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、均值平滑
import cv2
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
def integral(image):
rows,cols=image.shape
inteImageC=np.zeros((rows,cols),np.float32)
for r in range(rows):
for c in range(cols):
if c==0:
inteImageC[r][c]=image[r][c]
else:
inteImageC[r][c]=inteImageC[r][c-1]+image[r][c]
inteImage=np.zeros(image.shape,np.float32)
for c in range(cols):
for r in range(rows):
if r==0:
inteImage[r][c]=inteImageC[r][c]
else:
inteImage[r][c]=inteImage[r-1][c]+inteImageC[r][c]
inteImage_0=np.zeros((rows+1,cols+1),np.float32)
inteImage_0[1:rows+1,1:cols+1]=inteImage
return inteImage_0
def fastMeanBlur(image,winSize,borderType=cv2.BORDER_DEFAULT):
halfH=(winSize[0]-1)//2
halfW=(winSize[1]-1)//2
ratio=1.0/(winSize[0]*winSize[1])
paddImage=cv2.copyMakeBorder(image,halfH,halfH,halfW,halfW,borderType)
paddIntegral=integral(paddImage)
rows,cols=image.shape
meanBlurImage=np.zeros(image.shape,np.float32)
r,c=0,0
for h in range(halfH,halfH+rows,1):
for w in range(halfW,halfW+cols,1):
meanBlurImage[r][c]=ratio*(paddIntegral[h+halfH+1][w+halfW+1]+paddIntegral[h-halfH][w-halfW]-paddIntegral[h+halfH+1][w-halfW]-paddIntegral[h-halfH][w+halfW+1])
c+=1
r+=1
c=0
return meanBlurImage
image=cv2.imread("/home/xiaomingming/profile/xmm.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("image",image)
#H,W=image.shape
blurImage=fastMeanBlur(image,(11,11))
blurImage=np.round(blurImage)
blurImage=blurImage.astype(np.uint8)
cv2.imshow("blurImage",blurImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
3、中值平滑
import cv2
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
def medianBlur(image,winSize):
rows,cols=image.shape
winH,winW=winSize
halfWinH=(winH-1)//2
halfWinW=(winW-1)//2
medianBlurImage=np.zeros(image.shape,image.dtype)
for r in range(rows):
for c in range(cols):
if r-halfWinH<0:
rTop=0
else:
rTop=r-halfWinH
if r+halfWinH>rows-1:
rBottom=rows-1
else:
rBottom=r+halfWinH
if c-halfWinW<0:
cLeft=0
else:
cLeft=c-halfWinW
if c+halfWinW>cols-1:
cRight=cols-1
else:
cRight=c+halfWinW
region=image[rTop:rBottom+1,cLeft:cRight+1]
medianBlurImage[r][c]=np.median(region)
return medianBlurImage
image=cv2.imread("/home/xiaomingming/profile/xmm.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("image",image)
#H,W=image.shape
blurImage=medianBlur(image,(3,3))
blurImage=np.round(blurImage)
blurImage=blurImage.astype(np.uint8)
cv2.imshow("blurImage",blurImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
4、双边滤波
import cv2
import numpy as np
from scipy import signal
import math
def getClosenessWeight(sigma_g,H,W):
r,c=np.mgrid[0:H:1,0:W:1]
r-=(H-1)//2
c-=int(W-1)//2
closeWeight=np.exp(-0.5*(np.power(r,2)+np.power(c,2))/math.pow(sigma_g,2))
return closeWeight
def bfltGray(I,H,W,sigma_g,sigma_d):
closenessWeight=getClosenessWeight(sigma_g,H,W)
cH=(H-1)//2
cW=(W-1)//2
rows,cols=I.shape
bfltGrayImage=np.zeros(I.shape,np.float32)
for r in range(rows):
for c in range(cols):
pixel=I[r][c]
rTop=0 if r-cH<0 else r-cH
rBottom=rows-1 if r+cH>rows-1 else r+cH
cLeft=0 if c-cW<0 else c-cW
cRight=cols-1 if c+cW>cols-1 else c+cW
region=I[rTop:rBottom+1,cLeft:cRight+1]
similarityWeightTemp=np.exp(-0.5*np.power(region-pixel,2.0)/math.pow(sigma_d,2))
closenessWeightTemp=closenessWeight[rTop-r+cH:rBottom-r+cH+1,cLeft-c+cW:cRight-c+cW+1]
weightTemp=similarityWeightTemp*closenessWeightTemp
weightTemp=weightTemp/np.sum(weightTemp)
bfltGrayImage[r][c]=np.sum(region*weightTemp)
return bfltGrayImage
image=cv2.imread("/home/xiaomingming/profile/xmm.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("yuantu",image)
image=image/255.0
bfltImage=bfltGray(image,33,33,19,0.2)
cv2.imshow("hou",bfltImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
5、联合双边滤波
import cv2
import numpy as np
from scipy import signal
import math
def getClosenessWeight(sigma_g,H,W):
r,c=np.mgrid[0:H:1,0:W:1]
r-=(H-1)//2
c-=int(W-1)//2
closeWeight=np.exp(-0.5*(np.power(r,2)+np.power(c,2))/math.pow(sigma_g,2))
return closeWeight
def jointBLF(I,H,W,sigma_g,sigma_d,borderType=cv2.BORDER_DEFAULT):
closenessWeight=getClosenessWeight(sigma_g,H,W)
Ig=cv2.GaussianBlur(I,(W,H),sigma_g)
cH=(H-1)//2
cW=(W-1)//2
Ip=cv2.copyMakeBorder(I,cH,cH,cW,cW,borderType)
Igp=cv2.copyMakeBorder(Ig,cH,cH,cW,cW,borderType)
rows,cols=I.shape
i,j=0,0
jblf=np.zeros(I.shape,np.float64)
for r in range(cH,cH+rows,1):
for c in range(cW,cW+cols,1):
pixel=Igp[r][c]
rTop,rBottom=r-cH,r+cH
cLeft,cRight=c-cW,c+cW
region=Igp[rTop:rBottom+1,cLeft:cRight+1]
similarityWeight=np.exp(-0.5*np.power(region-pixel,2.0)/math.pow(sigma_d,2.0))
weight=closenessWeight*similarityWeight
weight=weight/np.sum(weight)
jblf[i][j]=np.sum(Ip[rTop:rBottom+1,cLeft:cRight+1]*weight)
j+=1
j=0
i+=1
return jblf
I=cv2.imread("/home/xiaomingming/profile/xmm.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("I",I)
fI=I.astype(np.float64)
jblf=jointBLF(fI,33,33,7,2)
jblf=np.round(jblf)
jblf=jblf.astype(np.uint8)
cv2.imshow("jblf",jblf)
cv2.waitKey(0)
cv2.destroyAllWindows()