码迷,mamicode.com
首页 > 其他好文 > 详细

OpenCV入门笔记(四) 形态学变换

时间:2015-07-25 20:04:27      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:python   opencv   

形态学变换(Morphological Transformations),其实是数学上的一个分支,是基于形状的一系列图像处理操作。OpenCV提供了很多方便而有用的操作函数。


一、腐蚀和膨胀(erosion & dilation)

腐蚀膨胀 是形态学中两个最基本的操作。他们结合后又会衍生出其他很多种复杂的过程。其基本思想很简单,就是用一个 核函数,扫过原图像,用覆盖的区域中最值代替锚点(核函数当前的中心点,即扫描的中心点)。下面是苏东坡《水调歌头·明月几时有》的楷体图片,我们来看看腐蚀和膨胀对他的影响。

值得注意的是,这里是白字黑底,形态学操作都是针对 高亮部分,即白色的字而言的。假如是白底黑字,那就正好相反了。这里腐蚀可以看做是对白色的字,一点点蚕食;膨胀,就是字体长胖喽~

看原图:
技术分享


腐蚀(erosion) 锚点取的值是核函数覆盖区域中的最小值,值越小越暗,如下图

技术分享


膨胀(dilation) 锚点取的值是核函数覆盖区域中的最大值,值越大越亮,如下图

技术分享


下面的代码,展示了原图,腐蚀和膨胀后的三张图。

import cv2
import 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.show("origin img", img)
cv2.show("erosion", erosion)
cv2.show("dilation", dilation)

# 存一下
cv2.imwrite("poem_ero.png", erosion)
cv2.imwrite("poem_dila.png", dilation)

# 等待键盘输入
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()

二、形态学函数(MorphologyEx)

所谓的 高级形态学变换,其实还是在上面的腐蚀膨胀上发展来的,一共五种,都是直接用morphologyEx函数调用。列举如下

1. 开运算(Opening Operation) = 先腐蚀,后膨胀

dst=open(src,element)=dilate(erode(src,element))

2. 闭运算(Closing Operation) = 先膨胀,后腐蚀

dst=close(src,element)=erode(dilate(src,element))

3. 形态学梯度(MorphologicalGradient) = 膨胀图 - 腐蚀图胀

dst=morph_grad(src,element)=dilate(src,element)?erode(src,element)

4. 顶帽(Top Hat) = 原图 - 开运算图

dst=tophat(src,element)=src?open(src,element)

5. 黑帽(Black Hat) = 闭运算图 - 原图

dst=blackhat(src,element)=close(src,element)?src

由于操作太多,具体的特效多图就看【这篇博文】吧,不是一般的详细,我就不赘述了。


三、例子和代码

我用了一张楷体的“阖”字做了各个特效,结果如下图

技术分享


代码也放在这里。

import cv2 
import numpy as np

img = cv2.imread("he.jpg")

# 核函数
kernel = np.ones((3, 3), np.uint8)

# 形态学变换
erosion = cv2.erode(img, kernel, iterations = 1)
dilation = cv2.dilate(img, kernel, iterations = 1)

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("img", cv2.WINDOW_NORMAL)
cv2.namedWindow("erosion", cv2.WINDOW_NORMAL)
cv2.namedWindow("dilation", 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("img", img)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)
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   

原文地址:http://blog.csdn.net/zhangxb35/article/details/47058805

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!