文章目录

  • 形态学腐蚀操作
  • 形态学膨胀操作
  • 开运算
  • 闭运算
  • 梯度运算
  • 礼帽
  • 黑帽

形态学腐蚀操作

腐蚀操作通常处理只有二值的图像(比如黑白),这里的例子就是一个值为255(白色),一个是1(黑色)。
先导入必要的库:

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB

导入图像:

img = cv2.imread('dige.png')cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

来看一下事例图:

可以看到,这两个字有很多“毛刺”,如何去掉呢,就是用腐蚀操作(腐蚀操作可以理解为减肥)。下面我们看看腐蚀操作的代码和执行腐蚀操作后图像的样子。

kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)#第一个参数是导入的图片,第二个参数是filter过滤器,第三个参数是迭代次数,即执行几次腐蚀操作cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

可以发现毛刺被去掉了,并且字的笔画变细了。下面我们解释一下原理。
我们先倒入一张圆:

pie = cv2.imread('pie.png')cv2.imshow('pie', pie)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

腐蚀原理是这样的,我们先选择一个filter,这里我们选择全为1(其实这个过滤器的值并不需要特别考虑,暂时认为是1即可)的33矩阵,然后当我们检测到边缘点的时候,比如下图中的蓝色点,在这个33的过滤器中,含有黑色区域,那么这个点就会被腐蚀掉,变成黑色。

当如果这几个小方格都是白色,则这个点就不会变,比如下面的绿色点。

然后腐完就可以得到下面这张图(红色区域代表被腐蚀了的面积):

我们引入代码,看看多迭代几次的效果:

kernel = np.ones((30,30),np.uint8)
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()

运行结果:

随着迭代的增加,可见白色区域越来越小。
腐蚀程度还跟过滤器的大小有关,如果过滤器越大,那么腐蚀的可能性就越大,过滤器越小,腐蚀的可能性就越小,对照腐蚀原理,读者应该可以快速想出原因。

形态学膨胀操作

膨胀操作就相当于腐蚀操作的逆操作(增肥)。
导入图像:

img = cv2.imread('dige.png')cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

此图像还是上面拿着图:

我们先做腐蚀操作,去掉“毛边”:

kernel = np.ones((3,3),np.uint8)
dige_erosion = cv2.erode(img,kernel,iterations = 1)cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()


就像前面所说的,腐蚀操作不仅去掉了“毛刺”,还使笔画变细了,我们可以使用膨胀操作,把它变回来:

kernel = np.ones((3,3),np.uint8)
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

他的膨胀原理也是一样,比如这个黄色的点,当这些小格子中有白色的点,那么我就变成白色。

我们看一下多迭代几次的效果:

pie = cv2.imread('pie.png')kernel = np.ones((30,30),np.uint8)
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

开运算

开运算相当于把腐蚀和膨胀联系在一起,先腐蚀,再膨胀。

# 开:先腐蚀,再膨胀
img = cv2.imread('dige.png')kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)#cv2.MORPH_OPEN为开运算cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

闭运算

闭运算为开操作的逆运算,先膨胀,再腐蚀。

# 闭:先膨胀,再腐蚀
img = cv2.imread('dige.png')kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

闭运算操作不会把“毛刺”去掉。

梯度运算

梯度运算就是膨胀-腐蚀得到的边界面积信息,我们直接来看例子。
先对图像进行膨胀和腐蚀操作:

# 梯度=膨胀-腐蚀
pie = cv2.imread('pie.png')
kernel = np.ones((7,7),np.uint8)
dilate = cv2.dilate(pie,kernel,iterations = 5)
erosion = cv2.erode(pie,kernel,iterations = 5)res = np.hstack((dilate,erosion))cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

然后进行梯度操作:

gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
#cv2.MORPH_GRADIENT为梯度运算
cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

礼帽

礼帽 = 原始输入-开运算结果。
按照上面的例子,开运算后不带“毛刺”了,礼帽运算后,就只剩下“毛刺”了。

#礼帽
img = cv2.imread('dige.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)#cv2.MORPH_TOPHAT礼帽
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

黑帽

黑帽 = 闭运算-原始输入。
按上面的例子,闭运算后边界可能比原图膨胀一点点,那么减去原始图像,可能就只剩下一点点边界。

#黑帽
img = cv2.imread('dige.png')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)#cv2.MORPH_BLACKHAT黑帽
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

