1.前置知识
(1).什么是形态学处理
形态学图像处理(简称形态学)是指一系列处理图像形状特征的图像处理技术,其基本思想是利用一些特殊的结构元来测量或提取图像中相应的形状和特征,以便进一步进行图像分析和处理。 (1)基于图形形态进行处理的一些基本方法; (2)这些处理方法基本是对二进制图像进行处理; (3)卷积核决定着图像处理后的效果; https://zhuanlan.zhihu.com/p/110787009
(2).形态学图像处理
(1)顶帽; (2)黑帽
2.二值化
(1)全局二值化
将图像的每个像素值变成两种值,如0,255;也就是将整个图像呈现出明显的黑白效果的过程。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
1)函数
函数:threshold(src, thresh, maxval, type, dst=None) : Src:输入的原始图像;(最好是灰度图) ; Thresh:设置的阈值 ; Maxval:当图像中的像素值大于该阈值时,使用maxval值代替 ; Type:阈值设置的类型 ; Dst:输出图像 ;
2)阈值类型
这里分别对应上面的五种类型讲解
3)代码实战
import os
import cv2
import numpy as np
def Threshold(img_path='images/lenna.png'):
img_src=cv2.imread(img_path)
img=cv2.resize(src=img_src,dsize=(450,450))
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,img=cv2.threshold(src=img,thresh=100,maxval=255,type=cv2.THRESH_BINARY)
cv2.imshow('img_src',img_src)
cv2.imshow('img',img)
print('ret: {}'.format(ret))
cv2.waitKey(0)
cv2.destroyAllWindows()
def detectTimeThreshold():
cap=cv2.VideoCapture(0)
while cap.isOpened():
OK,frame=cap.read()
img = cv2.resize(src=frame, dsize=(450, 450))
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, img = cv2.threshold(src=img, thresh=100, maxval=255, type=cv2.THRESH_BINARY)
cv2.imshow('img', img)
#获取鼠标和键值
if cv2.waitKey(1)&0XFF==27:
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
print('Pycharm')
# Threshold()
detectTimeThreshold()
(2)局部二值化(自适应阈值)
由于光照不均匀以及阴影的存在,只有一个阈值会使得在阴影处的白色被二值化为黑色,所以提出局部二值化。在局部范围内根据特定算法算出局部的阀值,这个局部的大小可以自己决定,例如5x5.本文所用的用法是局部平局的灰度值作为阀值。得到局部阀值再进行局部二值化处理。
1)函数
:adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None) : Src:输入的原始图像 ; maxValue;设置的阈值 ; adaptiveMehtod:计算阈值的方法 ; ADAPTIVE_THRESH_MEAN_C:计算邻近区域的平均值(窗口内的所有值求和取平均); ADAPTIVE_THRESH_GAUSSIAN_C:高斯窗口加权平均值(越靠近中心的权重越高); thresholdType;设置阈值的类型 ; blockSize:邻近区域的大小,如3,5,7 ; C:常量,应从计算出的平均值或加权平均值中减去 。 Dst:输出图像 ;
2)阈值类型
T(x,y)是为每个像素单独计算的阈值。
import os
import cv2
import numpy as np
def adaptiveThreshold(img_path='images/lenna.png'):
img_src=cv2.imread(img_path)
img=cv2.resize(src=img_src,dsize=(450,450))
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img=cv2.adaptiveThreshold(src=img,maxValue=100,adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
thresholdType=cv2.THRESH_BINARY,blockSize=3,C=0)
cv2.imshow('img_src',img_src)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def detectTimeApativeThreshold():
cap=cv2.VideoCapture(0)
while cap.isOpened():
OK,frame=cap.read()
img = cv2.resize(src=frame, dsize=(450, 450))
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.adaptiveThreshold(src=img,maxValue=100,adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
thresholdType=cv2.THRESH_BINARY,blockSize=3,C=0)
cv2.imshow('img', img)
#获取鼠标和键值
if cv2.waitKey(1)&0XFF==27:
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
print('Pycharm')
# adaptiveThreshold()
detectTimeApativeThreshold()
|