【Opencv+Yolo】Day2_图像处理

目录

一、图像梯度计算

图像梯度-sobal算子:

Scharr:权重变化更大(线条更加丰富,比Sobel更加细致捕捉更多梯度信息)

Laplacian算子:对噪音点敏感(可以和其他一起结合使用)

二、边缘检测:

Canny边缘检测:

​编辑

三、图像金字塔:

高斯金字塔:

拉普拉斯金字塔

四、图像轮廓:

[cv2.findContours(img, mode, method)](#cv2.findContours(img, mode, method))


一、图像梯度计算

图像梯度-sobal算子:

为什么两边✖️2? ------因为我们关注的就是P5左右两边的梯度差,p6p4离得近,权重大

|----|-----|
| Gx | 右-左 |
| Gy | 下-上 |

dst2 = cv2.Sobel(src,ddepth,dx,dy,ksize)

-ddepth:图像的深度

-dx和dy:水平竖直方向

-kszie:是Sobel算子的大小

-不建议dxdy直接设置1,1;分开计算求和效果好

python 复制代码
pie= cv2.imread('pie.png')
#结果有正负,只关系差异,正负取绝对值,现在看水平的,显示有梯度的地方,边界部分
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,kszie=3)
cv_show(sobelx,'sobelx')
#白->黑是正数;黑->白是负数,所有负数截断为0,所以要取绝对值
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,kszie=3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx,'sobelx')
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,kszie=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely,'sobely')
#xy求和
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5)
cv_show(sobelxy,'sobelxy')

Scharr:权重变化更大(线条更加丰富,比Sobel更加细致捕捉更多梯度信息)

python 复制代码
scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5)

Laplacian算子:对噪音点敏感(可以和其他一起结合使用)

python 复制代码
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)

二、边缘检测:

Canny边缘检测:

1)使用高斯滤波器,以平滑图像,滤除噪声。(中间点比较大)

2)计算图像中每个像素点的梯度强度和方向。

3)应用非极大值抑制(NMSNon-Maximum Suppression),抑制以消除边缘检测带来的杂散响应。(体现最明显的)

A方法:c,g1,g2,g3,g4,想求两个交点梯度,用线性插值法用权重;如果C比两个交点梯度都大,才保留下来

B方法:

A与BC比较,A>BC,保存边界

4)应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘,只保留最真实的。

C与A边界连接,暂且保留;B不与边界连接,不保留

5)通过抑制孤立的弱边缘最终完成边缘检测

python 复制代码
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
#参数是minmaxvalue
v1 = cv2.Canny(img,80,150)#比较大,边缘信息较小
v2 = cv2.Canny(img,50,100)#比较小,边缘信息更多,有可能有噪音
res = np.hstack((v1,v2))
cv_show(res,'res')


三、图像金字塔:

高斯金字塔:

向下采样(缩小)(往塔尖)


向上采样(放大)(往塔底)

python 复制代码
img = cv2.imread('AM.PNG')
cv_show(img,'img')
print(img.shape)
#放大
up = cv2.pyrUp(img)
cv_show(up,'up')
print(up.shape)
#变小
down = cv2.pyrDown(img)
cv_show(down,'down')
print(down.shape)

拉普拉斯金字塔

python 复制代码
#第一层
down = cv2.pyrDown(img)
down_up = cv2.pyrUp(down)
l=img-down_up
cv_show(l,'l')

四、图像轮廓:

背景:之前的边缘可能包含一些线段,不能叫做轮廓,得是一个整体,才能是轮廓

cv2.findContours(img, mode, method)

mode: 轮廓检索模式

  • RETR_EXTERNAL:只检测最外层的轮廓;

  • RETR_LIST:检测所有轮廓,并将它们保存到同一层级中;

  • RETR_CCOMP:检测所有轮廓,并将它们组织为两层:顶层是外部边界,第二层是空洞边界;

  • RETR_TREE:检测所有轮廓,并建立一个完整的轮廓层级结构(树形层次)--常用

