OpenCV实现图像平滑处理的方法汇总

目录
  • 1 均值滤波
  • 2 方框滤波
  • 3 高斯滤波
  • 4 中值滤波
  • 5 双边滤波
  • 6 2D卷积(自定义卷积核实现卷积)

本文是OpenCV图像视觉入门之路的第10篇文章,本文详细的在图像上面进行了图像均值滤波、方框滤波 、高斯滤波、中值滤波、双边滤波、2D卷积等操作。

1 均值滤波

OpenCV 中的简单滤波(例如均值滤波或中值滤波)可能会使图像变得模糊,因为它们会平滑图像中的细节和边缘。如果滤波的程度过强,则可能会导致图像失真,使其看起来更差。因此,滤波的程度需要适当地控制,以获得最佳效果。

import cv2

import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)

    # 均值滤波
    # 简单的平均卷积操作
    img_blur1 = cv2.blur(img1, (3, 3))  # 使用3*3的卷积核
    img_blur2 = cv2.blur(img1, (30, 30))  # 使用30*30的卷积核

    cv2.imshow("blur1", img_blur1)  # 显示叠加图像 dst
    cv2.imshow("blur2", img_blur2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

2 方框滤波

方框滤波是一种图像平滑技术,在 OpenCV 中可以使用。方框滤波的主要作用是对图像进行去噪和平滑处理,使图像变得更加平滑,减少图像的锯齿状、噪声等不规则的部分。在图像处理中,方框滤波通常作为预处理步骤,以提高图像的质量和处理效果。

import cv2

import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)

    # 方框滤波
    # 基本和均值一样,可以选择归一化
    img_box1 = cv2.boxFilter(img1, -1, (3, 3), normalize=True)
    img_box2 = cv2.boxFilter(img1, -1, (2, 2), normalize=False)

    cv2.imshow("box1", img_box1)  # 显示叠加图像 dst
    cv2.imshow("box2", img_box2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

3 高斯滤波

高斯滤波是图像处理中一种常用的平滑处理方法。在使用OpenCV处理图像时,高斯滤波可以用于减少图像中的噪声和模糊不清的细节。此外,它还可以用于图像的边缘检测和图像分割,因为高斯滤波能够保留图像的主要特征,同时去除小的干扰。

import cv2

import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)

    # 高斯滤波
    # 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
    img_aussian1 = cv2.GaussianBlur(img1, (5, 5), 0, 0)
    img_aussian2 = cv2.GaussianBlur(img1, (5, 5), 13, 13)

    cv2.imshow("aussian1", img_aussian1)  # 显示叠加图像 dst
    cv2.imshow("aussian2", img_aussian2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

4 中值滤波

OpenCV 中值滤波是一种图像去噪方法,它通过在图像上选择一个掩码,并将其中的每个像素与周围像素值进行比较,以计算该像素的新值。新值是该像素周围像素值的中位数。这样,中值滤波能够有效去除图像中的噪声和椒盐噪声,使图像更清晰、更加稳定。

import cv2

import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)

    # 中值滤波
    # 相当于用中值代替
    img_median1 = cv2.medianBlur(img1, 3)  # 中值滤波
    img_median2 = cv2.medianBlur(img1, 9)  # 中值滤波

    cv2.imshow("median1", img_median1)  # 显示叠加图像 dst
    cv2.imshow("median2", img_median2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

5 双边滤波

双边滤波是一种图像模糊技术,它在保持图像边缘清晰的同时,对图像中的噪声进行有效去除。双边滤波算法通过比较图像上相邻像素的颜色差异和空间差异来确定每个像素的权重,从而决定每个像素的最终颜色值。在OpenCV中,双边滤波算法可用于处理图像的模糊、去噪、抗抖动等问题。

均值滤波、方框滤波、高斯滤波、中值滤波都是只单纯的考虑了像素点之间的空间信息而进行滤波的方式,这些方式都或多或少都会模糊图像的边缘信息,就是把图像里面的边缘线条弄模糊了,就是在去除图像噪音的同时把图像也弄模糊了,造成图像边界信息的部分丢失,这是这些方法的一个共同的缺点。
双边滤波就可以很好的规避这个缺点。因为双边滤波不仅考虑了像素的空间信息(距离越远权重越小)同时还考虑了像素的色彩信息(色彩差别越大,权重越小),这样就可以很好的去除噪声还可以较好的保护边缘信息,所以双边滤波器也是一个保边去噪的滤波器。

import cv2

import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)

    img_bilateralFilter1 = cv2.bilateralFilter(img1, 15, 150, 1000)
    img_bilateralFilter2 = cv2.bilateralFilter(img1, 3, 255, 1000)

    cv2.imshow("bilateralFilter2", img_bilateralFilter2)  # 显示叠加图像 dst
    cv2.imshow("bilateralFilter1", img_bilateralFilter1)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

