一、读取图像常用的三种方式
1.方式一:matplotlib.image
from matplotlib import image
img1 = image.imread('Datas/cat.jpg')
plt.imshow(img1)
2.方式二:opencv读取图像
import cv2
img2 = cv2.imread('Datas/cat.jpg') #opencv读取的图像格式为BGR
img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2RGB) #将BGR转换为RGB
plt.imshow(img2)
3.方式三:PIL库读取图像
from PIL import Image
img3 = Image.open('Datas/cat.jpg')
plt.imshow(img3)
type(img3) #PIL库读取的图像格式为:JpegImageFile类型
img3 = np.array(img3)#将JpegImageFile转换为np.array
二、canny边缘检测
Canny Detector是一种边缘检测算法。通过检测图像亮度(梯度)的急剧变化,并在给定一组阈值的情况下,将其定义为边缘。
Canny算法的四个步骤:
① 降噪:使用5*5的高斯滤波器进行降噪.
② 求梯度
③ 非最大抑制:
如果梯度值是局部最大则保留,否则抛弃.
非最大抑制使得检测出的边界线较细.
④ 滞后阈值:设置阈值minVal和maxVal
梯度高于maxVal的像素都是边缘;
梯度低于minVal的像素都不是边缘;
梯度介于minVal和maxVal之间时,需要进一步判断该像素是否是边缘;(当其与高于maxVal的强像素相连时,才被认为是边缘; 否则不认为是边缘)
三、霍普变换
- 检测图像中是否包含特定几何形状的物体。
-
笛卡尔坐标系与霍普空间
① 笛卡尔坐标系中的一条线对应霍普空间中的一个点
③ 笛卡尔坐标系中直线的检测
检测笛卡尔坐标中两点是否能连成一条直线,可以在霍普空间中画出这两点对应的直线,当两条直线相交时,就代表这两个点可以连成一条直线,并且霍普空间中的相交点即为笛卡尔坐标系中直线的截距和斜率。
- Canny边缘检测出的边缘其实就是一系列的点,我们通过霍普空间来判断其中哪些点可以连接为一条直线,并同时得出这些直线的公式表达式。
- 实际上我们在使用Canny边缘检测时,使用的并不是笛卡尔坐标,而是Polar坐标(极坐标)。因为笛卡尔坐标系中存在一个数学缺陷:当线是垂直的时候,梯度是无穷大的,不能再霍普空间中表示。