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 的反转

举例

先看输出结果图
OpenCV —— 阈值与平滑处理_第1张图片
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()

平滑处理

均值滤波

先看下效果图,好像跟原图没什么区别
OpenCV —— 阈值与平滑处理_第2张图片
然而代码只是做了简单的均值滤波操作,代码如下:

import cv2

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

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

方原滤波

先看效果图
OpenCV —— 阈值与平滑处理_第3张图片
代码如下:

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()

高斯滤波

先看下效果图,从图中明显可以发现,左边的图比右边的要模糊那么一点点,这是使用高斯滤波来实现的
OpenCV —— 阈值与平滑处理_第4张图片
代码如下:

import cv2

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

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

中值滤波

效果图
OpenCV —— 阈值与平滑处理_第5张图片
代码如下:

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 经过翻转和平移的重叠部分函数值乘积对重叠长度的积分

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

OpenCV —— 阈值与平滑处理_第6张图片
假设 C1,1 是两个矩阵相乘后得到的新的数值,那么也就是 f 和 g 的元素下标相加都为 1,1,即:
C1,2 = a0,0b1,1 + a0,1b1,0 + a0,2b2,0 …

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

展示全部平滑处理

效果图
OpenCV —— 阈值与平滑处理_第7张图片

代码如下:

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()

你可能感兴趣的:(#,计算机视觉)