python-opencv笔记6

滤波器

低通滤波器 (low pass filter,LPF)

平滑 去噪 模糊化
在像素与邻近像素的亮度差值小于一个特定值时平滑该像素的亮度,降低图像变化率。

高通滤波器(HPF)

在像素与邻近像素的亮度差值很大时增加该像素的亮度


–>
均值模糊
dst = cv2.blur(image,(5,5))

import cv2 as cv
import numpy as np

def blur_demo(image):
    dst = cv.blur(image,(5,5))
    cv.imshow("blur_demo",dst)

python-opencv笔记6_第1张图片
python-opencv笔记6_第2张图片


–>
中值模糊 过滤椒盐噪声
dst = cv2.medianBlur(image,5)

def median_blur_demo(image):
    dst = cv.medianBlur(image,5)
    cv.imshow("median_blur_demo", dst)

python-opencv笔记6_第3张图片


–>
自定义核
dst = cv.filter2D(image,-1,kernel)

-1 :此时与原图像深度保持一致
kernel : 自定义的核

def custom_blur_demo(image):
	kernel1 = np.ones([5,5],np.float32)/25    #相当于均值模糊,记住需要除以元素个数防止溢出
    dst1 = cv.filter2D(image,-1,kernel1)
    cv.imshow("custom_blur_demo1", dst1)

    kernel2 = np.array([[-1,-1,-1],
                        [-1,9,-1],
                        [-1,-1,-1]])       #锐化,差异增加    权重为1,不改变亮度
    dst2 = cv.filter2D(image, -1, kernel2)
    cv.imshow("custom_blur_demo2", dst2)

    kernel3 = np.array([[0, -1, 0],
                        [-1, 5, -1],
                        [0, -1, 0]])  # 锐化,总和为1
    dst3 = cv.filter2D(image, -1, kernel3)
    cv.imshow("custom_blur_demo3", dst3)

    kernel4 = np.array([[-1, -1, -1],
                        [-1, 8, -1],
                        [-1, -1, -1]])        #权重为0,-->边缘检测核,边缘为白,非边缘为黑
    dst4 = cv.filter2D(image, -1, kernel4)
    cv.imshow("custom_blur_demo4", dst4)

    kernel5 = np.array([[-2, -1, 0],
                        [-1, 1, 1],
                        [0, 1, 2]])           #同时具有 模糊(正值) 和 锐化(负值) 的作用
    dst5 = cv.filter2D(image, -1, kernel5)    #产生脊状或浮雕效果
    cv.imshow("custom_blur_demo5", dst5)

[[-1,-1,-1],
[-1,9,-1],
[-1,-1,-1]]
核,大小为3(3x3),为一组像素值 权重 的集合
也称为卷积矩阵,二维数组,奇数行,奇数列


–>
高斯滤波(正态)过滤随机噪声
cv2.GaussianBlur(img, (5, 5), 0)

(5,5):ksize,高斯内核的大小,都为奇数,可以不相同若为0由sigma计算,值越大越模糊
0 :sigmax,X方向上的标准偏差,为0时由ksize计算,值越大越模糊

def gaussian_blur(img):
    dst = cv.GaussianBlur(img, (5, 5), 0)
    cv.imshow("gaussian",dst)

    dst1 = cv.GaussianBlur(img, (11, 11), 3)
    cv.imshow("gaussian1", dst1)

    dst2 = cv.GaussianBlur(img, (3, 3), 11)
    cv.imshow("gaussian2", dst2)

python-opencv笔记6_第4张图片


–>
双边滤波(边缘保留) 保持图像特征 相当于磨皮滤镜 (文字可保留) 效率不高
颜色差异大则权重小,颜色差异小则权重大
dst = cv2.bilateralFilter(img, 0, 100, 15)

0 : d,过滤过程中像素的邻域直径范围,<=0时 由sigmaSpace计算
100 : sigmaColor,空间高斯函数标准差, 越大则该邻域内颜色差异越大的颜色将被混合
15 : sigmaSpace,灰度值相似性高斯函数标准差,越大则距离越远的颜色相近的颜色将相互影响

def bi_demo(img):
    dst1 = cv.bilateralFilter(img, 0, 100, 15)
    cv.imshow("bi_demo1", dst1)

    dst2 = cv.bilateralFilter(img, 0, 15, 100)
    cv.imshow("bi_demo2", dst2)

    dst3 = cv.bilateralFilter(img, 0, 15, 15)
    cv.imshow("bi_demo3", dst3)
    
    dst4 = cv.bilateralFilter(img, 0, 100, 100)    #电脑比较烂...结果这个慢到怀疑人生

python-opencv笔记6_第5张图片
so,sigmaColor较大sigmaSpace较小时,效果效果较好


–>
均值边缘保留滤波 平滑色彩细节
dst = cv2.pyrMeanShiftFiltering(img, 10, 50)

10 : 空间窗半径
50 :色彩窗半径

def shift_demo(img):
    dst = cv.pyrMeanShiftFiltering(img, 10, 50)
    cv.imshow("shift_demo", dst)

python-opencv笔记6_第6张图片


print("----------------------")
src1 = cv.imread("D:/sourses/picture/001.jpg")
src2 = cv.imread("D:/sourses/picture/1.1.png")
cv.imshow("image", src1)
#cv.imshow("image", src2)
blur_demo(src2)
median_blur_demo(src2)
custom_blur_demo(src2)
gaussian_blur(src2)
bi_demo(src1)
shift_demo(src1)
cv.waitKey(0)
cv.destroyAllWindows()

你可能感兴趣的:(python-opencv笔记6)