6 2D卷积(自定义卷积核实现卷积)

OpenCV 中的 2D 卷积的作用是图像滤波,它可以用来消除图像中的噪声、提取图像的特征、边缘检测等。它通过对图像中的每一个像素与一个固定的卷积核进行卷积操作来实现这些目的。

如果上面的均值滤波卷积核、方框滤波卷积核、高斯滤波卷积核、中值滤波卷积核、双边滤波卷积核都不能满足我们对图像的处理要求,此时我们就需要一个更加灵活的核——即我们自定义一个我们想要的核。如何实现呢?opencv中的cv2.filter2D()函数可以帮助我们实现:

cv2.filter2D(img, ddepth, kernel, anchor, delta, borderType)

  • img:要处理的原图
  • ddepth: 默认-1,表示与原图图像相同的深度
  • kernel: 卷积核,是一个单通道的数组。如果想处理彩图时,让每个通道使用不同的核,就必须先将彩图分解后再使用不同的核去卷积操作。
  • anchor: 默认值是(-1,-1),默认计算的结果位于核的中心位置。
  • delta:这个参数可写可不写。如果写,表示在卷积操作时,对应位置相乘相加后再加一个偏置,这个偏置就是delta。
  • borderType: 边界处理方式,一般用默认值即可。
import cv2

import numpy as np
from numpy import unicode

if __name__ == '__main__':
    img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg")  # 读取彩色图像(BGR)

    kernel = np.ones((9, 9), np.float32) / 81  # 在实际中我们可以定义更复杂的卷积核,以实现自定义滤波操作
    img_kernel1 = cv2.filter2D(img1, -1, kernel)  # 这个滤波器就相当于均值滤波

    kernel = np.ones((18, 18), np.float32) / 81  # 在实际中我们可以定义更复杂的卷积核,以实现自定义滤波操作
    img_kernel2 = cv2.filter2D(img1, -1, kernel)  # 这个滤波器就相当于均值滤波

    cv2.imshow("kernel1", img_kernel1)  # 显示叠加图像 dst
    cv2.imshow("kernel2", img_kernel2)  # 显示叠加图像 dst
    cv2.imshow("image", img1)  # 显示叠加图像 dst

    cv2.waitKey(0)
    cv2.destroyAllWindows()

以上就是OpenCV实现图像平滑处理的方法汇总的详细内容,更多关于OpenCV图像平滑处理的资料请关注我们其它相关文章!

(0)

