Python调用OpenCV实现图像平滑代码实例


Posted in Python onJune 19, 2020

主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波、方框滤波、高斯滤波和中值滤波.

给图像增加噪声:

import cv2
import numpy as np

def test10():
  img = cv2.imread("result.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, :] = 255
  cv2.imshow("demo", img)
  if cv2.waitKey(0) == 27:
    cv2.destroyWindow("demo")
test10()

效果如下:

Python调用OpenCV实现图像平滑代码实例

均值滤波: 均值滤波是指任意一点的像素值,都是周围N*M个像素值的均值, result = cv2.blur(图像, 核大小),其中核大小是以(宽度, 高度)表示的元组形式,常见的形式包括: (3, 3)和(5, 5)

代码如下:

import matplotlib.pyplot as plt
import cv2
def test11():
  img = cv2.imread("result.jpg")
  source = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
  # 均值滤波
  result = cv2.blur(source, (5, 5))

  # 显示图像
  title = ["demo1", "demo2"]
  imgs = [source, result]
  for i in range(2):
    plt.subplot(1, 2, i+1)
 plt.imshow(imgs[i], "gray")
    plt.title(title[i])
    plt.xticks([])
    plt.yticks([])
  plt.show()
test11()

效果如下:

Python调用OpenCV实现图像平滑代码实例

将核值调大会让图像变模糊,例如设置为(20, 20),效果如下:如果设置为(1, 1)处理的结果就是原图,核中每个权重值相同,称为均值。

Python调用OpenCV实现图像平滑代码实例

方框滤波

方框滤波和均值滤波核基本一致,区别是需不需要均一化处理。OpenCV调用boxFilter()函数实现方框滤波。函数如下:
result = cv2.boxFilter(原始图像, 目标图像深度, 核大小, normalize属性) 其中,目标图像深度是int类型,通常用“-1”表示与原始图像一致;核大小主要包括(3,3)和(5,5);normalize属性表示是否对目标图像进行归一化处理。当normalize为true时需要执行均值化处理,当normalize为false时,不进行均值化处理,实际上为求周围各像素的和,很容易发生溢出,溢出时均为白色,对应像素值为255。

代码如下:

import cv2
import matplotlib.pyplot as plt
def test12():
  img = cv2.imread("result.jpg")
  source = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
  # 方框滤波
  result = cv2.boxFilter(source, -2, (5, 5), normalize=1)
  # 显示图像
  title = ["demo1", "demo2"]
  imgs = [source, result]
  for i in range(2):
    plt.subplot(1, 2, i+1), plt.imshow(imgs[i], "gray")
    plt.title(title[i])
    plt.xticks([])
    plt.yticks([])
  plt.show()
test12()

效果如下:

Python调用OpenCV实现图像平滑代码实例

如果省略参数normalize,则默认是进行归一化处理。如果normalize=0则不进行归一化处理,像素值为周围像素之和,图像更多为白色。

效果如下:

Python调用OpenCV实现图像平滑代码实例

上图很多像素为白色,因为图像求和结果几乎都是255。如果设置的是2*2矩阵,只取四个像素结果要好些。 result = cv2.boxFilter(source, -1, (2,2), normalize=0)

Python调用OpenCV实现图像平滑代码实例

高斯滤波: 高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。dst = cv2.GaussianBlur(src, ksize, sigmaX) 其中,src表示原始图像,ksize表示核大小,sigmaX表示X方向方差。注意,核大小(N, N)必须是奇数,X方向方差主要控制权重

代码如下:

import cv2
import matplotlib.pyplot as plt
def test12():
  img = cv2.imread("result.jpg")
  source = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
  # 高斯滤波
  result = cv2.GaussianBlur(source, (3, 3), 0)
  # 显示图像
  title = ["demo1", "demo2"]
  imgs = [source, result]
  for i in range(2):
    plt.subplot(1, 2, i+1), plt.imshow(imgs[i], "gray")
    plt.title(title[i])
    plt.xticks([])
    plt.yticks([])
  plt.show()
test12()

效果如下:

Python调用OpenCV实现图像平滑代码实例

核数增加,图像会变模糊,例如设置为(17, 17)

Python调用OpenCV实现图像平滑代码实例

中值滤波: 在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值.

OpenCV主要调用medianBlur()函数实现中值滤波,图像平滑里中值滤波的效果最好。
dst = cv2.medianBlur(src, ksize)
其中,src表示源文件,ksize表示核大小。核必须是大于1的奇数,如3、5、7等

代码如下:

import cv2
def test13():
  img = cv2.imread("result.jpg")
  # 高斯滤波
  result = cv2.medianBlur(img, 5)
  cv2.imshow("demo1", img)
  cv2.imshow("demo2", result)
  if cv2.waitKey(0) == 27:
    cv2.destroyWindow("demo1")
    cv2.destroyWindow("demo2")
test13()

效果如下:

Python调用OpenCV实现图像平滑代码实例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的加密模块md5、sha、crypt使用实例
Sep 28 Python
python多进程操作实例
Nov 21 Python
详解python实现读取邮件数据并下载附件的实例
Aug 03 Python
django实现同一个ip十分钟内只能注册一次的实例
Nov 03 Python
Python绘制3D图形
May 03 Python
Python实现的多叉树寻找最短路径算法示例
Jul 30 Python
numpy基础教程之np.linalg
Feb 12 Python
Python 占位符的使用方法详解
Jul 10 Python
django rest framework 实现用户登录认证详解
Jul 29 Python
Django框架 信号调度原理解析
Sep 04 Python
django-利用session机制实现唯一登录的例子
Mar 16 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
Jun 04 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 #Python
为什么python比较流行
Jun 19 #Python
查看keras的默认backend实现方式
Jun 19 #Python
Python图像阈值化处理及算法比对实例解析
Jun 19 #Python
OpenCV 之按位运算举例解析
Jun 19 #Python
Python实现ElGamal加密算法的示例代码
Jun 19 #Python
python 字符串的驻留机制及优缺点
Jun 19 #Python
You might like
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
PHP面向对象分析设计的经验原则
2008/09/20 PHP
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
2007/02/09 Javascript
我见过最全的个人js加解密功能页面
2007/12/12 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
详解AngularJS中的filter过滤器用法
2016/01/04 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
jQuery的each循环用法简单示例
2016/06/12 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
使用vue2实现购物车和地址选配功能
2018/03/29 Javascript
JavaScript实现简单动态进度条效果
2018/04/06 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
Python字符串格式化输出方法分析
2016/04/13 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
python输出pdf文档的实例
2020/02/13 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
用python获取txt文件中关键字的数量
2020/12/24 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
2021/01/10 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
中学感恩教育活动总结
2015/05/05 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android