博主用的是python3,不过在结尾也有c++方法的地址,供大家参考学习,图像边缘识别需要安装opencv。网上也有一部分人用的是PIL,我在查找了一些资料,并看了一些人的评论后决定用opencv,也推荐各位用。
我简单的理解了一下图像边缘识别的方法,总结为以下几点:
1、了解电脑中图片的存储方式
2、什么是算子
3、获取图片像素——行数,列数,图片的通道数(这是彩色图片,灰度图像没有通道数)
4、进行图片边缘识别检测
首先应该了解什么是图片,图片有很多种,我并不完全懂,这里我说一下256色图片,256也就是2的8次方,在存储的方式上使用一个字节,也就是8位0和1的二进制表示的,从0开始到255结束,所以说他是16色图片数据量的两倍。
详见:https://baike.baidu.com/item/%E7%AE%97%E5%AD%90/970194?fr=aladdin
然后是算子,简单来说就是一种映射,和我们中学学的函数并无区别。但是在图像边缘识别的方法中有两个算子,根据我的理解,是分别计算得到纵向和横向的灰度图。
详见:https://baike.baidu.com/item/%E7%AE%97%E5%AD%90/970194?fr=aladdin
首先我贴出我查看别人博客认为图片边缘识别最好的一版的代码:
1 import cv2;
2 import numpy as np
3
4 img = cv2.imread(r'图片地址')
首先导入图片数据。
1 x = cv2.Sobel(img, cv2.CV_16S, 1, 0, ksize=-1)
2 y = cv2.Sobel(img, cv2.CV_16S, 0, 1, ksize=-1)
3 # ksize=-1 Scharr算子
4 # cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
5 # 可选参数alpha是伸缩系数,beta是加到结果上的一个值,结果返回uint类型的图像
6 Scharr_absX = cv2.convertScaleAbs(x) # convert 转换 scale 缩放
7 Scharr_absY = cv2.convertScaleAbs(y)
8 result = cv2.addWeighted(Scharr_absX, 0.5, Scharr_absY, 0.5, 0)
9 blur = cv2.GaussianBlur(img, (3, 3), 0) # 用高斯滤波处理原图像降噪
10 canny = cv2.Canny(blur, 50, 150) # 50是最小阈值,150是最大阈值
11 cv2.imshow('canny', canny)
12 cv2.waitKey(0)
13 cv2.destroyAllWindows()
效果非常给力,大家可以去尝试,不要忘记import cv2,想更多了解的朋友推荐大家看一下我推荐的最后一个博客,非常多的方法都可以去尝试。
代码转载自:
相关资料可查阅:
c++版本图像边缘检测:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html(c++的,代码流程可以用作参考)
python图片像素的获取:
图像边缘识别: (这个里面的canny算子我没有调试出来,不过别的方法也非常给力,大家可以看一下)