第二章 OpenCV图像阈值综合操作详解——Python实现

目录

一.图像阈值

二.图像平滑

1.均值滤波

2.方框滤波

3.高斯滤波

4.中值滤波

5.双边滤波


此章节主要讲解:图像阈值、图像平滑处理、均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波。

这里先讲作者使用matplotlib模块出现错误的解决方法。

首先作者在这里写一下可能遇到的错误原因:使用matplotlib显示图像,在新版本里面出现如下错误,解决方法也如下:
方法一:
我们一般出现问题,可以先通过查看后端的代码来看看自己的后端
import matplotlib
print(matplotlib.get_backend())
#查看后端
此时,我们打印出来module://backend_interagg
这就证实了我们有不兼容的情况
此时,在代码中添加后端设置
在 import matplotlib.pyplot as plt 之前添加以下代码:
import matplotlib
matplotlib.use('TkAgg')  # 或者 'Qt5Agg'
#注意:Agg非交互

因此在最新版本中需要你import matplotlib
前使用matplotlib.use('TkAgg')    # 或者 'Qt5Agg'才能解决问题

方法二:
pip install matplotlib==3.9
降低matplotlib的版本,3.9版本可以不需要担心兼容问题

一.图像阈值

ret,dst=cv2.threshold(src,thresh,maxval, type)

  • src:输入图,只能输入单通道图像,通常来说为灰度图
  • dst:输出图
  • thresh:阈值
  • maxval:当像系值超过了值(或者小于值,根据type来决定),所赋予的值
  • type:二值化操作的类型,包含以下5种类型:
  • CV2.THRESH_BINARY; CV2.THRESH_BINARY_INV; CV2.THRESH_TRUNC;CV2.THRESH_ TOZERO.CV2.THRESH_TOZERO_INV

  • cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
  • CV2.THRESH_BINARY_INV THRESH_BINARY的反转
  • CV2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
  • cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
  • CV2.THRESH_TOZERO_INV THRESH_TOZERO的反转
  • 代码演示如下:

    图像呈现如下:

    总结:

    1. THRESH_BINARY的作用是将大于阈值的像素值设置为阈值,小于阈值的像素值设置为0
    2. THRESH_BINARY_INV的作用是将小于阈值的像素值设置为阈值,大于阈值的像素值设置为0
    3. THRESH_TRUNC的作用是将大于阈值的像素值设置为阈值,小于阈值的像素值不变
    4. THRESH_TOZERO的作用是将小于阈值的像素值设置为0,大于阈值的像素值不变
    5. THRESH_TOZERO_INV的作用是将大于阈值的像素值设置为0,小于阈值的像素值不变

    matplotlib.pyplot 使用的方法作用如下:

    xticks和yticks的作用是去掉子图的横纵坐标。

    subplot的参数是行数,列数,子图编号,它的作用是将图片分为6个子图,然后依次显示。

    二.图像平滑

    这一小节主要讲解几种处理白点噪音图像的滤波方法

    一共有四种滤波分别:blur均值滤波、gaussianBlur高斯滤波、medianBlur是中值滤波、bilateralFilter是双边滤波、boxFilter是方框滤波。

    cv2的均值滤波方法格式如下:

    cv2.blur(图像, 核的大小是滤波器的大小)

    cv2.GaussianBlu(图像, 核的大小,控制高斯核的权重)

    cv2.medianBlur(图像, 核的大小)

    cv2.bilateralFilter(图像, 核的大小, 颜色权重, 空间权重)

    cv2.boxFilter(图像,-1,积核, normalize=逻辑值)

    注:

    它们核的大小注意点都是相同的。核的大小是滤波器的大小,核的大小一般是奇数。

    高斯核的权重作用是计算根据像素值与周围像素值的距离的函数,核的大小是滤波器大小,核的大小是奇数,否则会报错。

    双边滤波各个权重的作用如下:

  • 颜色权重是计算根据像素值与周围像素值的颜色差值的函数。
  • 空间权重是计算根据像素值与周围像素值的距离的函数。
  • 1.均值滤波

    均值滤波是一个简单的平均卷积操作。

    卷积操作就是我们指定一个卷积核的大小,例如我们取[3,3]大小的卷积核。那么如图我们会取橙色部分区域。

    (121+75+78+24+204+113+154+104+235)÷9

    公式:选取区域大小之和÷选取卷积矩阵的大小

    均值滤波的代码演示如下:

    图像呈现如下:

    2.方框滤波

    方框滤波与均值滤波基本上是一样,唯一不同的是方框滤波第四个参数normalize=逻辑值。若第四参数不写默认是True。

    若逻辑值是True代表的是进行归一化操作,那么与均值滤波是一样的。

    公式是:选取区域大小之和÷选取卷积矩阵的大小

    若逻辑值是False代表不进行归一化操作,那么它的操作是对于选取的区域进行只有进行求和,不进行除法操作,容易发生越界操作。

    若逻辑值发生越界。

    若发生越界相加的数据>255则全部按255像素进行处理存放。

    代码演示如下:

    (1)第四个参数默认情况

    (2)第四个参数设置为True

    注:

    从此可以看出来第四个参数不写和默认情况显示是一致的,说明第四个参数默认是True,代表着进行归一化的操作显示。

    (3)第四个参数设置为False,不进行归一化

    注:

    从此可以看出它的越界操作是直接将超过的部分一律全部按255进行处理。

    图像像素点的数值越接近255代表颜色越深,离255越远代表颜色越浅。

    3.高斯滤波

    高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的

    高斯分布又称“正态分布”,根据正态分布进行特征观察。

    代码演示如下:

    图像呈现如下:

    4.中值滤波

    中值滤波相当于用中值代替。

    例如:

    将橙色区域的数字从小到大排序选出中间的值,排序后的数值分别是:24 75 78 104 113 121 154 204 235

    中值是:113

    那么中间的204替换为113

    代码演示如下:

    图像呈现如下:

    5.双边滤波

    bilateralFilter是双边滤波,它的作用是将图像的像素值替换为周围像素值的权重平均值。
    其中权重是根据像素值与周围像素值的距离和颜色差值的函数进行计算的。
    bilateralFilter的第一个参数是图像,第二个参数是核的大小,第三个参数是颜色权重,第四个参数是空间权重。
    颜色权重是计算根据像素值与周围像素值的颜色差值的函数,空间权重是计算根据像素值与周围像素值的距离的函数。

    代码演示如下:

    图像呈现如下:

    注:

    在这里稍微讲解一个小技巧利用numpy模块中的hstack函数将图像水平拼接。

    numpy模块中vstack函数是将图像垂直拼接。

    代码演示如下:

    图像呈现如下:

    作者:从晓不会计算机

    物联沃分享整理
    物联沃-IOTWORD物联网 » 第二章 OpenCV图像阈值综合操作详解——Python实现

    发表回复