头图 | CSDN付费下载自视觉中国
本篇文章主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波、方框滤波、高斯滤波和中值滤波。全文均是基础知识,希望对您有所帮助。知识点如下:
2.均值滤波
4.高斯滤波
PS:本文介绍图像平滑,想让大家先看看图像处理的效果,后面还会补充一些基础知识供大家学习。文章参考自己的博客及网易云课堂李大洋老师的讲解,强烈推荐大家学习。
1.图像增强
2.图像平滑
简单平滑-邻域平均法
图像简单平滑是指通过邻域简单平均对图像进行平滑处理的方法,用这种方法在一定程度上消除原始图像中的噪声、降低原始图像对比度的作用。它利用卷积运算对图像邻域的像素灰度进行平均,从而达到减小图像中噪声影响、降低图像对比度的目的。
首先给出为图像增加噪声的代码。
# -*- coding:utf-8 -*-import cv2import numpy as np#读取图片img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)rows, cols, chn = img.shape#加噪声for i in range(5000):x = np.random.randint(0, rows)y = np.random.randint(0, cols)img[x,y,:] = 255cv2.imshow("noise", img)#等待显示cv2.waitKey(0)cv2.destroyAllWindows
均值滤波
均值滤波是指任意一点的像素值,都是周围N*M个像素值的均值。例如下图中,红色点的像素值为蓝色背景区域像素值之和除25。
其中5*5的矩阵称为核,针对原始图像内的像素点,采用核进行处理,得到结果图像。
2.代码
result = cv2.blur(原始图像,核大小)
代码如下所示:
#encoding:utf-8import cv2import numpy as npimport matplotlib.pyplot as plt#读取图片img = cv2.imread('test01.png')source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#均值滤波result = cv2.blur(source, (5,5))#显示图形titles = ['Source Image', 'Blur Image']images = [source, result]for i in xrange(2):plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show
核设置为(10,10)和(20,20)会让图像变得更加模糊。
方框滤波
result = cv2.boxFilter(原始图像, 目标图像深度, 核大小, normalize属性)
normalize属性表示是否对目标图像进行归一化处理。当normalize为true时需要执行均值化处理,当normalize为false时,不进行均值化处理,实际上为求周围各像素的和,很容易发生溢出,溢出时均为白色,对应像素值为255。
代码如下所示:
#encoding:utf-8import cv2import numpy as npimport matplotlib.pyplot as plt#读取图片img = cv2.imread('test01.png')source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#方框滤波result = cv2.boxFilter(source, -1, (5,5), normalize=1)#显示图形titles = ['Source Image', 'BoxFilter Image']images = [source, result]for i in xrange(2):plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show
下面是图像左上角处理前后的像素结果:
print(source[0:3, 0:3, 0])#[[115 180 106]# [ 83 152 72]# [ 55 58 55]]print(result[0:3, 0:3, 0])#[[92 90 78]# [92 89 77]# [82 80 72]]
输出结果如下图所示:
result = cv2.boxFilter(source, -1, (2,2), normalize=0)
为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。
高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。如下图所示,中心位置权重最高为0.4。
dst = cv2.GaussianBlur(src, ksize, sigmaX)
代码如下:
#encoding:utf-8import cv2import numpy as npimport matplotlib.pyplot as plt#读取图片img = cv2.imread('test01.png')source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#高斯滤波result = cv2.GaussianBlur(source, (3,3), 0)#显示图形titles = ['Source Image', 'GaussianBlur Image']images = [source, result]for i in xrange(2):plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show
如果使用15*15的核,则图形将更加模糊。
1.概念
如下图所示,将临近像素按照大小排列,取排序像素中位于中间位置的值作为中值滤波的像素值。
OpenCV主要调用medianBlur函数实现中值滤波。图像平滑里中值滤波的效果最好。
其中,src表示源文件,ksize表示核大小。核必须是大于1的奇数,如3、5、7等。
输出结果如下图所示:
希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。
原文链接:
一文带你看网络协议之因特网中的转发和编址!| 原力计划
头条和百度“大打出手”时,微信搜索去哪儿了?
干货 | 基于SRS直播平台的监控系统之实现思路与过程
挖矿仍然有利可图吗?

