OpenCV基础补充自适应阈值及图像金字塔
对于OpenCV知识点还有很多,基础的大家可以参考前面几节。
OpenCv基础之绘图及几何变换实例
OpenCV基础操作之图像的形态学运算
OpenCV基础操作之边界填充、图像阈值以及图像平滑处理
OpenCV基础之边缘检测与轮廓描绘
OpenCV基础之模板匹配与直方图
OpenCV图像处理之傅里叶变换
一篇文章搞懂OpenCV之图像特征
OpenCV基础之常见的图像梯度算子
基于OpenCv的图像分割(分水岭算法)
自适应阈值
cv.adaptiveThreshold()
- 参数1:待处理的原图
- 参数2:最大阈值,一般为255
- 参数3:小区域阈值的计算方法
- cv.ADAPTIVE_THRESH_MEAN_C:阈值是领近区域的平均值减去常数C
- cv.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域值的高斯加权总和减去常数C
- 参数4:阈值方式(阈值类型)
- 参数5:小区域的面积,如11就是11*11的小块
- 参数6:最终阈值等于小区域计算出的阈值再减去次值
特定:自适应阈值会每次取图片的一小部分计算阈值,这样图片不同区域的阈值就不一定相同,适用于明暗分布不均的图片。
img = cv2.imread('img/table.png',0)
# 固定阈值
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# 自适应均值阈值
th_MEAN = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,4)
# 自适应高斯阈值
th_GAUSSIAN = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,4)
titles = ['Orginal Image','threshold','ADAPTIVE_THRESH_MEAN_C','ADAPTIVE_THRESH_GAUSSIAN_C']
images = [img,thresh1,th_MEAN,th_GAUSSIAN]
# 通过matplotlib展示原图、固定阈值、自适应均值阈值、自适应高斯阈值图片进行对比
for i in range(4):
plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
图像金字塔
# 金字塔读取图
img=cv2.imread('img/orange.png')
# 高斯金字塔,向上采样方法(放大)
# 将图像在每个方向扩大为原来的两倍,新增的行和列以0填充
# 使用先前同样的内核(乘以4)与放大后的图像卷积,获得近似值
up=cv2.pyrUp(img)
# 高斯金字塔,向下采样方法(缩小)
# 将Gi与高斯内核卷积
# 将所有偶数行和列去除
down=cv2.pyrDown(img)
# 拉普拉斯金字塔
# 拉普拉斯金字塔是高斯金字塔与其上一层通过上采样扩大后的差值图像,这里的上采样一般采用插值的方式进行。Li = Gi - pyrUp(pyrDown(Gi))
down_up = cv2.pyrUp(cv2.pyrDown(img))
Laplacian = img - down_up
# 展示图片,注意不能通过np.hstack()进行展示,因为图像的大小不一致
plt.subplot(221),plt.imshow(img),plt.title('Orginal Image')
plt.subplot(222),plt.imshow(up),plt.title('pyrUp')
plt.subplot(223),plt.imshow(down),plt.title('pyrDown')
plt.subplot(224),plt.imshow(Laplacian),plt.title('Laplacian')
plt.show()
通过opencv查看原图和进行上采样和下采样后图像的差异。
cv2.imshow('img',img)
cv2.imshow('down_up',down_up)
cv2.waitKey(0)
人脸检测
Opencv自带人脸检测,方式一:通过照片进行人脸检测;方式二:通过摄像头进行人脸检测。
haarcascade_frontalface_default.xml是OpenCv自带的一个人脸检测配置文件。一般在python环境中OpenCv库中data文件夹中。
例如:D:\Program Files\Python\Python39\Lib\site-packages\cv2\data(这是寻找haarcascade_frontalface_default.xml文件的地方)
img = cv2.imread("img/lena.jpg")
face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray,scaleFactor=1.15,minNeighbors=4,minSize=(5,5))# 检测到人脸个数
for(x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)# 在人脸范围画矩形标注
cv2.namedWindow("Faces")
cv2.imshow("Faces",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
视频检测人脸检测
# 打开摄像头(笔记本或电脑)
cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier(r'haarcascade_frontalface_default.xml')
# 通过循环进行人脸检测
while(True):
# 获取一帧帧图像
ret,frame = cap.read()
# 进行人脸检测
faces = face_cascade.detectMultiScale(frame, scaleFactor=1.5, minNeighbors=4, minSize=(5, 5))
# 通过for循环画矩形框
for(x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow('frame',frame)
# 按下"q"键停止(在英文状态下)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
在代码展示部分有些没有导入cv2和matplotlib库大家记得导入,否则代码报错哦。OpenCv在机器视觉方面可以作为入门知识,尽管在pyTorch中的transforms已经封装了,但是通过opencv我们可以直观的了解每个知识点,如果时间允许,建议大家可以从基础学起。毕竟框架封装的只有接口,当然OpenCV也是封装后的,但是每个基础可以作为一个独立的知识点进行探究,至于transforms更注重服务于框架使用。以上仅仅是个人观点,不喜勿喷。很高兴能和大家分享我的学习过程和成果,笔者也是刚入门的小白一枚,希望大家多多支持。