图像边缘识别检测
博主用的是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,想更多了解的朋友推荐大家看一下我推荐的最后一个博客,非常多的方法都可以去尝试。
代码转载自:https://blog.csdn.net/sunny2038/article/details/9202641
相关资料可查阅:
c++版本图像边缘检测:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html(c++的,代码流程可以用作参考)
python图片像素的获取:https://blog.csdn.net/mao_hui_fei/article/details/78217049
图像边缘识别: https://blog.csdn.net/qq_40962368/article/details/81416954(这个里面的canny算子我没有调试出来,不过别的方法也非常给力,大家可以看一下)