> 文档中心 > OpenCV图像处理应用(面向Python)之阈值与平滑处理

OpenCV图像处理应用(面向Python)之阈值与平滑处理

OpenCV图像应用处理(面向Python)

    • 欢迎来到梁老湿课堂
    • 1.阈值处理
    • 2.使用滑块调整阈值大小
    • 3.平滑处理
    • 多练多学多坚持,我们下期再见。

欢迎来到梁老湿课堂

版权声明:
作者:OpenCV小课堂
导师:Fu Xianjun
本文版权归作者导师共有,欢迎转载,但未经作者同意必须在文章页面注明来源及原作者或原文链接,否则保留追究法律责任的权利。

1.阈值处理

定义:
指剔除图像内像素值高于一定值或者低于一定值的像素点
OpenCV提供了cv2.threshold()和cv2.adaptiveThreshold用于实现阈值处理
1.ret, dst = cv2.threshold(src, thresh, maxval, type)
ret:代表返回的阈值。
src:原图,可以是多通道的,8位或32位浮点型数值。
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的反转

import cv2peppa = cv2.imread('peppa.jpg')img=cv2.cvtColor(peppa,cv2.COLOR_BGR2GRAY)cv2.imshow('Peppa',img)ret,thresh1 = cv2.threshold(img,200,255,cv2.THRESH_BINARY)ret,thresh2 = cv2.threshold(img,200,255,cv2.THRESH_BINARY_INV)ret,thresh3 = cv2.threshold(img,200,255,cv2.THRESH_TRUNC)ret,thresh4 = cv2.threshold(img,200,255,cv2.THRESH_TOZERO)ret,thresh5 = cv2.threshold(img,200,255,cv2.THRESH_TOZERO_INV)cv2.imshow('BINARY',thresh1)cv2.imshow('BINARY_INV',thresh2)cv2.imshow('TRUNC',thresh3)cv2.imshow('TOZERO',thresh4)cv2.imshow('TOZERO_INV',thresh5)peppa_body=cv2.bitwise_and(peppa,peppa,mask=thresh2)cv2.imshow('peppa_body',peppa_body)cv2.waitKey()cv2.destroyAllWindows()

在这里插入图片描述

2.自适应阈值处理
定义:
使用变化的阈值完成对图像的阈值处理。
操作:
通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。
目的:
保留更多的细节信息。
2.1 det=cv2.adaptiveThreshold(src,maxValue,adapptiveMethod,thesholdType,blockSize,c)
dst:代表自适应阈值处理结果。
src:代表要进行处理的原始图像。注意:图像必须是8位单通道的图像。
maxValue:代表最大值。
adaptiveMethod:代表自适应方法。
thresholdType:代表阈值处理方式,该值必须是 cv2.THRESH_BINARY 或者cv2.THRESH_BINARY_INV中的一个。
blockSize:代表块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为3、5、7等。
C是常量。
cv2.threshold()和cv2.adaptiveThreshold两者之间的差别之效果图
在这里插入图片描述

3.Otsu大津处理
定义:
根据当前图像给出最佳的类间分割阈值。
操作:
遍历所有可能阈值,从而找到最佳的阈值。
3.1
t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

和普通阈值分割的不同之处在于以下三点:
1.
参数type增加了一个参数值"cv2.THRESH_OTSU"。
2.
设定的阈值为0。
3.
返回值t是Otsu方法计算得到并使用的最优阈值
注意点:
如果采用普通的阈值分割,返回的阈值就是设定的阈值。例如下面语句设定阈值为127,所以最终返回的就是t=127。
t,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)

2.使用滑块调整阈值大小

在这里插入图片描述

import cv2Type = 0  # 阈值处理类型值Value = 0  # 使用的阈值def onType(a):    Type = cv2.getTrackbarPos(tType, windowName)    Value = cv2.getTrackbarPos(tValue, windowName)    ret, dst = cv2.threshold(img, Value, 255, Type)    cv2.imshow(windowName, dst)def onValue(a):    Type = cv2.getTrackbarPos(tType, windowName)    Value = cv2.getTrackbarPos(tValue, windowName)    ret, dst = cv2.threshold(img, Value, 255, Type)    cv2.imshow(windowName, dst)img = cv2.imread("peppa.jpg", 0)windowName = "Peppa"  # 窗体名cv2.namedWindow(windowName)cv2.imshow(windowName, img)# 创建两个滑动条tType = "Type"  # 用来选取阈值处理类型的滚动条tValue = "Value"  # 用来选取阈值的滚动条cv2.createTrackbar(tType, windowName, 0, 4, onType)cv2.createTrackbar(tValue, windowName, 0, 255, onValue)cv2.waitKey(0)cv2.destroyAllWindows()

openCV使用滑块调整大小

3.平滑处理

基本原理:
将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。
目的:
去除图像内部噪声
3.1 均值滤波
在这里插入图片描述
3.2 方框滤波
在这里插入图片描述
3.3高斯滤波
在这里插入图片描述
3.4中值滤波
在这里插入图片描述
3.5双边滤波
在这里插入图片描述
3.6 2D卷积
在这里插入图片描述

import cv2import numpy as npimg = cv2.imread("peppa_gaussian.jpg")blur = cv2.blur(img, (7, 7))box = cv2.boxFilter(img,-1,(7,7), normalize=True)  gaussian = cv2.GaussianBlur(img, (7, 7), 10) median = cv2.medianBlur(img, 7)bilater=cv2.bilateralFilter(img,9,75,75)kernel = np.array(( [-2, -1, 0], [-1,1,1], [0, 1, 2]), dtype="float32")filter2D=cv2.filter2D(img,-1,kernel)#https://my.oschina.net/u/4306156/blog/3598055cv2.imshow('img',img)cv2.imshow('blur',blur)cv2.imshow('box',box)cv2.imshow('gaussian',gaussian)cv2.imshow('median',median)cv2.imshow('bilater',bilater)cv2.imshow('filter2D',filter2D)cv2.waitKey()cv2.destroyAllWindows()

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

多练多学多坚持,我们下期再见。

组词