当前位置: 首页 > news >正文

【OpenCV】10 图像滤波

作用

将一幅图像通过滤波器转换为另一幅图像。
滤波器又称为卷积核,滤波过程称为卷积。

卷积核

卷积核一般为奇数,如 3x3 5x5 7x7

为什么取奇数?

  1. 增加padding
  2. 保证锚点在中间,防止图像偏移

大小的影响?

在深度学习中,卷积核越大,看到的信息(感受野)越多,提取的特征就越好,计算量就越大。

锚点

卷积核的中心

边界扩充

当卷积核 > 1 且不进行边界扩充,输出尺寸将相应缩小。
当卷积核以标准方式进行边界扩充,则输出数据的空间尺寸将与输入相等。
image

计算公式

输出图像大小N= ( 输入图像尺寸W - 卷积核大小F + 2 x 扩充尺寸P ) / 步长大小S + 1
步长大小默认为1

图像卷积

低通滤波和高通滤波

低通滤波:低于某个阀值的值可以通过。去除噪音和平滑图像。
高通滤波:高于某个阀值的值可以通过。查找图像边缘。

示例

image

import cv2
import numpy as npimg = cv2.imread('img/cat.jpg')kernel = np.ones((5, 5), np.float32) / 25dst = cv2.filter2D(img, -1, kernel)cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)

低通滤波

方盒滤波 boxFilter

image

当 normalize == true,a = 1 / (W x H) ,退化为均值滤波
当 normalize == false,a = 1

均值滤波 blur

image

import cv2
import numpy as npimg = cv2.imread('img/cat.jpg')dst = cv2.blur(img, (5, 5))cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)

高斯滤波 GaussianBlur

可以有效解决高斯噪点。
image

import cv2
import numpy as npimg = cv2.imread('img/cat.jpg')dst = cv2.GaussianBlur(img, ksize=(5, 5), sigmaX=100)cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)

中值滤波

可以有效解决胡椒噪点。
image

import cv2
import numpy as npimg = cv2.imread('img/cat.jpg')dst = cv2.medianBlur(img, 5)cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)

双边滤波

可以保留边缘,同时对边缘内的区域进行平滑处理。
主要作用是:美颜
image

image

import cv2
import numpy as npimg = cv2.imread('img/cat.jpg')dst = cv2.bilateralFilter(img, 7, 20, 50)cv2.imshow('dst', dst)
cv2.imshow('img', img)
cv2.waitKey(0)

高通滤波

Sobel算子

  • 先向x方向求导
  • 再向y方向求导
  • 最终结果:|G| = |Gx| + |Gy|
    kernelsize设为-1时退化为Scharr
    image
import cv2
import numpy as npimg = cv2.imread('img/chess.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, dst = cv2.threshold(gray, 210, 255, cv2.THRESH_BINARY)
img = cv2.convertScaleAbs(dst)  # 转换为绝对值并转为uint8dst_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
dst_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
dst = dst_x + dst_ycv2.imshow('dst_x', dst_x)
cv2.imshow('dst_y', dst_y)
cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)

Scharr算子

  • 与Sobel类似,只不过使用的kernel值不同
  • Scharr只能求x方向或y方向的边缘

Laplacian算子

  • 可以同时求2个方向的边缘
  • 对噪音敏感,一般需要先进行去噪
    image
import cv2
import numpy as npimg = cv2.imread('img/chess.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, dst = cv2.threshold(gray, 210, 255, cv2.THRESH_BINARY)
img = cv2.convertScaleAbs(dst)  # 转换为绝对值并转为uint8dst = cv2.Laplacian(img, cv2.CV_64F, ksize=5)cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)

边缘检测 Canny

1.高斯滤波降噪,使用5x5高斯滤波器。
2.在0度、45度、90度、135度四个方向上进行梯度计算。
3.取四个方向上的局部最大值,认为最大值对应的边缘最佳。
4.进行阈值计算,超过最大值的为边缘,低于最小值的非边缘,介于之间的根据连贯性判断。
image

import cv2
import numpy as npimg = cv2.imread('img/cat.jpg')dst = cv2.Canny(img, 100, 150)cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)
http://www.hskmm.com/?act=detail&tid=13347

相关文章:

  • 基于java+springboot的社区居民诊疗健康管理系统(源代码+文档+讲解视频) - 指南
  • 时序数据库IoTDB的六大实用场景盘点 - 指南
  • 50系GPU上安装MMCV
  • K8S的CoreDns配置文件添加域名解析
  • 20250308_信安一把梭_web
  • nodify_介绍及安装
  • MQTT协议(消息队列遥测传输)
  • 如何构建embeding 的就是pytorch 中
  • 萤石设备视频接入平台EasyCVR国标GB28181视频平台整合铁路抑尘喷洒智能视频监控方案
  • 【低代码平台之应用构建展示】数智化贸易订单管理平台
  • C# 第 17天 028 029接口,依赖反转,单元测试
  • 2025年项目管理软件革命:AI与空间计算如何重塑企业协作范式
  • Threading 串行VS并发
  • parallel index
  • C语言 第三讲:分支和循环(上) - 教程
  • 中间件专题:Redis
  • 微信个人号开发API/文档/教程
  • 微指令控制器基本原理
  • 一个拒绝过度设计的 .NET 快速开发框架:开箱即用,专注干活
  • 个人微信号二次开发API调用、微信API接口
  • 2025.9.21+7 [未完]
  • VisualStudio-Python-工具指南-全-
  • Gevent和Subprocess问题
  • Ansible自动化运维实战 - 详解
  • 建筑行业能源管理破局:MyEMS 打造商业楼宇 “能耗可视化 + 智能调控” 方案
  • 【数据结构】双向链表 - 指南
  • 告别“能源糊涂账”:MyEMS如何帮企业把能耗数据“算明白、用到位”
  • Windows 离线环境下使用 VS Code 连接容器 Python 环境完整指南(亲测可用)
  • Macos 安装kali报错
  • 完整教程:线程、进程、协程