OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
前言
计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种:
1、研究代码(慢,不稳定,独立并与其他库不兼容)
2、耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)
3、依赖硬件的一些特别的解决方案(比如视频监控,制造控制系统,医疗设备)这是如今的现状,而标准的API将简化计算机视觉程序和解决方案的开发,OpenCV致力于成为这样的标准API。
OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度。
故而我们选择学习OpenCV,我们来一步步的学习OpenCV。
环境
在这里我们不仅仅需要cv2的环境,还需要numpy的环境,故而需要我们单独安装一下:
pip install numpy
win的环境与CentOS的有些区别,是库的区别,我本地是华为的库,CentOS是CSDN库,都能用。
灰度图
这里需要引入numpy做计算,也就是kernel的卷积核。
import cv2 import numpy as np # 获取图片的数组 img = cv2.imread("800_600.jpg") # 卷积核:一般用一个5行5列的全是1的数组 kernel = np.ones((5, 5), np.uint8) # 生成灰度图 imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 展示 cv2.imshow("Gray Image", imgGray) cv2.waitKey(0)
实际效果:灰度
模糊图片
代码:可以修改模糊的强度,是一个奇数,取值范围建议1~151的奇数,不然就啥也看不清了。
import cv2 # 获取图片的数组 img = cv2.imread("800_600.jpg") # 模糊图 imgBlur = cv2.GaussianBlur(img, (151, 151), 5) # 展示 cv2.imshow("Gray Image", imgBlur) cv2.waitKey(0)
模糊效果
GaussianBlur函数
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。
语法:
dst=GaussianBlur(src,ksize,sigmaX [,dst [,sigmaY [,borderType]]])
参数:
src:图片
ksize:高斯内核大小。 ksize.width和ksize.height可以不同,但它们都必须为正数和奇数,也可以为零,然后根据sigma计算得出。
sigmaX:X方向上的高斯核标准偏差。
sigmaY:Y方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出;为了完全控制结果,而不管将来可能对所有这些语义进行的修改,建议指定所有ksize,sigmaX和sigmaY。
import cv2 # 获取图片的数组 img = cv2.imread("800_600.jpg") # 模糊图 imgBlur = cv2.GaussianBlur(img, (151, 151), 3, 17) # 展示 cv2.imshow("Gray Image", imgBlur) cv2.waitKey(0)
添加高斯核标准差效果:
提取边缘
代码:
import cv2 # 获取图片的数组 img = cv2.imread("800_600.jpg") # 边缘提取 imgCanny = cv2.Canny(img, 150, 200) # 展示 cv2.imshow("imgCanny", imgCanny) cv2.waitKey(0)
有些像描边,可以用于扣除祛斑啥的这种单独的点点。
边缘膨胀
代码:
import cv2 import numpy as np # 获取图片的数组 img = cv2.imread("800_600.jpg") kernel = np.ones((5, 5), np.uint8) # 边缘提取 imgCanny = cv2.Canny(img, 150, 200) # 膨胀边缘 imgDialation = cv2.dilate(imgCanny, kernel, iterations=1) # 展示 cv2.imshow("imgCanny", imgCanny) cv2.imshow("imgDialation", imgDialation) cv2.waitKey(0)
边缘膨胀,也就是强化了边缘。
边缘细化
代码:
import cv2 import numpy as np # 获取图片的数组 img = cv2.imread("800_600.jpg") kernel = np.ones((5, 5), np.uint8) # 边缘提取 imgCanny = cv2.Canny(img, 150, 200) # 膨胀边缘 imgDialation = cv2.dilate(imgCanny, kernel, iterations=1) # 边缘细化 imgEroded = cv2.erode(imgDialation, kernel, iterations=1) # 展示 cv2.imshow("imgCanny", imgCanny) cv2.imshow("imgDialation", imgDialation) cv2.imshow("imgEroded", imgEroded) cv2.waitKey(0)
实际效果:
整体对照
总结
很多参数细节都是需要我们自己来根据实际需求来调整的,包括后期的AI循环也是一个参数一个参数的调整出来的结果,搞这个东西要细心与耐心缺一不可。