OpenCV —— 阈值与平滑处理

图像阈值

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 :是 cv2.THRESH_BINARY 的反转
  • cv2.THRESH_TRUNC :大于阈值部分设为阈值,否则不变
  • cv2.THRESH_TOZERO :大于阈值部分不改变,否则设为 0
  • cv2.THRESH_TOZERO_INV :是 cv2.THRESH_TOZERO 的反转

举例

先看输出结果图
在这里插入图片描述
OK ,然后写代码

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("./1.jpg")

ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)

titles = ['Original','Image','Binary','Binary_INV','Trunc','ToZero','ToZero_INV']
images = [img,thresh1,thresh2,thresh3,thresh4,thresh5]

# 遍历
for i in range(len(images)):
    plt.subplot(2, 3, i + 1)
    plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([])
    plt.yticks([])
# 图像显示
plt.show()

平滑处理

均值滤波

先看下效果图,好像跟原图没什么区别
在这里插入图片描述
然而代码只是做了简单的均值滤波操作,代码如下:

import cv2

img = cv2.imread('./1.jpg')

# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img,(3,3))
cv2.imshow('blur',blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

方原滤波

先看效果图
在这里插入图片描述
代码如下:

import cv2

img = cv2.imread('./1.jpg')

# 方原滤波
# 基本和均值一样
box = cv2.boxFilter(img,-1,(3,3),normalize=True)

cv2.imshow('box',box)
cv2.waitKey(0)
cv2.destroyAllWindows()

高斯滤波

先看下效果图,从图中明显可以发现,左边的图比右边的要模糊那么一点点,这是使用高斯滤波来实现的
在这里插入图片描述
代码如下:

import cv2

img = cv2.imread('./2.jpg')

# 高斯模糊
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
gaussian = cv2.GaussianBlur(img, (5, 5), 1)
cv2.imshow('gaussian', gaussian)
cv2.waitKey(0)
cv2.destroyAllWindows()

中值滤波

效果图
在这里插入图片描述
代码如下:

import cv2

img = cv2.imread('./2.jpg')

# 中值滤波
# 相当于用中值代替
median = cv2.medianBlur(img, 5)
cv2.imshow("median", median)
cv2.waitKey(0)
cv2.destroyAllWindows()

什么是卷积?

    在泛函分析中,卷积、旋积或摺积(英语:Convolution)是通过两个函数 f 和 g 生成第三个函数的一种数学算子,表征函数 f 与 g 经过翻转和平移的重叠部分函数值乘积对重叠长度的积分

如果将参加卷积的一个函数看作区间的指示函数,卷积还可以被看作是 “滑动平均” 的推广

在这里插入图片描述
假设 C1,1 是两个矩阵相乘后得到的新的数值,那么也就是 f 和 g 的元素下标相加都为 1,1,即:
C1,2 = a0,0b1,1 + a0,1b1,0 + a0,2b2,0 …

关于卷积神经的更多介绍请看这篇文章 如何通俗易懂地解释卷积? 这篇文章写得很好,用丰富图片文字公式的形式简单易懂地讲解了什么是卷积

展示全部平滑处理

效果图
在这里插入图片描述

代码如下:

import cv2
import numpy as np

img = cv2.imread('./2.jpg')

# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img, (3, 3))

# 高斯模糊
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
gaussian = cv2.GaussianBlur(img, (5, 5), 1)

# 中值滤波
# 相当于用中值代替
median = cv2.medianBlur(img, 5)

# 将三幅图横向连在一起
res = np.hstack((blur, gaussian, median))

# 显示图像
cv2.imshow("median vs average", res)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值