python平滑滤波_Python实现各种图像平滑

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()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值