OpenCV之图像的平滑(笔记09)

Posted 月疯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV之图像的平滑(笔记09)相关的知识,希望对你有一定的参考价值。

#平均平滑(Averaging)
#计算卷积框覆盖区域所有像素的平均值得到卷积的结果
import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像平滑
def show(image):
    plt.imshow(image)
    plt.axis('off')
    plt.show()

def imread(image):
    image=cv2.imread(image)
    #把图像的BGR转换成RGB
    image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    return image
image=imread('im.jpg')

kernelsizes=[(3,3),(9,9),(15,15)]
plt.figure(figsize=(15,15))
for i,kernel in enumerate(kernelsizes):
    plt.subplot(1,3,i+1)
    #平均平滑
    blur=cv2.blur(image,kernel)
    #不显示坐标
    plt.axis('off')
    #设置标题
    plt.title('Blurr')
    plt.imshow(blur)
plt.show()

 效果展示:

#Gaussian高斯模糊:现在把卷积核换成高斯核(简单来说,方框不变,将原来每个方框的值是相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其余方框距离
中心元素的距离递减,构成一个高斯分布。原来的求平均数现在变成求加权平均数,全就是方框里的值
import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像平滑
def show(image):
    plt.imshow(image)
    plt.axis('off')
    plt.show()

def imread(image):
    image=cv2.imread(image)
    #把图像的BGR转换成RGB
    image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    return image
image=imread('im.jpg')

#Gaussian高斯模糊

kernelsizes=[(3,3),(9,9),(15,15)]
plt.figure(figsize=(15,15))
for i,kernel in enumerate(kernelsizes):
    plt.subplot(1,3,i+1)
    #平均平滑
    blur=cv2.GaussianBlur(image,kernel,0)#0表示他的标准差
    #不显示坐标
    plt.axis('off')
    #设置标题
    plt.title('Blurr')
    plt.imshow(blur)
plt.show()

效果展示:

#Median中值模糊
#用卷积框对应像素的中值来替代中心像素的值
import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像平滑
def show(image):
    plt.imshow(image)
    plt.axis('off')
    plt.show()

def imread(image):
    image=cv2.imread(image)
    #把图像的BGR转换成RGB
    image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    return image
image=imread('im.jpg')


#Median中值模糊
#用卷积框对应像素的中值来替代中心像素的值

plt.figure(figsize=(15,15))
for i,kernel in enumerate((3,9,15)):
    plt.subplot(1,3,i+1)
    #平均平滑
    blur=cv2.medianBlur(image,kernel)
    #不显示坐标
    plt.axis('off')
    #设置标题
    plt.title('Blurr')
    plt.imshow(blur)
plt.show()

效果展示:

#Bilateral双边滤波
能保持边界清晰的情况下有效的去除噪声。我们已经知道高斯滤波器是求中心点邻近区域像素的高斯加权平均值。这种高斯滤波器只考虑像素之间的空间关系,
而不会考虑像素之间的关系(像素的相似度)。所以这种方法不会考虑一个像素是否维与边界。因此边界也会被模糊掉,而这正不是我们想要。

双边滤波再同时使用空间高斯权重和灰度值相似高斯权重。空间高斯函数确保只有临近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被
用来做模糊运算。所以这种方法会确保边界不会被模糊掉,因此边界处的灰度值变化比较大。
import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像平滑
def show(image):
    plt.imshow(image)
    plt.axis('off')
    plt.show()

def imread(image):
    image=cv2.imread(image)
    #把图像的BGR转换成RGB
    image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    return image
image=imread('im.jpg')


#Bilateral双边滤波


params=[(11,21,7),(11,41,21),(15,75,75)]
plt.figure(figsize=(15,15))
#领域直径,灰度值相似性高斯函数标准差,空间高斯函数标准差
for i,(diameter,sigmaColor,sigmaSpace) in enumerate(params):
    plt.subplot(1,3,i+1)
    #平均平滑
    blur=cv2.bilateralFilter(image,diameter,sigmaColor,sigmaSpace)
    #不显示坐标
    plt.axis('off')
    #设置标题
    plt.title('Blurr')
    plt.imshow(blur)
plt.show()

效果展示:

 

 

 

 

 

 

以上是关于OpenCV之图像的平滑(笔记09)的主要内容,如果未能解决你的问题,请参考以下文章

Opencv学习笔记--图像处理平滑,锐化操作

OpenCV图像处理应用(面向Python)之阈值与平滑处理

OpenCV图像处理应用(面向Python)之阈值与平滑处理

OpenCV学习笔记——多种Smooth平滑处理

OpenCV图像处理篇之图像平滑

OpenCv之Canny边界检测(笔记13)