相关推荐

  • OpenCV-Python实现图像平滑处理操作

    什么是图像平滑处理 在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程我们称之为图像的平滑处理,所得到的图像称为平滑图像. 那么什么是图像的噪声呢? 图像的噪声就是图像中与周围像素点差异较大的像素点.噪声的处理就是将其更改为临近像素点的近似值,使图像更平滑. 图像平滑处理的噪声取值的方式有以下6种: (1)均值滤波 (2)方框滤波 (3)高斯滤波 (4)中值滤波 (5)双边滤波 (6)2D卷积(自定义滤波) 均值滤波 均值滤波是指用当前像素点周围N*N个像素点的均值来代替当前像素值.

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

    主要讲解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)

  • C++ opencv图像平滑滤波器使用示例

    目录 前言 一.均值滤波 1.均值滤波函数 2.均值滤波代码 二.高斯滤波 1.高斯滤波函数 2.高斯滤波代码 三.中值滤波 1.中值滤波函数 2.中值滤波代码 四.双边滤波 1.双边滤波函数 2.双边滤波代码 总结 前言 图像平滑是一种实用的数字图像处理技术,一个较好的平滑处理方法既能消除图像噪声,又不使图像边缘轮廓和线条变模糊. 一.均值滤波 归一化方框滤波器是很简单的滤波器,输出像素值是核窗口内像素值的均值,如果使用归一化处理,方框滤波就是均值滤波,实际上均值滤波是方框滤波归一化后的特殊情

  • OpenCV实现图像平滑处理的方法汇总

    目录 1 均值滤波 2 方框滤波 3 高斯滤波 4 中值滤波 5 双边滤波 6 2D卷积(自定义卷积核实现卷积) 本文是OpenCV图像视觉入门之路的第10篇文章,本文详细的在图像上面进行了图像均值滤波.方框滤波 .高斯滤波.中值滤波.双边滤波.2D卷积等操作. 1 均值滤波 OpenCV 中的简单滤波(例如均值滤波或中值滤波)可能会使图像变得模糊,因为它们会平滑图像中的细节和边缘.如果滤波的程度过强,则可能会导致图像失真,使其看起来更差.因此,滤波的程度需要适当地控制,以获得最佳效果. imp

  • python+opencv图像分割实现分割不规则ROI区域方法汇总

    在图像分割领域,一个重要任务便是分割出感兴趣(ROI)区域.如果是简易的矩形ROI区域其实是非常容易分割的,opencv的官方python教程里也有教到最简易的矩形ROI分割(剪裁),其本质是多维数组(矩阵)的切片.但是现实情况中,ROI是不规则的多边形,也可能是曲线边界,那么该如何分割出来呢?下面总结几种思路. 可能只提供核心部分的代码示例,具体应用要结合你自己的项目来修正. 一.已知边界坐标,直接画出多边形 例:最基础的画个四边形 # 定义四个顶点坐标 pts = np.array([[10

  • OpenCV实现特征检测和特征匹配方法汇总

    目录 1.SURF 2.SIFT 3.ORB 4.FAST 5.Harris角点 一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点.计算机视觉领域中的很重要的图像特征匹配就是一特征点为基础而进行的,所以,如何定义和找出一幅图像中的特征点就非常重要.这篇文章我总结了视觉领域最常用的几种特征点以及特征匹配的方法. 在计算机视觉领域,兴趣点(也称关键点或特征点)的概念已经得到了广泛的应用, 包括目标识别. 图像配准. 视觉跟踪. 三维重建等. 这个概念的原理是, 从图

  • Thinkphp批量更新数据的方法汇总

    以下小编给大家列出了三种实现thinkphp批量更新数据的方法,写的不好还请见谅,有意见欢迎提出,共同学习进步! 方法一: //批量修改 data二维数组 field关键字段 参考ci 批量修改函数 传参方式 function batch_update($table_name='',$data=array(),$field=''){ if(!$table_name||!$data||!$field){ return false; }else{ $sql='UPDATE '.$table_name

  • javascript中一些util方法汇总

    javascript中一些util方法汇总 /***************原生对象工类方法****************/ /** * 判断非空 * @param obj * @returns {boolean} */ function isEmpty(obj) { if (obj == undefined || obj == null || new String(obj).trim() == '') { return true; } else { return false; } } /**

  • jquery常用函数与方法汇总

    1.delay(duration,[queueName]) 设置一个延时来推迟执行队列中之后的项目. jQuery 1.4新增.用于将队列中的函数延时执行.他既可以推迟动画队列的执行,也可以用于自定义队列. duration:延时时间,单位:毫秒 queueName:队列名词,默认是Fx,动画队列. 例: 头部与底部延迟加载动画效果 $(document).ready(function() { $('#header') .css({ 'top':-50 }) .delay(1000).anima

  • JavaScript过滤字符串中的中文与空格方法汇总

    js 如何过滤字符串里中文或空格呢?方法有很多种,我们可以使用替换与正则表达式来实现,本文向大家介绍两个简单的例子,感兴趣的朋友可以参考一下. 1.javascript过滤空格: function moveSpace() { var str = " abc defg"; alert(str.replace(/[ ]/g, "")); } moveSpace(); 2.javascript过滤中文: var title ="字符串zifuchuan"

  • Java中常用修饰符的使用方法汇总

    修饰符汇总: 一:public protected default private 修饰类,修饰方法,修饰属性,修饰代码块. 类: 顶级类只能用public 修饰,顶级类不能使用private 和protected 修饰. 外部类可以被public修饰或者默认不写,不能用private和protected. 内部类可为静态,可用protected和private修饰. 方法: 通常方法可以被四个访问修饰符修饰,构造方法也可以被四个访问修饰符修饰. 抽象类中的抽象方法不能被private修饰,可以

  • Java实现时间动态显示方法汇总

    本文所述实例可以实现Java在界面上动态的显示时间.具体实现方法汇总如下: 1.方法一 用TimerTask: 利用java.util.Timer和java.util.TimerTask来做动态更新,毕竟每次更新可以看作是计时1秒发生一次. 代码如下: import java.awt.Dimension; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java

随机推荐