大名鼎鼎的边缘检测,今天终于上手玩了一把。主要就是canny算法,代码如下:
##边缘检测
v1 = cv.Canny(img,120,250)
v2 = cv.Canny(img,50,250)
res = np.hstack((v1,v2))
cv_show('res',res)
只需要调用canny,就可以实现很好的标远检测的效果,通过调整数值参数,可以简单实现检测的严格程度。。。。
关于2个阈值参数:低于阈值1的像素点会被认为不是边缘;
高于阈值2的像素点会被认为是边缘;
在阈值1和阈值2之间的像素点,若与第2步得到的边缘像素点相邻,则被认为是边缘,否则被认为不是边缘。
基本的形态学操作,腐蚀和膨胀:
1.腐蚀,cv2.erode(img,kernel,iterations=1),三个参数,图片,用的核以及迭代的次数。
所谓的腐蚀,可以简单的理解为占主体的像素会吃掉次要的像素,就像被腐蚀掉了。
2.膨胀,cv2.dilate(img,kernel,iterations = 1),同上,可以看成是腐蚀的逆操作,以小吃大。
开运算(礼帽):先腐蚀,再膨胀。cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
闭运算(黑帽):先膨胀,再腐蚀.。cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
划重点!!!:
1.结构元素和卷积模板的区别在于,膨胀是以集合运算为基础的,卷积是以算数运算为基础的。
(OpenCV里面的腐蚀膨胀都是针对白色目标区域的)
2.膨胀:用结构元素的中心点对准当前正在遍历的这个像素,
然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最大值,用这个最大值替换当前像素值,给图像中的对象边界添加像素,使二值图像扩大一圈
3.腐蚀:用结构元素的中心点对准当前正在遍历的这个像素,
然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最小值,用这个最小值替换当前像素值,删除对象边界的某些像素,使二值图像减小一圈
4.因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。顶帽运算往往用来分离比邻近点亮些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
5.黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。所以,黑帽运算用来分离比邻近点暗一些的斑块。