OpenCV-阈值与平滑处理

本文介绍了OpenCV中的阈值处理,包括基本阈值、自适应阈值和Otsu阈值运算,详细讲解了各种阈值处理的方法。此外,还探讨了平滑处理,如卷积、均值滤波、高斯滤波、中值滤波和双边滤波在图像去噪和保护边缘细节方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阈值处理

定义:指剔除图像内像素值高于一定值或者低于一定值的像素点
例如,设定阈值为127,然后将图像内所有像素值大于127的像素点的值设为255。将图像内所有像素值小于或等于127的像素点的值设为0。

cv2.threshold()
retval,dst=cv2.threshold(src,thresh,maxval,type)

在这里插入图片描述retval,dst=cv2.threshold(src,thresh,maxval,type)
在这里插入图片描述

retval,dst=cv2.threshold(src,thresh,maxval,type)

在这里插入图片描述

import cv2
import numpy as np
#from matplotlib import pyplot as plt
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()
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()
cv2.destroyAllWindows()

自适应阈值处理

定义:使用变化的阈值完成对图像的阈值处理。
操作:通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。
目的:保留了更多的细节信息

cv2.adaptiveThreshold()
dst=cv.adaptiveThreshold
(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)
maxValue代表最大值。
adaptiveMethod代表自适应方法。
thresholdType 代表阈值处理方式,该值必须是 cv2.THRESH_BINARY 或者cv2.THRESH_BINARY_INV中的一个。
blockSize代表块大小。表示一个像素在计算其阈值时所使用的邻
域尺寸,通常为357等。C是常量

cv2.adaptiveThreshold()

img=cv2.imread('peppa.jpg',0)
athdMEAN=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,7,5)
athdGAUS=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)
cv2.imshow("athMEAN",athdMEAN)
cv2.imshow("athGAUS",athdGAUS)
cv2.waitKey(0)
cv2.destroyAllWindows()

Otsu阈值运算

img=cv2.imread('peppa.jpg',0)
ret,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow("otsu",otsu)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.threshold()
Otsu大津
t,otsu=cv2.threshold
(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU

定义:根据当前图像给出最佳的类间分割阈值。
操作:遍历所有可能阈值,从而找到最佳的阈值。

函数实操与彩色图像

cv2. Threshold()
cv2.adaptiveThreshold()
cv2. Threshold(Otsu)

用滚动条控制阈值处理参数
用于将滑动条的数值处理并响应
在这里插入图片描述

createTrackbar(“name”,”winname”,default,”max”,callback)
Data = getTrackbarPos(”name”,”winname” )
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()
cv2.destroyAllWindows()

平滑处理

卷积:将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。
在这里插入图片描述

均值滤波:是指用当前像素点周围N*N个像素值的均值来代替当前像素值。

dst=cv2.blur(src,ksize,anchor,borderType)

ksize:滤波核的大小。滤波核大小是指在均值处理过程中,其邻域图像的高度和宽度。
anchor:锚点,其默认值是(-1,-1),表示当前计算均值的点位于核的中心点位置。
borderType:边界样式,该值决定了以何种方式处理边界。
通常情况下,使用均值滤波函数时,对于锚点anchor和边界样式borderType,直接采用其默认值即可。因此,函数cv2.blur()的一般形式为:dst=cv2.blur(src,ksize,)。缺点在于它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

方框滤波:自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和。

cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)

ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。
normalize 表示在滤波时是否进行归一化(这里指将计算结果规范化为当前像素值范围内的值)处理,该参数是一个逻辑值,可能为真(值为1)或假(值为0)。
通常情况下,函数cv2.boxFilter()的一般形式为:dst=cv2.boxFilter(src,ddepth,ksize)

高斯滤波:将中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。

dst=cv2.GaussianBlur(src,ksize,sigmaX,sigmaY,borderType)

sigmaX 是卷积核在水平方向上(X 轴方向)的标准差,其控制的是权重比例。
sigmaY是卷积核在垂直方向上(Y轴方向)的标准差。
在实际处理中,可以显式指定sigmaX和sigmaY为默认值0。因此,函数cv2.GaussianBlur()的常用形式为dst=cv2.GaussianBlur(src,ksize,0,0),高斯滤波的作用是消除高斯噪声(抑制服从正态分布的噪声)

中值滤波:用邻域内所有像素值的中间值来替代当前像素点的像素值。dst=cv2.medianBlur(src,ksize)
该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像边缘细节

双边滤波:是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效地保护图像内的边缘信息。

cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)

d:在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace 计算得到。
sigmaColor:滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。
sigmaSpace:坐标空间中的sigma值。
在函数cv2.bilateralFilter()中,参数borderType是可选参数,其余参数全部为必选参数。

cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace)

2D卷积:使用特定的卷积核实现卷积操作。

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

delta :修正值,它是可选项。如果该值存在,会在基础滤波的结果上加上该值作为最终的滤波处理结果。
在通常情况下,使用滤波函数cv2.filter2D()时,对于参数锚点anchor、修正值delta、边界样式borderType,直接采用其默认值即可。因此,函数cv2.filter2D()的常用形式为:dst=cv2.filter2D(src,ddepth,kernel)

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()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值