计算机视觉openCV边缘检测
边缘检测
边缘检测 (一般直接转换为灰度图就可以了)
1)canny边缘检测算法

1、高斯滤波器
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。

2、像素点的梯度强度和方向


3、非极大值抑制法
一个图截取好多个框框,选取识别率最高的


如果要计算直线跟矩形的两个交点,可以计算他们的距离比例

4、双阈值检测
大于max的时候例如(A)就把他当作边界
小于min的时候例如(D)就把他舍弃
在中间的时候并且什么都不相连例如(B)舍弃
只有在中间并且有线段有在边界上的例如(C)保留

算法实现
import cv2
img=cv2.imread(‘car.png’,cv2.IMREAD_GRAYSCALE)
v1=cv2.Canny(img,80,120)
cv2.imshow(‘img’,v1)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像金字塔

向下采样法

向上采样法

代码
上采样可以放大图片,下采样可以缩小图片。实现代码如下:
up=cv2.pyrUp(img) #pyr表示金字塔,up表示放大
down=cv2.pyrDown(img) #down表示缩小
图像轮廓
需要注意的是cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图。需要注意的是,cv2.findCountours()返回两个参数,cv3则返回三个参数。

为了更高的准确率,图像需要先转成灰度然后二值化
img=cv2.imread(‘car.png’)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 转换为灰度图
ret,thresh=cv2.threshold(gray,127,255,cv2.THRESH_BINARY) #图像二值化
def cv_show(img,name):
cv2.imshow(name,img)
cv2.waitKey()
cv2.destroyAllWindows()
cv_show(thresh,‘up’)
绘制轮廓
代码
contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) #contours为图像轮廓信息,hierarcgy为图像层数
draw_img=img.copy()
res=cv2.drawContours(img,contours,-1,(0,0,255),2) #-1一般基本不变,指全部轮廓,括号即为(BGR)三个通道的值
cv_show(res,‘res’)

