Opencv学习笔记四——图像形态学操作
需要的库和自定义函数
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学习笔记四——图像形态学操作相关推荐
- (_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用
1.腐蚀 概述:腐蚀掉图像的细节.若图像有很多毛刺,通过腐蚀操作,可以将毛刺消除. 下面所说的"值"可以简单理解为RGB三个通道[0,255],值越小,亮度越低,值越大,亮度越高. ...
- OpenCV学习笔记四-image的一些整体操作
title: OpenCV学习笔记四-image的一些整体操作 categories: 编程 date: 2019-08-08 12:50:47 tags: OpenCV image的一些操作 sP4 ...
- C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)
C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...
- OpenCV学习笔记(九)——图像轮廓(下)
<OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...
- Opencv学习笔记(八) -- 图像色彩空间转换
1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...
- OpenCV学习笔记之图像融合
一.线性融合操作 线性混合操作 也是一种典型的二元(两个输入)的 像素操作 : 通过在范围 内改变 ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果 ...
- 图像的像素原点_超火的机器视觉OpenCVSharp学习笔记3——图像形态学处理
一. 图像形态学处理的概念 在机器视觉中,我们获得一张图片首先要进行预处理,去掉噪声等杂乱的地方,突出我们感兴趣的区域,数字图像处理中的形态学处理是指将数字形态学作为工具从图像中提取对于表达和描绘区域 ...
- 2.2 获取图像感兴趣区域_超火的机器视觉OpenCVSharp学习笔记3——图像形态学处理...
一. 图像形态学处理的概念 在机器视觉中,我们获得一张图片首先要进行预处理,去掉噪声等杂乱的地方,突出我们感兴趣的区域,数字图像处理中的形态学处理是指将数字形态学作为工具从图像中提取对于表达和描绘区域 ...
- OpenCV学习笔记(七)——图像梯度及边缘检测
图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...
最新文章
- Android自定义View —— TypedArray
- 二叉搜索树-创建最小高度树(递归)
- OpenCV图像处理—— 凸包检测
- python中time模块详解_Python time模块详解
- 常见的保险种类,险种分类介绍
- 69. x 的平方根 golang
- 如何知道mysql的地址_如何知道自己的计算机上mysql的地址?
- 常用JavaScript函数 1 - 15 (自我总结)
- macOS卸载Java9及利用Homebrew搭建并配置Java开发环境
- C#LeetCode刷题之#53-最大子序和(Maximum Subarray)
- 2021辽宁高考成绩查询公布,2021辽宁高考成绩什么时候出
- executeQuery()方法
- 网上图书商城项目学习笔记-034订单管理
- PhotoShop大师之路视频
- matlab 峰值提取,Matlab2019b信号峰值检测与提取
- Cortex-M的M0,M+,M3,M4,M7几种内核的简单区别
- mysql中的事务和锁_MySQL中的事务和锁
- matlab计算纹波电压,如何估算开关电源纹波电压?
- 【零基础跑项目】20代码教你基于opencv的人脸检测
- IDL是什么呢???