OpenCV图像滤波

1.滤波简介

  • 滤波实际上是信号处理的一个概念,图像可以看成一个二维信号,其中像素点灰度值得高低代表信号的强弱

  • 高频:图像中变化剧烈的部分

  • 低频︰图像中变化缓慢,平坦的部分

  • 根据图像高低频特性,设置高通和低通滤波器。高通滤波可以检测图像中尖锐、变化明显的地方,低通滤波可以让图像变得平滑﹐消除噪声干扰

  • 图像滤波是OpenCV图像处理的重要部分﹐在图像预处理方面应用广泛﹐图像滤波的好坏决定着后续处理的结果好坏

  • 邻域算子:利用给定像素周围的像素值决定此像素的最终输出值的一种算子

2. 线性滤波:

一种常用的邻域算子﹐像素输出取决于输入像素的加权和,如下图示:

在这里插入图片描述
线性滤波器输出像素g(i,j)是输入像素f(i+k, j+I)的加权和﹐其中h(k,l)我们称之为核,是滤波器的加权系数,上面式子简写为︰
                                       在这里插入图片描述

2.1方块滤波boxFliter(不常用)

在这里插入图片描述
当normalize为true时,方框滤波也就成了均值滤波。也就是说均值滤波是方框滤波归一化后的特殊情况。归一化就是将要处理的量缩放到一定范围,比如(0,1)。

void boxFilter( InputArray src,OutputArray dst,int ddepth,Size ksize,Point anchor = Point(-1-1),bool normalize = trueint borderType = BORDER_DEFAULT )
//ddepth:输出图像的深度, -1代表使用原图像深度,即src.depth()
//ksize: Size类型表示内核大小,一般用Size(w,h)表示内核大小,Size(3,3)表示3x3的核大小
//anchor:表示锚点(即被平滑的那个点),默认值Point(-1,-1),表示锚点在核中心

//一般修改Size到自己想要的值就行,其他值默认
Mat srcImg = imread("E:\\OpenCV\\images\\car.jpg");
Mat dstImg;
boxFilter(srcImg, dstImg, -1, Size(5, 5));
imshow("dst", dstImg);
imshow("img", srcImg);
waitKey(0);

在这里插入图片描述

2.2均值滤波(不常用)

均值滤波即方框滤波归一化特例,就是用邻域内像素均值来代替该点像素值﹐均值滤波在去噪的同时也破坏了图像细节部分

void  blur (InputArray  src, OutputArray  dst, Size  ksize, Point  anchor=Point(-1,-1), int borderType=BORDER_DEFAULT  )
//一般修改Size到自己想要的值就行,其他值默认
//ksize: Size类型表示内核大小,一般用Size(w,h)表示内核大小,Size(3,3)表示3x3的核大小
blur(srcImg, dstImg, Size(5, 5));

2.3高斯滤波GaussianBlur(常用)

高斯滤波器被称为最有用的滤波器,每个像素点都是由本身和邻域内的其他像素值经过加权平均后得到的,加权系数越靠近中心越大,越远离中心越小,能够很好的滤除噪声。
在这里插入图片描述

void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT);
//src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
//dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
//ksize,高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数(并不能理解)。或者,它们可以是零的,它们都是由sigma计算而来。
//sigmaX,表示高斯核函数在X方向的的标准偏差。
//sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设sigmaX,
//如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
GaussianBlur(srcImg, dstImg, Size(3,3 ), 1);

在这里插入图片描述

2.4中值滤波(常用,去掉雪花效果)

中值滤波是一种排线性港波,是用像素点邻域灰度值的中值代替该点的厌度值,可以去除脉冲噪声和椒盐噪声(去掉像实例中雪花中效果)

void medianBlur(InputArray src, OutputArray dst, int kszie);
//ksize: int类型的孔释的线性尺寸,大于1的奇数

在这里插入图片描述

2.5双边滤波bilateralFilter(官方推荐,不咋滴)

双边滤波是一种非线性滤波,是结合图像空间邻近度和像秦值相似度的一种折中处理,尽量在去噪同时保存边缘
这里直接看别的up吧

void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )
//InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
//OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
//int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
//double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
//double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
// int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.
bilateralFilter(srcImg, dstImg, 5, 10.0, 2.0);

2.6总结

在这里插入图片描述

以下是Python为图像添加下雪特效的代码示例: ```python import pygame import random # 初始化pygame pygame.init() # 设置屏幕大小 size = (700, 500) screen = pygame.display.set_mode(size) # 设置窗口标题 pygame.display.set_caption("Snow Animation") # 创建一个空白的背景 background = pygame.Surface(size) background.fill((0, 0, 0)) # 创建一个雪花列表 snow_list = [] for i in range(300): x = random.randrange(0, size[0]) y = random.randrange(0, size[1]) speed = random.randrange(1, 5) size = random.randrange(5, 10) snow_list.append([x, y, speed, size]) # 循环直到用户关闭窗口 done = False clock = pygame.time.Clock() while not done: # 检查用户是否关闭了窗口 for event in pygame.event.get(): if event.type == pygame.QUIT: done = True # 填充背景色 screen.blit(background, (0, 0)) # 移动雪花 for i in range(len(snow_list)): snow_list[i][1] += snow_list[i][2] if snow_list[i][1] > size[1]: y = random.randrange(-50, -10) snow_list[i][1] = y x = random.randrange(0, size[0]) snow_list[i][0] = x # 绘制雪花 pygame.draw.circle(screen, (255, 255, 255), snow_list[i][:2], snow_list[i][3]-3) # 更新屏幕 pygame.display.flip() # 控制帧速度 clock.tick(20) # 关闭pygame pygame.quit() ``` 这段代码使用pygame库创建了一个下雪的动画效果。它首先创建了一个空白的背景,然后创建了一个雪花列表,其中每个雪花都有一个随机的位置、速度和大小。在主循环中,它移动每个雪花并在新位置上绘制它们。最后,它使用pygame.display.flip()更新屏幕并控制帧速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值