【OpenCV图像处理7】形态学

简介: 【OpenCV图像处理7】形态学

七、形态学

1、形态学概述

什么是形态学?

  • 指一系列处理图像形状特征的图像处理技术。
  • 形态学的基本思想是:利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图像中的相应形状或特征,以便进一步进行图像分析和目标识别。
  • 这些处理方法基本是对二进制图像进行处理,即黑白图像。
  • 卷积核决定着图像处理后的效果。
  • 形态学常用的基本操作有:
  • 膨胀和腐蚀
  • 开运算
  • 闭运算
  • 顶帽
  • 黑帽

2、图像全局二值化

二值化:将图像中的每个像素变成两种值,比如0,255

threshold()用法:

cv2.threshold(src, thresh, maxval, type, dst)

参数说明:

  • src:最好是灰度图
  • thresh:阈值
  • maxval:最大值(不一定是255)
  • type:操作类型,常见的操作类型如下:

代码实现:

import cv2
import numpy as np
img = cv2.imread('../resource/dog_1.bmp')
# 二值化对灰度图像操作
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# threshold() 返回两个值 一个是阈值 一个是处理后图像
ret, dst = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('dog', np.hstack((gray, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

3、自适应阈值二值化

在前面的部分我们使用的是全局阈值,整幅图像采用同一个数作为阈值。但是这种方法并不适用于所有情况,尤其是当同一幅图像上的不同部分具有不同亮度时。

这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算出与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。

adaptiveThreshold()用法:

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst)

参数说明:

  • adaptiveMethod:指定计算阈值的方法
  • cv2.ADAPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阈值取自相邻区域的加权和,权重为一个高斯窗口。
  • blockSize:邻域大小(用来计算阈值的区域大小)
  • C:常数,阈值就等于平均值或者加权平均值减去这个常数

代码实现:

import cv2
import numpy as np
img = cv2.imread('../resource/dog_1.bmp')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 自适应阈值二值化,只有一个返回值
dst = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 0)
cv2.imshow('dog', np.hstack((gray, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

4、腐蚀操作

腐蚀操作也是用卷积核扫描图像,只不过腐蚀操作的卷积核一般都是1,如果卷积核内所有像素点都是白色,那么锚点即为白色。

大部分时候,腐蚀操作使用的都是全为1的卷积核。

erode()用法:

cv2.erode(src, kernel, dst, anchor, iterations, borderType, borderValue)

参数说明:

  • iterations:腐蚀操作的迭代次数,次数越多,腐蚀操作执行的次数越多,腐蚀效果越明显。

代码实现:

import cv2
import numpy as np
img = cv2.imread('../resource/paint.png')
kernel = np.ones((3, 3), np.uint8)
dst = cv2.erode(img, kernel, iterations=1)
cv2.imshow('OpenCV', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

5、获取形态学卷积核

OpenCV提供了获取卷积核的API,不需要我们手动创建卷积核。

getStructuringElement()用法:

cv2.getStructuringElement(shape, ksize, anchor)

参数说明:

  • shape:卷积核的形状,注意不是指长宽,而是指卷积核中1形成的形状。
  • MORPH_RECT:卷积核中的1是矩形(常用)
  • MORPH_ELLIPSE:椭圆
  • MORPH_CROSS:十字

代码实现:

import cv2
import numpy as np
img = cv2.imread('../resource/paint_1.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
dst = cv2.erode(img, kernel, iterations=2)
cv2.imshow('dog', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

6、膨胀操作

膨胀是腐蚀的相反操作,基本原理:只要保证卷积核的锚点是非0值,周边无论是0还是非0值,都变成非0值。

代码实现:

import cv2
import numpy as np
img = cv2.imread('../resource/paint_1.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
dst = cv2.dilate(img, kernel, iterations=2)
cv2.imshow('dog', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

7、腐蚀 and 膨胀

import cv2
import numpy as np
img = cv2.imread('../resource/paint.png')
# 定义卷积核
kernel = np.ones((5, 5), np.uint8)
# 腐蚀
dst = cv2.erode(img, kernel, iterations=1)
# 膨胀
dst = cv2.dilate(dst, kernel, iterations=1)
cv2.imshow('OpenCV', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

8、开运算

开运算和闭运算都是腐蚀和膨胀的基本应用。

开运算 = 腐蚀 + 膨胀

morphologyEx()用法:

cv2.morphologyEx(src, op, kernel, dst, anchor, iterations, borderType, borderValue)

参数说明:

  • op:表示形态学的开运算(MORPH_OPEN)。
  • kernel:如果噪点比较多,会选择大一点的kernel;反之选择小一点的kernel。

代码实现:

import cv2
import numpy as np
img = cv2.imread('../resource/paint.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# 腐蚀
# dst = cv2.erode(img, kernel, iterations=1)
# 膨胀
# dst = cv2.dilate(dst, kernel, iterations=1)
dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations=1)
cv2.imshow('OpenCV', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

9、闭运算

闭运算 = 膨胀 + 腐蚀

morphologyEx()用法:

cv2.morphologyEx(src, op, kernel, dst, anchor, iterations, borderType, borderValue)

参数说明:

  • op:表示形态学的闭运算(MORPH_CLOSE)。

代码实现:

import cv2
import numpy as np
img = cv2.imread('../resource/paint_2.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations=2)
cv2.imshow('OpenCV', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

10、形态学梯度

cv2.MORPH_GRADIENT

梯度 = 原图 - 腐蚀

腐蚀之后原图像边缘变小了,原图 - 腐蚀 就可以得到腐蚀掉的部分,即边缘。

代码实现:

import cv2
import numpy as np
img = cv2.imread('../resource/paint_1.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel, iterations=1)
cv2.imshow('OpenCV', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

11、顶帽操作

cv2.MORPH_TOPHAT

顶帽 = 原图 - 开运算

开运算的效果是去除图像外的噪点,原图 - 开运算 就得到了去掉的噪点。

代码实现:

import cv2
import numpy as np
img = cv2.imread('../resource/paint.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel, iterations=1)
cv2.imshow('OpenCV', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

12、黑帽操作

cv2.MORPH_BLACKHAT

黑帽 = 原图 - 闭运算

闭运算可以将图像内部的噪点去除,那么原图 - 闭运算 的结果就是图像内部的噪点。

代码实现:

import cv2
import numpy as np
img = cv2.imread('../resource/paint_2.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, iterations=1)
cv2.imshow('OpenCV', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

内部的噪点去除,那么原图 - 闭运算 的结果就是图像内部的噪点。

代码实现:

import cv2
import numpy as np
img = cv2.imread('../resource/paint_2.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, iterations=1)
cv2.imshow('OpenCV', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

目录
相关文章
|
3月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
151 7
|
7月前
|
openCL 开发工具 C语言
OpenCV 图像处理学习手册:6~7
OpenCV 图像处理学习手册:6~7
160 0
|
7月前
|
存储 编解码 算法
OpenCV 图像处理学习手册:1~5
OpenCV 图像处理学习手册:1~5
93 0
|
7月前
|
计算机视觉 Python
OpenCV形态学运算中梯度运算、顶帽、黑帽运算讲解与实战应用(附Python源码)
OpenCV形态学运算中梯度运算、顶帽、黑帽运算讲解与实战应用(附Python源码)
212 0
|
7月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
113 0
|
2月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
111 2
WK
|
4月前
|
计算机视觉 Python
如何使用OpenCV进行基本图像处理
使用OpenCV进行基本图像处理包括安装OpenCV,读取与显示图像,转换图像颜色空间(如从BGR到RGB),调整图像大小,裁剪特定区域,旋转图像,以及应用图像滤镜如高斯模糊等效果。这些基础操作是进行更复杂图像处理任务的前提。OpenCV还支持特征检测、图像分割及对象识别等高级功能。
WK
57 4
|
5月前
|
存储 计算机视觉
OpenCv形态学(一)
OpenCv形态学(一)
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
42 0
|
7月前
|
人工智能 计算机视觉 Python
【OpenCV】计算机视觉图像处理基础知识(上)
【OpenCV】计算机视觉图像处理基础知识(上)