opencv 平滑图像

阅读更多
opencv 平滑图像



模糊/平滑图片来消除图片噪声
OpenCV函数:cv2.blur(), cv2.GaussianBlur(), cv2.medianBlur(), cv2.bilateralFilter()


均值滤波(会模糊会边缘)
blur(src, ksize, dst=None, anchor=None, borderType=None)

ksize:卷积核大小




方框滤波
方框滤波跟均值滤波很像,如下面的公式。用cv2.boxFilter()函数实现,事实上,当可选参数normalize为True的时候,方框滤波就是均值滤波,如3×3的核,a就等于1/9;normalize为False的时候,a=1,相当于求区域内的像素和。

boxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None):


高斯滤波
GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

参数3 σx值越大,模糊效果越明显。


中值滤波
中值又叫中位数,是所有值排序后取中间的值。
所以那种孤立的斑点,如0或255很容易消除掉,适用于去除椒盐噪声和斑点噪声。
medianBlur(src, ksize, dst=None)




双边滤波
模糊操作基本都会损失掉图像细节信息,尤其前面介绍的线性滤波器,图像的边缘信息很难保留下来。然而,边缘edge信息是图像中很重要的一个特征,所以这才有了双边滤波。

双边滤波中双边的意思是同时考虑两条边(因素),这两条边分别是空间域和值域。这里的空间域是指考虑空间位置关系,根据距离核心位置的距离的远近给予不同的加权值,原理和高斯滤波一样。而值域是指考虑邻域范围内的像素差值计算出滤波器系数,类似于α-截尾均值滤波器(去掉百分率为α的最小值和最大之后剩下像素的均值作为滤波器)。

其中sigmaColor越大,就表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的相等颜色区域。sigmaSpace越大,则表明越远的像素会对kernel中心的像素产生影响,从而使更大的区域中足够相似的颜色获取相同的颜色。

bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)

d:每个像素邻域的直径
sigmaColor:
sigmaSpace:


# -*-encoding:utf-8-*-
import pytesseract
from PIL import Image
from PIL import ImageFilter
from PIL import ImageFont
from PIL import ImageDraw
import numpy as np
from PIL import Image

import cv2


def main():
    # 颜色空间转换
    img = cv2.imread("learn.jpg")

    # =================================均值滤波(会模糊会边缘)
    # blur(src, ksize, dst=None, anchor=None, borderType=None)
    # ksize: 卷积核大小
    res = cv2.blur(img,(3, 3))

    # =================================方框滤波

    boxFilter = cv2.boxFilter(img, -1, (3, 3), normalize=True)
    res = cv2.boxFilter(img, -1, (3, 3), normalize=False)

    # =================================高斯滤波
    res = cv2.GaussianBlur(img, (5, 5), 1)  # 高斯滤波

    # 参数3 σx值越大,模糊效果越明显。

    # =================================中值滤波
    # 中值又叫中位数,是所有值排序后取中间的值。
    # medianBlur(src, ksize, dst=None)
    res = cv2.medianBlur(img, 5)  # 中值滤波

    # =================================双边滤波
    # 模糊操作基本都会损失掉图像细节信息,尤其前面介绍的线性滤波器,
    # 图像的边缘信息很难保留下来。然而,边缘edge信息是图像中很重要的一个特征,所以这才有了双边滤波。
    res= cv2.bilateralFilter(img, 9, 75, 75)  # 双边滤波

    # cv2.imshow('img', img)
    # cv2.imshow('boxFilter', boxFilter)
    cv2.imshow('res', res)
    cv2.waitKey(0)



if __name__ == '__main__':
    main()




你可能感兴趣的:(opencv 平滑图像)