需要的库和自定义函数

import cv2
import numpy as np
import matplotlib.pyplot as pltdef cv_show(name, mat):cv2.imshow(name, mat)cv2.waitKey(0)cv2.destroyAllWindows()

图像形态学操作最基本的两个处理:腐蚀和膨胀

一、腐蚀操作——erode

对图片外围进行销蚀处理,让图像变“瘦”。可用于处理图像中的毛刺。

###        函数原型
void cv::erode  ( InputArray  src,OutputArray   dst,InputArray      kernel,Point    anchor = Point(-1,-1),int      iterations = 1,int     borderType = BORDER_CONSTANT,const Scalar &    borderValue = morphologyDefaultBorderValue() )
###        在python中使用
dst = cv2.erode(src, kernel, dst, anchor, iterations, borderType, borderValue)
src 原图像,通道数可以是任意的。但深度须是CV_8U, CV_16U, CV_16S, CV_32F , CV_64F其中的一种
dst 处理后的图像,大小类型须和原图像相同
kernel 参考的像素点范围(a, b)
anchor position of the anchor within the element; default value (-1, -1) means that the anchor is at the element center.
iterations 迭代次数
borderType 像素外推方法
borderValue 边界值(在边界为常量的情况下)

注意:kernel可以用numpy的ones方法创建

anchor参数、borderType参数和boarderValue参数一般使用缺省

loardImg = 'C://Users//rwhite//Pictures//opencv//testt.jpg'img = cv2.imread(loardImg)
#cv_show('before', img)kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations=2)
#cv_show('after', erosion)cv2.imwrite('C://Users//rwhite//Pictures//opencv//after.jpg', erosion)

二、膨胀操作——dilate

对图片外围进行膨胀处理,让图像变“胖”。可用于突出图像的某些特征,更容易识别。

