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

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


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

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

值得注意的是,这里是白底黑字,形态学操作都是针对 高亮部分,即白色的背景而言的。这里腐蚀可以看做是对白色的背景,一点点蚕食,所以字会变粗变大;相反的,膨胀,就是背景长胖了,把字给挤的细瘦细瘦的。

原图(origin) 如下



腐蚀(erosion)

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



膨胀(dilation)

锚点取的值是核函数覆盖区域中的最大值,值越大越量,如下图



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

#coding:utf8

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

下面是一些参考资料

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



代码也放在这里。

#coding:utf8
import cv2
import 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()

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 21:46:18

OpenCV入门笔记(六) 形态学变换的相关文章

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

形态学变换(Morphological Transformations),其实是数学上的一个分支,是基于形状的一系列图像处理操作.OpenCV提供了很多方便而有用的操作函数. 一.腐蚀和膨胀(erosion & dilation) 腐蚀和膨胀 是形态学中两个最基本的操作.他们结合后又会衍生出其他很多种复杂的过程.其基本思想很简单,就是用一个 核函数,扫过原图像,用覆盖的区域中最值代替锚点(核函数当前的中心点,即扫描的中心点).下面是苏东坡<水调歌头·明月几时有>的楷体图片,我们来看看腐

OpenCV入门笔记(六) 轮廓检测(Detect Contours)

轮廓(Contours),指的是有相同颜色或者密度,连接所有连续点的一条曲线.检测轮廓的工作对形状分析和物体检测与识别都非常有用. 在轮廓检测之前,首先要对图片进行二值化或者Canny边缘检测.在OpenCV中,寻找的物体是白色的,而背景必须是黑色的,因此图片预处理时必须保证这一点. cv2.findContours函数 Python版示例如下,也可以参考[OpenCV-Python教程(11.轮廓检测)][Contours : Getting Started] contours, hierar

【opencv入门之七】形态学图像处理(一):膨胀、腐蚀

参考网站: http://blog.csdn.net/poem_qianmo/article/details/23710721 1.形态学(morphology)概述 数学形态学(Mathematical morphplogy)是数学形态学图像处理的基本理论.其基本的运算包括: 二值腐蚀和膨胀.二值开闭运算.骨架抽取.极限腐蚀.击中击不中变化.形态学梯度.Top-hat变换.颗粒分析.流域变换.灰值腐蚀和膨胀.灰值开闭运算.灰值形态学梯度等. 最基本的两种是:腐蚀和膨胀.其两的主要功能有: 消除

OpenCV入门笔记(二) 图片的文件操作

以下介绍一下重要的几个,设计基本 图片处理 的函数,依次来了解OpenCV的入门知识.具体的具体使用方法还是以官方的API[Official Tutorials][Python-OpenCV]为准. imread 图片读取函数.使用方法例如以下 # read image with color img = cv2.imread("./lena.jpg") # OR read gray image imgGray = cv2.imread("./lena.jpg", 0

OpenCV入门:(六:基础画图函数)

有时程序中需要画一些基础的图形,例如直线,矩形,椭圆以及多边形.OpenCV中当然有此类函数. 1.函数介绍 直线line: void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0) img – 图像 pt1 – 直线起点 pt2 – 直线终点 color – 颜色 thickness – 粗细 lineType – 直线类型,可以

OpenCV入门笔记(一) Linux下的安装

关于OpenCV,有中文的官方网站,里面翻译了官网的教程和API等.中文官方Tutorials见这里:[Tutorials] 一.Ubuntu下的安装 可以选择直接从库里安装,或者手动编译安装,请参考这里:[Installation in Linux] 1. 从repository(库)中安装 sudo apt-get install libopencv-dev python-opencv 2. 手动编译安装 首先要解决OpenCV的依赖问题,直接在终端下执行 sudo apt-get inst

OpenCV入门笔记(三) 图片处理

OpenCV中提供了很多处理图片的强大函数,可以对很多格式的图片加特效!有点实现Photoshop里的工具的感觉. 下面先介绍一些简单和常见的特效. 二值化(Image Threshold) 参考这里:Image Processing 二值化只能处理灰度图,而所谓的灰度图,就是一幅只用 0-255 这个范围来表示每一个像素点的图像.灰度图没有色彩信息,看起来灰萌灰萌哒:但是又不完全只有黑白两种颜色. 二值化,顾名思义,就是把灰度图的0-255的范围,映射到 0 和 1 两个值上.最简单的做法,便

OpenCV入门笔记(五) 边缘检测

这里介绍三种边缘检测的方法, Sobel算子(索贝尔算子), Laplacian算子(拉普拉斯算子) 和 Canny算子 的边缘检测. 一.Sobel算子 Sobel算子在一阶偏导上检测边缘,且能在水平(x 方向)和竖直(y 方向)分别作用.直观上,Sobel寻找这样的边缘:中间灰度值特别大,两边很小,即像素值出现跳跃的现象.我们可以通过求梯度值来确定. x 和 y 两个方向的核函数如下: ????1?2?1000+1+2+1???(Gx) ???+10?1+20?2+10?1???(Gy) 若

opencv入门笔记之四 读写视频 捕捉移动点

捕捉移动点时,  我们可以使用一种叫做 光学流动(optical flow) 的算法,  在关键点的周围,  所有点的流动导数都是相同的,  从而我门可以判断出关键点( feature points) 下面是代码: classCameraCaliberator { vector<vector<Point3f>> objectPoints; // the real points vector<vector<Point2f>> imagePoints; // p