OpenCV入门笔记(六) 形态学变换
来源:互联网 发布:网络言情经典小说作家 编辑:程序博客网 时间:2024/06/01 13:17
形态学变换(Morphological Transformations),其实是数学上的一个分支,是基于形状的一些列图像处理操作。OpenCV提供了很多方便而有用的操作函数。
一、腐蚀和膨胀(erosion & dilation)
腐蚀(erosion)和膨胀(dilation)是形态学中两个最基本的操作。他们结合后又会衍生出其他很多种复杂的过程。其基本思想很简单,就是用一个核函数,扫过原图像,用覆盖的区域中最值代替锚点(锚点即核函数当前的中心点,即扫描的中心点)。下面是苏东坡《水调歌头·明月几时有》的楷体图片,我们来看看腐蚀和膨胀对该图片的影响。
值得注意的是,这里是白底黑字,形态学操作都是针对 高亮部分,即白色的背景而言的。这里腐蚀可以看做是对白色的背景,一点点蚕食,所以字会变粗变大;相反的,膨胀,就是背景长胖了,把字给挤的细瘦细瘦的。
原图(origin) 如下
腐蚀(erosion)
锚点取的值是核函数覆盖区域中的最小值,值越小越暗,如下图
膨胀(dilation)
锚点取的值是核函数覆盖区域中的最大值,值越大越量,如下图
下面的代码,展示了原图,腐蚀和膨胀后的三张图。
#coding:utf8import cv2import numpy as np# 常用于处理二值化后的图片img = cv2.imread("poem_binary.png")# 核函数,这里可以自定义的kernel = np.ones((3, 3), np.uint8)# 腐蚀和膨胀操作erosion = cv2.erode(img, kernel, iterations = 1)dilation = cv2.dilate(img, kernel, iterations = 1)# 显示三张图片cv2.namedWindow("origin img", cv2.WINDOW_NORMAL)cv2.namedWindow("erosion", cv2.WINDOW_NORMAL)cv2.namedWindow("dilation", cv2.WINDOW_NORMAL)cv2.imshow("origin img", img)cv2.imshow("erosion", erosion)cv2.imshow("dilation", dilation)# 等待键盘输入cv2.waitKey(0)cv2.destroyAllWindows()
二、形态学函数(MorphologyEx)
所谓的 高级形态学变换
,其实还是在上面的腐蚀和膨胀上发展来的,一共五种,都是直接用morphologyEx
函数调用。列举如下
1. 开运算(Opening Operation) = 先腐蚀,后膨胀
2. 闭运算(Closing Operation) = 先膨胀,后腐蚀
3. 形态学梯度(Morphological Gradient) = 膨胀图 - 腐蚀图
4. 顶帽(Top Hat) = 原图 - 开运算图
5. 黑帽(Black Hat) = 闭运算图 - 原图
下面是一些参考资料
- 【这篇博文】不是一般的详细,原理,展示都有。
- C++版教程见这里【更多形态学变换】
- Python版教程的见这里【Morphological Transformations】
我用了一张楷体的“阖”字做了各个特效,结果如下图
代码也放在这里。
#coding:utf8import cv2import numpy as np# 读取图片img = cv2.imread("./pic/he.png")# 核函数,这里可以自定义的,两种方法都可以#kernel = np.ones((3, 3), np.uint8)kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))# 更多的形态学运算opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)# 显示图片cv2.namedWindow("origin img", cv2.WINDOW_NORMAL)cv2.namedWindow("opening", cv2.WINDOW_NORMAL)cv2.namedWindow("closing", cv2.WINDOW_NORMAL)cv2.namedWindow("gradient", cv2.WINDOW_NORMAL)cv2.namedWindow("tophat", cv2.WINDOW_NORMAL)cv2.namedWindow("blackhat", cv2.WINDOW_NORMAL)cv2.imshow("origin img", img)cv2.imshow("opening", opening)cv2.imshow("closing", closing)cv2.imshow("gradient", gradient)cv2.imshow("tophat", tophat)cv2.imshow("blackhat", blackhat)# 等待键盘输入cv2.waitKey(0)cv2.destroyAllWindows()
- OpenCV入门笔记(六) 形态学变换
- Python OpenCV 形态学 (六)
- opencv 其他形态学变换
- openCv学习笔记(六)-openCv对形态学的运算处理
- 【OpenCV】笔记(7)——图像滤波和形态学变换
- 【OpenCV学习笔记 008】基于形态学运算的图像变换
- opencv图像的形态学变换
- opencv 形态学变换 morphologyEx函数
- Python下opencv使用笔记(六)(图像的形态学转换)
- OpenCV学习笔记(六) 滤波器 形态学操作(腐蚀、膨胀等)
- OpenCV入门(八)--形态学图像处理
- python opencv入门 形态学转换(13)
- 学习OpenCV范例(十二)——更多形态学变换
- openCV学习笔记(5)-- 图像形态学
- OpenCV学习笔记-形态学
- opencv学习笔记第五章:基于形态学运算的图像变换(1)形态学运算进行腐蚀和膨胀
- python opencv形态学变换:腐蚀与膨胀
- OpenCV-图像模糊,梯度、形态学变换
- 为什么析构函数是虚函数
- Java中的抽象类和接口
- 从编译器角度分析C语言中数组名和指针的区别
- strcpy没有声明 c++头文件详解
- UGUI(九)UI粒子特效
- OpenCV入门笔记(六) 形态学变换
- PullToRefreshListView进阶(一)----->下拉刷新
- 关于电话面试的粗略回忆
- Apple iOS MDM service 簡介
- poi XSSFWorkbook实现excel中的下拉框
- Deep Learning(深度学习)学习笔记整理系列之(七)
- AndroidManifest中activity属性参数设置大全
- Delegate的使用场合
- 转载Rain Man 怀仁怀朴,唯真唯实。的随记