method: 轮廓逼近方法

  • CHAIN_APPROX_NONE:保留所有的轮廓点(不做压缩),输出完整多边形的顶点序列;

  • CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线方向上的冗余点,仅保留端点;(边缘简单化,进行压缩得到精简结果)

  1. 为了准确性,使用二值图像:
  2. 传入二值,检测轮廓
  3. 绘画轮廓
python 复制代码
img = cv2.imread('img.png')
gary = cv2.cvtColor(img,cv2.COLOR_BGRGRAY)
#二值处理,小的是0白,大的255黑
ret,thresh = cv2.threshhold(gray,127,255,cv2.THRESH_BINARY)
cv_show(thresh,'thresh')
#检测函数,传入二值图像,检测所有轮廓
#第一个值,二值结果
#第二个值:轮廓信息
#第三个值:层级
binary,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#绘制轮廓,需要copy,不然会覆盖
draw_img = img.copy()
#第三个参数,轮廓画第几个,-1是所有
#倒数第二个参数BGR格式
#2:线条宽度
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv_show(res,'res')

轮廓特征

python 复制代码
#需要先取出轮廓
cnt = contours[0]
#面积
cv2.contourArea(cnt)
#周长
cv2.arcLength(cnt,True)

轮廓近似:

python 复制代码
img = cv2.imread('img.png')
gary = cv2.cvtColor(img,cv2.COLOR_BGRGRAY)
#二值处理,小的是0白,大的255黑
ret,thresh = cv2.threshhold(gray,127,255,cv2.THRESH_BINARY)
cv_show(thresh,'thresh')
binary,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = contours[0]
draw_img = img.copy()
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv_show(res,'res')
#周长*0.1,值越小和轮廓越贴合,越大远离轮廓
epsilon = 0.1*cv2.arcLength(cnt,True)
#周长做阈值
approx = cv2.approxPolyDP(cnt,epsilon,True)
draw_img = img.copy()
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv_show(res,'res')

边界矩形:

python 复制代码
img = cv2.imread('img.png')
gary = cv2.cvtColor(img,cv2.COLOR_BGRGRAY)
ret,thresh = cv2.threshhold(gray,127,255,cv2.THRESH_BINARY)
cv_show(thresh,'thresh')
binary,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = contours[0]
x,y,w,h = cv2.boundingRect(cnt)
#外接矩形面积
rect_area = w*h
#轮廓与边界矩形面积比
extent = float(area)/rect_area
相关推荐
PixelMind2 小时前
【LUT技术专题】图像自适应3DLUT
图像处理·深度学习·算法·3dlut
AndrewHZ10 小时前
【图像处理入门】2. Python中OpenCV与Matplotlib的图像操作指南
图像处理·python·opencv·计算机视觉·matplotlib·图像操作
whoarethenext14 小时前
磨皮功能 C++/C的OpenCV 实现
c语言·c++·opencv·磨皮功能
2201_7549184117 小时前
YOLOv2 深度解析:目标检测领域的进阶之路
人工智能·yolo·目标检测·计算机视觉
yes or ok1 天前
二、OpenCV图像处理-图像处理
图像处理·人工智能·opencv
Hygge-star1 天前
【Java进阶】图像处理:从基础概念掌握实际操作
java·图像处理·人工智能·程序人生·职场和发展
美狐美颜sdk1 天前
从图像处理到深度学习:直播美颜SDK的人脸美型算法详解
图像处理·深度学习·计算机视觉·美颜sdk·美颜api
dd向上1 天前
8位单通道数据保存为JPG
c++·图像处理
jndingxin1 天前
OpenCV CUDA模块直方图计算------用于在 GPU 上执行对比度受限的自适应直方图均衡类cv::cuda::CLAHE
人工智能·opencv·计算机视觉
layneyao1 天前
计算机视觉入门:OpenCV与YOLO目标检测
opencv·yolo·计算机视觉