openCV专栏(四):阀值处理+噪音滤波

OPENCV基础操作

提示:本专栏所用版本仅供参考,其他版本也可

版本
pythonPython 3.9.3
opencv4.5.5
matplotlib3.4.3
numpy1.19.5

(一)阀值处理

1:相关函数

相关函数内容
函数原型参数
单一阀值处理
cv2.threshold
(src,thresh,maxval,type)
src:输入图像
thresh:阀值
maxVal:
THRESH_BINARY/_INV
需要设定的最大值
type: 分割类型
自适应阀值处理
adaptiveThreshold
(src,maxValue,adaptMethod,Type,blockSize,C)
src:输入图像
maxValue:最大值
adaptMethod:自适应方法
Type:处理方式
blockSize:块大小:
表一个像素在计算阀值时所使用的的领域尺寸
(如3,5,7)
C:常量
返回值:rst,dst阀值和分割图像

2:相关方法

在这里插入图片描述

代码:

import matplotlib.pyplot as plt #导入模块
import cv2
import numpy as np

filename = '111.jpg'#保存图片路径
img = cv2.imread(filename,0)#以灰度的形式读取图片111
C = np.zeros((img.shape[0],img.shape[1],3,6),np.uint8)


ret,C[:,:,0,0] = cv2.threshold(img,127,255,cv2.THRESH_BINARY)#二值化阀值处理
ret,C[:,:,0,1] = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)#反二值阀值化处理
ret,C[:,:,0,2] = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)#超阀值化处理
ret,C[:,:,0,3] = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)#超阀值化处理
ret,C[:,:,0,4] = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)#低阀值化处理
ret,C[:,:,0,5] = cv2.threshold(img,0,255,cv2.THRESH_TOZERO+cv2.THRESH_OTSU)#Otsu方法:低阀值化处理
for i in range(6): 
    plt.subplot(2,3,i+1)#将画布分为两行四列,当前图像显示到第i+1个区块
    plt.imshow(C[:,:,0,i],cmap='gray')#把图像加载到plt画布中
    plt.title(i)#设置当前图像标题
plt.show()

运行结果:(预览模式下不可见面)

在这里插入图片描述

3:扩展

扩展
上述程序所用:Otus方法
>>>>>作用:根据图像给出最佳的分割阀值(遍历所有可能阀值)

(二)图像平滑处理

    内容:在尽量保持图像信息的情况下,过滤掉图像内部的噪声
   原理:处理图像中与周围像素值差值较大的的像素点,将其调整为与周围像素点像素值近似的点
   学习任务:
   1:认识几种常见的滤波方式:
   2:了解滤波的原理
   3:了解卷积算法

1:{均值、方框、双边、中值、高斯 }滤波

程序合集:

import cv2 
import numpy as np
import matplotlib.pyplot as plt

#1:获取灰度图像
filename = 'aa.png'#保存图片路径
img = cv2.imread(filename)#以灰度的形式读取图片111
C = np.zeros((img.shape[0],img.shape[1],3,6),np.uint8)

C[:,:,:,0] = img

#均值滤波:参数(原始图像,卷积核)
C[:,:,:,1] = cv2.blur(img,(5,5))

#方框滤波:参数(原始图像,图像深度,卷积核,是否归一化处理)
C[:,:,:,2] = cv2.boxFilter(img,-1,(5,5),normalize=1)

#高斯滤波:参数(原始图像,滤波核,卷积核在X方向的标准差,卷积核在Y方向的标准差)
C[:,:,:,3] = cv2.GaussianBlur(img,(5,5),0,0)

#中值滤波:参数(原始图像,滤波核(必须是大于1的奇数))
C[:,:,:,4] = cv2.medianBlur(img,3)

#双边滤波:参数(原始图像,滤波选取的空间距离参数
#           滤波时选取的颜色差值范围:决定了哪些范围的颜色可参与
#           坐标空间中的sigma值,值越大说明有越多点参与滤波进来)
C[:,:,:,5] = cv2.bilateralFilter(img,25,100,100)

T = ("img","blur","boxFilter","GaussianBlur","medianBlur","bilateralFilter")
for i in range(6): 
    plt.subplot(2,3,i+1)#将画布分为两行四列,当前图像显示到第i+1个区块
    plt.imshow(C[:,:,:,i],cmap='gray')#把图像加载到plt画布中
    plt.title(T[i])#设置当前图像标题
plt.show()

运行结果:
在这里插入图片描述

2:2D卷积

   内容: 用特定的卷积核实现卷积操作的一种自定义卷积

函数:
dst = cv2.filter2D(src,ddepth,kernel,anchor,delta,borderType)

参数组成:
原始图像,图像深度,单一通道的卷积核

anchor:锚点:默认-1
delta:修正值:加上该值作为最终值
borderType:边界样式(决定了以何种情况处理边界)

运行程序:

import cv2 
import numpy as np
import matplotlib.pyplot as plt

# 1:读取图片
filename = '111.jpg'#保存图片路径
img = cv2.imread(filename)#以灰度的形式读取图片111
C = np.zeros((img.shape[0],img.shape[1],3,2),np.uint8)
C[:,:,:,0] = img

# 2:自定义一个卷积核
D = np.ones((9,9),np.float32)/54

# 3:卷积操作
C[:,:,:,1] = cv2.filter2D(img,-1,D)

T = ("img","filter2D")
for i in range(2): 
    plt.subplot(1,2,i+1)#将画布分为两行四列,当前图像显示到第i+1个区块
    plt.imshow(C[:,:,:,i],cmap='gray')#把图像加载到plt画布中
    plt.title(T[i])#设置当前图像标题
plt.show()

运行结果:
在这里插入图片描述

(五)结束语

   以上就是今天所要分享的内容了
   学习路漫漫,我们仍需负重前行……
   为此博主新创建了一个群,期待你们的加入:

在这里插入图片描述

欢迎加入我们的大家庭:928357277

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亿只萌新

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值