Python常用图像形态学操作详解

目录
  • 腐蚀
  • 膨胀
  • 开运算与闭运算
    • 开运算
    • 闭运算
  • 梯度运算
  • 礼帽与黑帽
    • 礼帽
    • 黑帽

腐蚀

在一些图像中,会有一些异常的部分,比如这样的毛刺:

对于这样的情况,我们就可以应用复式操作了。需要注意的是,腐蚀操作只能处理二值图像,即像素矩阵的值只有0(黑色)和255(白色)。我们先看看代码和效果:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
# 腐蚀的代码
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

这张图片已经几乎看不到毛刺了,但与此同时,三个文字也小了一点,这就是腐蚀操作。所谓腐蚀操作,就是我们设置一个n×n的矩阵,这个矩阵可以视为一个卷积核,在原图上进移动。矩阵覆盖住的像素点中,如果有0(黑色),那么该卷积核的中心位置置零,反之,如果该卷积核内全都是255,则不做操作:

注意:我们可以理解成腐蚀操作是完全根据原图生成的新图,而不是在原土上的修改。

接下来我们再看看腐蚀的代码:

kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

首先,我们要利用numpy库生成一个n×n大小的全1矩阵kernel作为卷积核,并且需要指定数据类型为无符号8位整数。然后使用erode()函数,其接收的参数分别为图像矩阵,kernel矩阵,以及迭代次数。迭代次数就是腐蚀操作的次数。下面我们用一个圆来查看一下不同迭代次数的腐蚀效果:

import cv2
import numpy as np
kernel = np.ones((30,30),np.uint8)
pie = cv2.imread('pie.png')
# 观察不同的迭代次数
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

膨胀

腐蚀操作可以腐蚀掉二值图像的边缘,因此可以消除掉一些图片上的毛刺,但是损失一些原图相中有效的部分也是在所难免的。膨胀其实就是腐蚀操作的反面。“卷积核”包裹住的像素中有255,则这个卷积核中心位置会置为255,否则不变。因此,膨胀操作会把原本的图像范围进行扩大:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')

kernel = np.ones((3,3),np.uint8)
# 膨胀操作
dige_dilate = cv2.dilate(img,kernel,iterations = 1)
cv2.imshow('dilate', dige_dilate)

cv2.waitKey(0)
cv2.destroyAllWindows()

可以看到,膨胀操作后,图像的范围变大了一圈,就连毛刺也都扩大了。膨胀操作通常会配合腐蚀操作一起使用的,先腐蚀在膨胀,可以在保持图片中有效内容大小大体不变的情况下去除掉毛刺:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
# 腐蚀
erosion = cv2.erode(img,kernel,iterations = 1) # 对原图像进行腐蚀
# 膨胀
dige_dilate = cv2.dilate(erosion,kernel,iterations = 1) # 对腐蚀后图像进行膨胀
cv2.imshow('dilate', dige_dilate)

cv2.waitKey(0)
cv2.destroyAllWindows()

其原理和参数意义与腐蚀操作类似,在此不做过多讲解。

开运算与闭运算

开运算与闭运算都是应用腐蚀与膨胀操作来处理原图像的。区别在于开运算是先腐蚀在膨胀,闭运算是先膨胀再腐蚀。这两个操作需要用到的函数都是morphologyEx(),只需要调整参数即可完成两种不同的操作。

开运算

执行开运算的函数是:

cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

kernel依然是n×n的矩阵,cv2.MORPH_OPEN指定了执行运算为开运算:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果为:

闭运算

和开运算基本相同,只需要把morphologyEx()函数的第二个参数改为cv2.MORPH_CLOSE即可:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

很明显,先膨胀再腐蚀和原图并没有什么区别,仅仅是比原图大了一圈,因此闭运算也没有开运算应用广泛。

梯度运算

梯度运算本质是膨胀-腐蚀。从这个定义中不难发现,梯度就是原图的边缘部分。获取梯度依然要用到morphologyEx()函数,将第二个参数改为cv2.MORPH_GRADIENT即可:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
# 先用开运算把毛刺去掉:
img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

得到的结果就是下面这样:

礼帽与黑帽

礼帽和黑帽都是翻译的结果,因此我们不能望文生义。礼貌操作就是原始图像-开运算结果,黑帽操作是闭运算-原始输入。依然是用morphologyEx()函数,通过修改第二个参数完成。

礼帽

礼帽操作需要用到的参数是cv2.MORPH_TOPHAT。由礼帽操作的定义可以直到,礼帽操作可以得到图片中的“毛刺”部分:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((3,3),np.uint8)
# 礼帽操作
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

得到的结果为:

