IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> opencv常用的形态学操作 -> 正文阅读

[人工智能]opencv常用的形态学操作

导读

在使用opencv做图像处理的时候,我们经常会需要用到一些基础的图像形态学操作腐蚀膨胀。通过这些基本的形态学操作我们可以实现去噪以及图像的切割等。

形态学变换是基于图像形状的基础变换,它只能在二值图像上做处理。形态学操作需要两个输入,输入图像structuring elementkernelstructuring elementkernel决定我们做何种形态学处理的操作。腐蚀膨胀是形态学处理的基础操作,而开运算闭运算是基于腐蚀膨胀的变种操作。下面我们就介绍一下如何在实际中应用这些操作

注意:在做图像的形态学处理的时候,需要对图像做二值化,且需要将处理的像素值改为255,因为图像的形态学处理操作都是基于白色像素上处理的。
在这里插入图片描述
后面我们基于上面这张图片来做处理

腐蚀

import cv2
import numpy as np
import matplotlib.pyplot as plt

img_path = "img/demo.jpg"
#读取图片
img = cv2.imread(img_path)
#将图片转为灰度图
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#二值化图片,这里需要注意的时候我们需要选择THRESH_BINARY_INV模式
_,binary_img = cv2.threshold(gray_img,128,255,cv2.THRESH_BINARY_INV)

#定义腐蚀操作的kernel
erode_kernel = np.ones((3,3),np.uint8)
erode_img =cv2.erode(binary_img,erode_kernel)

plt.figure()
plt.subplot(1,2,1)
plt.imshow(cv2.cvtColor(binary_img,cv2.COLOR_BGR2RGB))
plt.title("binary_img")
plt.subplot(1,2,2)
plt.imshow(cv2.cvtColor(erode_img,cv2.COLOR_BGR2RGB))
plt.title("erode_img")
plt.show()

在这里插入图片描述
通过上面图片的腐蚀操作可以发现,白色的文字都完全被侵蚀了,除此之外我们还发现图片右下角白色区域周围的白色噪点也被侵蚀了。

下面我们来分析一下图像的腐蚀操作究竟发生了什么,下面我们看看这个例子

binary_img = np.array([ [0, 0, 0, 0, 0],
                        [0,255,255,255,0],
                        [0,255,255,255,0],
                        [0,255,255,255,0],
                        [0, 0, 0, 0, 0]],np.uint8)
erode_kernel = np.ones((3,3),np.uint8)
erode_img =cv2.erode(binary_img,erode_kernel)
print(erode_img)
"""
[[  0   0   0   0   0]
 [  0   0   0   0   0]
 [  0   0 255   0   0]
 [  0   0   0   0   0]
 [  0   0   0   0   0]]
"""

通过上面的例子发现,经过3x3的kernel之后,最终只保留了中心的255像素,周边的255都变成了0。在进行腐蚀操作的时候,就是通过kernel大小的卷积在原图像上滑动,只有当kernel范围内的像素全为255时输出才为255,否则输出为0,所以kernel越大最终白色像素保留的会越少。

膨胀

#定义膨胀操作的kernel
dilate_kernel = np.ones((3,3),np.uint8)
dilate_img =cv2.dilate(binary_img,dilate_kernel)

plt.figure()
plt.subplot(1,2,1)
plt.imshow(cv2.cvtColor(binary_img,cv2.COLOR_BGR2RGB))
plt.title("binary_img")
plt.subplot(1,2,2)
plt.imshow(cv2.cvtColor(dilate_img,cv2.COLOR_BGR2RGB))
plt.title("dilate_img")
plt.show()

在这里插入图片描述
图像经过膨胀之后,白色像素的范围变大了。在做膨胀的时候,只要当kernel范围内的像素有255时输出就为255,只有kernel范围内全为0时才输出0

开闭运算

开运算其实就是先通过腐蚀操作后面再进行膨胀,闭运算和开运算恰好相反先通过膨胀操作后面再进行腐蚀

#定义kernel
kernel = np.ones((3,3),np.uint8)
#开运算
open_img =cv2.morphologyEx(binary_img,cv2.MORPH_OPEN,kernel)
#闭运算
close_img = cv2.morphologyEx(binary_img,cv2.MORPH_CLOSE,kernel)

在这里插入图片描述
通过结合腐蚀膨胀运算我们可以去除图像上的白色噪点

梯度运算

梯度运算等价于膨胀运算-腐蚀运算

#定义kernel
kernel = np.ones((3,3),np.uint8)
gradient_img = cv2.morphologyEx(binary_img,cv2.MORPH_GRADIENT,kernel)

在这里插入图片描述
梯度运算主要是用来保留图像的轮廓

Top Hat和Black Hat运算

Top Hat运算等价于原始图像 - 开运算,Black Hat运算等价于闭运算 - 原始图像

#定义kernel
kernel = np.ones((3,3),np.uint8)
tophat_img = cv2.morphologyEx(binary_img,cv2.MORPH_TOPHAT,kernel)
blackhat_img = cv2.morphologyEx(binary_img,cv2.MORPH_BLACKHAT,kernel)

在这里插入图片描述

Structuring Element

前面我们使用的都是方形的kernel,除此之外我们也可以使用矩形的kernel来实现我们的目的,例如在做文本的行分割时,我们需要将文字的行连在一起以检测出文本行的位置,此时我们就可以采用矩形的kernel来达到我们的目的。
opencv库还提供了椭圆的kernel以及圆形的kernel

#椭圆形的kernel
ellipse_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
print(ellipse_kernel)
"""
[[0 0 1 0 0]
 [1 1 1 1 1]
 [1 1 1 1 1]
 [1 1 1 1 1]
 [0 0 1 0 0]]
"""
#圆形kernel
cross_kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
print(cross_kernel)
"""
[[0 0 1 0 0]
 [0 0 1 0 0]
 [1 1 1 1 1]
 [0 0 1 0 0]
 [0 0 1 0 0]]
"""
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-12-08 13:48:54  更:2021-12-08 13:49:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 1:40:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码