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中装饰器的一个妙用
Feb 08 Python
在Docker上开始部署Python应用的教程
Apr 17 Python
python实现简单购物商城
May 21 Python
tensorflow实现KNN识别MNIST
Mar 12 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
python 调用钉钉机器人的方法
Feb 20 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
基于Python函数和变量名解析
Jul 19 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
Feb 28 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
Apr 08 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
各种咖啡的英文名子是什么
2021/03/03 新手入门
聊天室php&mysql(五)
2006/10/09 PHP
php mysql索引问题
2008/06/07 PHP
PHP多例模式介绍
2013/06/24 PHP
总结对比php中的多种序列化
2016/08/28 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
Javascript学习笔记之相等符号与严格相等符号
2014/11/23 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
vue $set 给数据赋值的实例
2019/11/09 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
Python反转序列的方法实例分析
2018/03/21 Python
python添加菜单图文讲解
2019/06/04 Python
python pycharm的安装及其使用
2019/10/11 Python
Python输出指定字符串的方法
2020/02/06 Python
C++和python实现阿姆斯特朗数字查找实例代码
2020/12/07 Python
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
办公室内勤岗位职责范本
2013/12/09 职场文书
合作意向书格式及范文
2014/03/31 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
倡议书怎么写?
2019/04/11 职场文书
python中subplot大小的设置步骤
2021/06/28 Python