黑帽

黑帽操作需要用到的参数是cv2.MORPH_BLACKHAT,黑帽运算会输出执行闭运算后的图像比原图大出的一小圈轮廓:

import cv2
import numpy as np
img = cv2.imread('dagongren.png')
kernel = np.ones((5,5),np.uint8) # kernel矩阵维度大一些会让黑帽操作的结果更明显
# 黑帽操作
tophat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

到此这篇关于Python常用图像形态学操作详解的文章就介绍到这了,更多相关Python图像形态学内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python数字图像处理之高级形态学处理

    形态学处理,除了最基本的膨胀.腐蚀.开/闭运算.黑/白帽处理外,还有一些更高级的运用,如凸包,连通区域标记,删除小块区域等. 1.凸包 凸包是指一个凸多边形,这个凸多边形将图片中所有的白色像素点都包含在内. 函数为: skimage.morphology.convex_hull_image(image) 输入为二值图像,输出一个逻辑二值图像.在凸包内的点为True, 否则为False 例: import matplotlib.pyplot as plt from skimage import d

  • 详解Python图像形态学处理(开运算,闭运算,梯度运算)

    目录 一.图像开运算 二.图像闭运算 三.图像梯度运算 四.总结 这篇文章将继续介绍开运算.闭运算和梯度运算.数学形态学(Mathematical Morphology)是一种应用于图像处理和模式识别领域的新方法.数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具,其基本思想是用具有一定形态的结构元素去量度和提取图像中对应形状以达到对图像分析和识别的目的. 一.图像开运算 开运算一般能平滑图像的轮廓,削弱狭窄部分,去掉较细的突出.闭运算也是平滑图像的轮廓,与开运算相反,它一般熔合

  • Python OpenCV学习之图像形态学

    目录 背景 一.图像二值化 二.自适应阈值 三.腐蚀 四.卷积核获取 五.膨胀 六.开运算 七.闭运算 八.形态学梯度 九.顶帽运算 十.黑帽运算 总结 背景 形态学处理方法是基于对二进制图像进行处理的,卷积核决定图像处理后的效果:形态学的处理哦本质上相当于对图像做前处理,提取出有用的特征,以便后续的目标识别等任务: 一.图像二值化 定义:将图像的每个像素变成两种值,如0和255: 全局二值化的函数原型: threshold(img,thresh,maxVal,type) img:最好是灰度图像

  • python数字图像处理之基本形态学滤波

    目录 引言 1.膨胀(dilation) 2.腐蚀(erosion) 3.开运算(opening) 4.闭运算(closing) 5.白帽(white-tophat) 6.黑帽(black-tophat) 引言 对图像进行形态学变换.变换对象一般为灰度图或二值图,功能函数放在morphology子模块内. 1.膨胀(dilation) 原理:一般对二值图像进行操作.找到像素值为1的点,将它的邻近像素点都设置成这个值.1值表示白,0值表示黑,因此膨胀操作可以扩大白色值范围,压缩黑色值范围.一般用来

  • Python实例解析图像形态学运算技术

    1 图像形态学运算 在Python OpenCV图像处理之图像滤波特效详解中我们将图像滤波进行了以下分类: 邻域滤波 线性滤波 非线性滤波 频域滤波 低通滤波 高通滤波 在非线性滤波中,之前只介绍了中值滤波,事实上,还有一类非常常用的非线性滤波方法,称为图像形态学运算(Morphological operations). 图像形态学运算是一类基于图像形状运算的非线性滤波技术,其基本思想是利用一些特殊的结构元来测量或提取图像中相应的形状和特征,以便进一步进行图像分析和处理.这里结构元素就相当于我们

  • Python常用图像形态学操作详解

    目录 腐蚀 膨胀 开运算与闭运算 开运算 闭运算 梯度运算 礼帽与黑帽 礼帽 黑帽 腐蚀 在一些图像中,会有一些异常的部分,比如这样的毛刺: 对于这样的情况,我们就可以应用复式操作了.需要注意的是,腐蚀操作只能处理二值图像,即像素矩阵的值只有0(黑色)和255(白色).我们先看看代码和效果: import cv2 import numpy as np img = cv2.imread('dagongren.png') # 腐蚀的代码 kernel = np.ones((3,3),np.uint8

  • Python+OpenCV之形态学操作详解

    目录 一. 腐蚀与膨胀 1.1 腐蚀操作 1.2 膨胀操作 二. 开运算与闭运算 2.1 开运算 2.2 闭运算 三.梯度运算 四.礼帽与黑帽 4.1 礼帽 4.2 黑帽 一. 腐蚀与膨胀 1.1 腐蚀操作 import cv2 import numpy as np img = cv2.imread('DataPreprocessing/img/dige.png') cv2.imshow("img", img) cv2.waitKey(0) cv2.destroyAllWindows(

  • Python Pandas数据处理高频操作详解

    目录 引入依赖 算法相关依赖 获取数据 生成df 重命名列 增加列 缺失值处理 独热编码 替换值 删除列 数据筛选 差值计算 数据修改 时间格式转换 设置索引列 折线图 散点图 柱状图 热力图 66个最常用的pandas数据分析函数 从各种不同的来源和格式导入数据 导出数据 创建测试对象 查看.检查数据 数据选取 数据清理 筛选,排序和分组依据 数据合并 数据统计 16个函数,用于数据清洗 1.cat函数 2.contains 3.startswith/endswith 4.count 5.ge

  • OpenCV学习之图像形态学处理详解

    目录 1.腐蚀操作 2.膨胀操作 3.开闭运算 4.梯度运算 5.Top Hat Black Hat运算 本文是OpenCV图像视觉入门之路的第11篇文章,本文详细的在图像形态学进行了图像处理,例如:腐蚀操作.膨胀操作.开闭运算.梯度运算.Top Hat Black Hat运算等操作. 1.腐蚀操作 从下面代码中可以看到有三幅腐蚀程度不同的图,腐蚀越严重像素就越模糊 import cv2 import numpy as np from numpy import unicode if __name

  • Python入门之字符串操作详解

    目录 字符串 字符串常用操作 拼接字符串 字符串复制 计算字符串的长度 截取字符串和获取单个字符 字符串包含判断 常用字符串方法 把字符串的第一个字符大写 统计字符串出现的次数 检查字符串开头 检查字符串结尾 大写转小写 小写转大写 大小写翻转 标题化字符串 空格删除 合并字符串 分割字符串 将字符串按照行分割 判断字符串只是数字 判断是空字符 字符串填充 字符串搜索 字符串替换 格式化字符串 字符串编码转换 字符串 字符串常用操作 拼接字符串 拼接字符串需要使用‘+’运算符可完成对多个字符串的

  • Python读取word文本操作详解

    本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下. 一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就是说python-docx模块会把word文档,文档中的段落.文本.字体等都看做对象,对对象进行处理就是对word文档的内容处理. 二,相关概念 如果需要读取word文档中的文字(一般来说,程序也只需要认识word文档中的文字信息),需要先了解python-docx模块的几个概念. 1,Docume

  • 对Python 数组的切片操作详解

    高级特性 切片操作:对list,tuple元素进行截取操作,非常简便. L[0:3],L[:3] 截取前3个元素. L[1:3] 从1开始截取2个元素出来. L[-1] 取倒数第一个元素出来. L[-10] 取后10个数 L[10:20] 取前11-20个数 L[:10:2] 取前10个数,每两个取一个 L[::5] 所有数,每5个取一个 L[:] 原样复制一个list tuple,字符串也可以进行切片操作 以上这篇对Python 数组的切片操作详解就是小编分享给大家的全部内容了,希望能给大家一

  • opencv3/C++图像像素操作详解

    RGB图像转灰度图 RGB图像转换为灰度图时通常使用: 进行转换,以下尝试通过其他对图像像素操作的方式将RGB图像转换为灰度图像. #include<opencv2/opencv.hpp> #include<math.h> using namespace cv; int main() { //像素操作 Mat src,dst; src = imread("E:/image/image/daibola.jpg"); if(src.empty()) { printf

  • Python pandas 列转行操作详解(类似hive中explode方法)

    最近在工作上用到Python的pandas库来处理excel文件,遇到列转行的问题.找了一番资料后成功了,记录一下. 1. 如果需要爆炸的只有一列: df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]}) df Out[1]: A B 0 1 [1, 2] 1 2 [1, 2] 如果要爆炸B这一列,可以直接用explode方法(前提是你的pandas的版本要高于或等于0.25) df.explode('B') A B 0 1 1 1 1 2 2 2 1 3

  • python处理xml文件操作详解

    目录 1.python 操作xml的方式介绍 2.ElementTree模块 3.解析xml格式字符串并获取根节点 4.读取节点内容,getroot() 5.通标标签名直接获取标签(find,findall) 6.全文搜索标签名(类似xpath路径查找标签) 7.修改节点 8.删除节点 9.构建文件 方式1 (Element) 方式2 (makeelement) 方式3 1.python 操作xml的方式介绍 查看全部包含“三种⽅法: ⼀是xml.dom. * 模块,它是W3CDOMAPI的实现

随机推荐