OpenCV图像处理应用(面向Python)之阈值与平滑处理
Posted OpenCV小课堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV图像处理应用(面向Python)之阈值与平滑处理相关的知识,希望对你有一定的参考价值。
OpenCV图像应用处理(面向Python)
欢迎来到梁老湿课堂
版权声明:
作者: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 cv2
peppa = 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 cv2
Type = 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 cv2
import numpy as np
img = 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/3598055
cv2.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()
效果如下:
多练多学多坚持,我们下期再见。
以上是关于OpenCV图像处理应用(面向Python)之阈值与平滑处理的主要内容,如果未能解决你的问题,请参考以下文章