OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
目录
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循环也是一个参数一个参数的调整出来的结果,搞这个东西要细心与耐心缺一不可。
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的