Opencv3基础操作3——图像形态学处理相关推荐

  1. 【opencv】(1) 基础操作:图像视频读取、图像截取、颜色通道

    主要内容有:图像及视频的读取和保存.图像显示.转换灰度图.图像截取.颜色通道提取和组合 那我们开始吧. 1. 图像操作 首先我们导入opencv库,彩色图像一般都是由RGB(红绿蓝)三颜色通道构成,灰 ...

  2. 图像处理合集:图像基础操作(图像翻转、图像锐化、图像平滑等)、图像阈值分割(边缘检测、迭代法、OSTU、区域增长法等)、图像特征提取(图像分割、灰度共生矩阵、PCA图像压缩)

    文章目录 说明 一.图像锐化或增强相关 1. 图像点处理 1.1 图像翻转 1.2 幂运算和对数运算 2. 直方图处理 3. 图像平滑 4. 图像锐化 5. 图像增强 二.图像阈值分割 1. 边缘检测 ...

  3. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

  4. OpenCV3学习(4.3)——图像形态学(膨胀,腐蚀)

    在图像处理技术中,有一些的操作会对图像的形态发生改变,这些操作一般称之为形态学操作(phology).数学形态学是基于集合论的图像处理方法,最早出现在生物学的形态与结构中,图像处理中的形态学操作用于图 ...

  5. 2020.11.01 使用OpenCV进行图像形态学操作(开、闭、梯度)【OpenCV C++】

    进行基础的图像形态学操作练习 (开操作.闭操作.梯度.顶帽.黑帽操作) 源代码: // #include <opencv2/opencv.hpp> #include <iostrea ...

  6. OpenCV中图像形态学操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:视学算法 图像形态学是图像处理的分支学科,在二值图像处理 ...

  7. 图像形态学概要-腐蚀、膨胀、开运算、闭运算、形态学梯度(形态学边缘提取)、顶帽操作、黑帽操作

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像形态学中两种最基本的操作就是对图形的腐蚀和膨 ...

  8. 【Matlab 图像】图像基础操作

    图像基础操作 读取图片 读取视频 读取图片 % 读取图像 Img = imread('test2.png'); subplot(2,2,1); imshow(Img); title('原图(RGB图) ...

  9. Matlab图像形态学处理—开操作和闭操作

    昨晚分享了图像形态学处理-开操作和闭操作的基本原理,同时基于Python的OpenCV实现了对应的图像处理,本文分享一下基于Matlab的图像形态学处理-开操作和闭操作. 传送门:Python Ope ...

最新文章

  1. 北斗导航 | GPS原理与接收机设计——青冥剑(金码、C/A码、P码)
  2. CAN 总线 之六 BOSCH CAN 比特位填充(编码规则)、归零编码(RZ)和不归零编码(NRZ)
  3. Hive的两种操作模式
  4. jsp servlet示例_Servlet和JSP中的文件上传示例
  5. android中有哪些utils的作用,AndroidUtils
  6. 生成验证码的一段源代码
  7. 静态路由和DHCP/NAT/VLAN的配置实例
  8. mysql spool csv报错_Oracle使用spool快速导出超大表
  9. 统计学考试带计算机,统计学试题
  10. python2.7详细安装教程_python2.7安装图文教程
  11. 虚拟机安装win7的ghost镜像系统
  12. 2018年12月份计算机,CPU天梯图2018年12月最新版 十二月台式电脑CPU性能排行
  13. 利用uncode-schedule(冶卫军)构建分布式任务调度
  14. python调用高德地图地理编码/逆地理编码
  15. python学习笔记02-分支循环(图灵学院视频笔记)
  16. 076 对称区间的定积分性质
  17. sketchup 图片转模型_SketchUp插件:位图转模型使用技巧
  18. 在Linux下安装chrome浏览器(Ubuntu)
  19. 天天特惠系统秒杀优化方案
  20. 推荐几个黑白照片上色软件给大家

热门文章

  1. linux 查看java版本
  2. 微信小程序:升级版手机检测微信工具小程序源码
  3. 计算机硬件的共享,网心云计算机硬件共享app
  4. Java计算机毕业设计糖果销售管理系统源码+系统+数据库+lw文档
  5. 计算机一级考试可以搜索吗,手动找回Windows7搜索功能
  6. mysql的to char data_数据库中的to char
  7. # D - Staircase Sequences
  8. table表格锁定任意数量列或行
  9. Java 使用redis 设计一个每天重新开始计数的计数器
  10. 基于MATLAB/Simulink的电力电子电路仿真技术——三相电流滞环跟踪逆变器