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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值