从头学习opencv(6)--模糊操作

模糊操作基本原理

1.基于离散卷积
2.定义好每个卷积核
3.不同卷积核得到不同的卷积效果
4.模糊是卷积的一种表象

卷积原理

在这里插入图片描述

根据视频所讲的意思
2 3 6 8 5 7 6 6 9 1
2 3 5 6 6 6 6 7 5 1
5=3+6+8/3取整
7=6+6+9/3

模糊操作

1.均值模糊

#均值模糊
def blur_demo(image):
    #卷积,卷积之后变平滑(5,5)是一个5行5列的矩阵
    dst=cv.blur(image,(5,5))
    cv.imshow("blur_demo",dst)

2.中值模糊

#中值模糊
def median_demo(image):
    #卷积,卷积之后变平滑(5,5)是一个5行5列的矩阵
    dst=cv.medianBlur(image,5)
    cv.imshow("median_demo",dst)

3.自定义模糊

#自定义模糊
def custom_blur_demo(image):
    #kernel=np.ones([5,5],np.float32)/25#除以25是为了防止溢出
    #kernel = np.array([[1,1,1], [1,1,1],[1,1,1]],np.float32) / 9#3*3的,所以除以9
    kernel = np.array([[0,-1,0], [-1,5,-1], [0,-1,0]], np.float32)
    #效果出来不是模糊,反而更立体了,是为锐化
    dst=cv.filter2D(image,-1,kernel=kernel)
    cv.imshow("custom_blur_demo",dst)

最后说一下这个函数filter2D(),以下解释转自https://blog.csdn.net/keith_bb/article/details/53103026
对于使用掩模板矩阵(kernel)计算每个像素值,结合函数filter2D()函数,其定义如下:

CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth,InputArray kernel, Point anchor=Point(-1,-1),double delta=0, int borderType=BORDER_DEFAULT );
其官方指导文件对filter2D()函数的描述为:Convolves an image with kernel即利用内核实现对图像的卷积运算。参数含义如下:

InputArray src: 输入图像

OutputArray dst: 输出图像,和输入图像具有相同的尺寸和通道数量

int ddepth: 目标图像深度,如果没写将生成与原图像深度相同的图像。原图像和目标图像支持的图像深度如下:

src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_64F, ddepth = -1/CV_64F

当ddepth输入值为-1时,目标图像和原图像深度保持一致。

InputArray kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵。如果想在图像不同的通道使用不同的kernel,可以先使用split()函数将图像通道事先分开。

Point anchor: 内核的基准点(anchor),其默认值为(-1,-1)说明位于kernel的中心位置。基准点即kernel中与进行处理的像素点重合的点。

double delta: 在储存目标图像前可选的添加到像素的值,默认值为0

在这次的代码中, dst=cv.filter2D(image,-1,kernel=kernel)
image是原图像,-1说明目标图像与原图像深度保持一致。、

完整代码

import cv2 as cv
import numpy as np

#均值模糊
def blur_demo(image):
    #卷积,卷积之后变平滑(5,5)是一个5行5列的矩阵
    dst=cv.blur(image,(5,5))
    cv.imshow("blur_demo",dst)


#中值模糊
def median_demo(image):
    #卷积,卷积之后变平滑(5,5)是一个5行5列的矩阵
    dst=cv.medianBlur(image,5)
    cv.imshow("median_demo",dst)


#自定义模糊
def custom_blur_demo(image):
    #kernel=np.ones([5,5],np.float32)/25#除以25是为了防止溢出
    #kernel = np.array([[1,1,1], [1,1,1],[1,1,1]],np.float32) / 9#3*3的,所以除以9
    kernel = np.array([[0,-1,0], [-1,5,-1], [0,-1,0]], np.float32)
    #效果出来不是模糊,反而更立体了,是为锐化
    dst=cv.filter2D(image,-1,kernel=kernel)
    cv.imshow("custom_blur_demo",dst)


src = cv.imread("C:/Users/Administrator/Desktop/demo.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
#blur_demo(src)
#median_demo(src)
custom_blur_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
print("Hi,python!")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值