第二章 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函数是将图像垂直拼接。

代码演示如下:

图像呈现如下:

相关推荐
dudly9 分钟前
Python全流程开发实战:基于IMAP协议安全下载个人Gmail邮箱内所有PDF附件
python·安全·小程序·pdf·个人开发
niuge No.13 小时前
mindyolo填坑
python
帮帮志3 小时前
Python-pandas-操作Excel文件(读取数据/写入数据)及Excel表格列名操作详细分享
python·excel·pandas
xll_0074 小时前
使用Python在excel里创建柱状图
python·excel
AI Echoes5 小时前
大模型(LLMs)加速篇
人工智能·python·算法·机器学习·面试
jndingxin8 小时前
OpenCV 图形API(66)图像结构分析和形状描述符------将一条直线拟合到三维点集上函数fitLine3D()
人工智能·opencv·计算机视觉
闲人编程8 小时前
猜数字游戏:从数学原理到交互体验的完整设计指南
python·游戏·交互·内存管理·猜数字·智能辅导·游戏二分查找
翀哥~9 小时前
计算机视觉(CV)技术的优势和挑战(本片为InsCode)
计算机视觉·cv
肖永威9 小时前
VSCode开发调试Python入门实践(Windows10)
ide·vscode·python
小白学大数据10 小时前
基于Python的携程国际机票价格抓取与分析
开发语言·爬虫·python