###        函数原型
void cv::dilate (InputArray     src,OutputArray     dst,InputArray      kernel,Point    anchor = Point(-1,-1),int      iterations = 1,int     borderType = BORDER_CONSTANT,const Scalar &  borderValue = morphologyDefaultBorderValue() )
###        在python中使用
dst = cv2.dilate(src, kernel, dst, anchor, iterations, borderType)
src 原图像,通道数可以是任意的。但深度须是CV_8U, CV_16U, CV_16S, CV_32F , CV_64F其中的一种
dst 处理后的图像,大小类型须和原图像相同
kernel 参考的像素点范围(a, b)
anchor position of the anchor within the element; default value (-1, -1) means that the anchor is at the element center.
iterations 迭代次数
borderType 像素外推方法
borderValue 边界值(在边界为常量的情况下

注意:各个参数用法与erode函数的相同

loardImg = 'C://Users//rwhite//Pictures//opencv//testt.jpg'img = cv2.imread(loardImg)
#cv_show('before', img)kernel = np.ones((5, 5), np.uint8)
dil = cv2.dilate(img, kernel, iterations=5)cv2.imwrite('C://Users//rwhite//Pictures//opencv//after.jpg', dil)
#cv_show('after', dil)

三、morphologyEx函数的使用

【开运算与闭运算、计算梯度、礼帽与黑帽】

###        函数原型
void cv::morphologyEx(InputArray  src,OutputArray   dst,int     op,InputArray  kernel,Point     anchor = Point(-1,-1),int      iterations = 1,int     borderType = BORDER_CONSTANT,const Scalar &  borderValue = morphologyDefaultBorderValue() )
###        在python中使用
dst = cv2.morphologyEx(src, op, kernel, dst, anchor, iterations, borderType, borderValue)
src 原图像,通道数可以是任意的。但深度须是CV_8U, CV_16U, CV_16S, CV_32F , CV_64F其中的一种
dst 处理后的图像,大小类型须和原图像相同
op 运算方式
kernel 参考的像素点范围(a, b)
anchor Anchor position with the kernel. Negative values mean that the anchor is at the kernel center.
iterations 迭代次数
borderType 像素外推方法
borderValue 边界值(在边界为常量的情况下

注意:其中op参数用于指定运算方式,可选值如下:

cv2.MORPH_ERODE

膨胀操作

cv2.MORPH_DILATE

腐蚀操作

cv2.MORPH_OPEN

开运算

cv2.MORPH_CLOSE

闭运算

cv2.MORPH_GRADIENT

计算图像梯度

cv2.MORPH_TOPHAT

礼帽运算

cv2.MORPH_BLACKHAT

黑帽运算

cv2.MORPH_HITMISS

"hit or miss" .- Only supported for CV_8UC1 binary images. A tutorial can be found in the documentation

1.开运算与闭运算

开运算先对图像进行腐蚀操作后进行膨胀操作;而闭运算相反,先膨胀在腐蚀。

        开运算:先腐蚀会增加黑点的数量,抹去较小的白点;再进行膨胀操作将黑点变回原样,这样会使被抹去的区域消失。我们在移除小的对象时候很有用(假设物品是亮色,前景色是黑色),被用来去除噪声。

        闭运算:先膨胀将白色部分变大,此时小的黑色区域会被挤掉,然后腐蚀再将一些大的黑色的部分还原回来,整体得到的效果就是:抹去前景物体上的小黑点。通常是用来填充前景物体中的小洞,或者抹去前景物体上的小黑点

img = cv2.imread('C://Users//rwhite//Pictures//opencv//testtt.jpg', cv2.IMREAD_GRAYSCALE)kernel = np.ones((7, 7), np.uint8)
close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
open  = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

2.梯度运算

膨胀后的图像减去腐蚀后的图像,得到一个图像的轮廓。这个操作就是梯度运算。

img = cv2.imread('C://Users//rwhite//Pictures//opencv//test.jpg', cv2.IMREAD_GRAYSCALE)kernel = np.ones((7, 7), np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)cv2.imwrite('C://Users//rwhite//Pictures//opencv//gradient.jpg', gradient)

3.礼帽与黑帽

礼帽 = 原始输入 - 开运算结果

即礼帽运算可以得到开运算操作中处理掉的毛刺

黑帽=闭运算结果 - 原始输入

即黑帽运算可以得到原始输入中图像的大致轮廓

Opencv学习笔记四——图像形态学操作相关推荐

  1. (_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用

    1.腐蚀 概述:腐蚀掉图像的细节.若图像有很多毛刺,通过腐蚀操作,可以将毛刺消除. 下面所说的"值"可以简单理解为RGB三个通道[0,255],值越小,亮度越低,值越大,亮度越高. ...

  2. OpenCV学习笔记四-image的一些整体操作

    title: OpenCV学习笔记四-image的一些整体操作 categories: 编程 date: 2019-08-08 12:50:47 tags: OpenCV image的一些操作 sP4 ...

  3. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  4. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  5. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  6. OpenCV学习笔记之图像融合

    一.线性融合操作 线性混合操作 也是一种典型的二元(两个输入)的 像素操作 : 通过在范围  内改变  ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果 ...

  7. 图像的像素原点_超火的机器视觉OpenCVSharp学习笔记3——图像形态学处理

    一. 图像形态学处理的概念 在机器视觉中,我们获得一张图片首先要进行预处理,去掉噪声等杂乱的地方,突出我们感兴趣的区域,数字图像处理中的形态学处理是指将数字形态学作为工具从图像中提取对于表达和描绘区域 ...

  8. 2.2 获取图像感兴趣区域_超火的机器视觉OpenCVSharp学习笔记3——图像形态学处理...

    一. 图像形态学处理的概念 在机器视觉中,我们获得一张图片首先要进行预处理,去掉噪声等杂乱的地方,突出我们感兴趣的区域,数字图像处理中的形态学处理是指将数字形态学作为工具从图像中提取对于表达和描绘区域 ...

  9. OpenCV学习笔记(七)——图像梯度及边缘检测

    图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...

最新文章

  1. Android自定义View —— TypedArray
  2. 二叉搜索树-创建最小高度树(递归)
  3. OpenCV图像处理—— 凸包检测
  4. python中time模块详解_Python time模块详解
  5. 常见的保险种类,险种分类介绍
  6. 69. x 的平方根 golang
  7. 如何知道mysql的地址_如何知道自己的计算机上mysql的地址?
  8. 常用JavaScript函数 1 - 15 (自我总结)
  9. macOS卸载Java9及利用Homebrew搭建并配置Java开发环境
  10. C#LeetCode刷题之#53-最大子序和(Maximum Subarray)
  11. 2021辽宁高考成绩查询公布,2021辽宁高考成绩什么时候出
  12. executeQuery()方法
  13. 网上图书商城项目学习笔记-034订单管理
  14. PhotoShop大师之路视频
  15. matlab 峰值提取,Matlab2019b信号峰值检测与提取
  16. Cortex-M的M0,M+,M3,M4,M7几种内核的简单区别
  17. mysql中的事务和锁_MySQL中的事务和锁
  18. matlab计算纹波电压,如何估算开关电源纹波电压?
  19. 【零基础跑项目】20代码教你基于opencv的人脸检测
  20. IDL是什么呢???

热门文章

  1. 多媒体实验 Visual Studio 图像显示与处理 对图像进行二值化、求边缘、增强等处理
  2. 李航统计学习方法 Chapter2 感知机
  3. 一行代码搞定 H5首页弹出活动宣传弹窗
  4. 百度离线地图示例之十三:动态运行轨迹实现(附源码)
  5. 【VBA报错1】--vba代码运行时错误1004 应用程序定义或对象定义错误
  6. mysql对网站seo的作用_友情链接对于网站SEO的作用有哪些
  7. Ponds(拓扑 + 优先队列)
  8. SDF文件【简要说明】
  9. Redis中ZSet的底层数据结构跳跃表skiplist,你真的了解吗?
  10. 以太网包的格式 --转