OpenCv之图像形态学

目录

一、形态学

二、图像全局二值化

三、自适应阈值二值化

四、腐蚀操作

五、获取形态学卷积核

六、膨胀操作

七、开运算

八、闭运算


一、形态学

定义:

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

二、图像全局二值化

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

参照函数:

案例代码如下:

python 复制代码
import cv2
import numpy as  np


# 导入图片
img = cv2.imread('6.jpg')

# 二值化是对灰度图像操作
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 注意,threshold会返回两个值(一个是阈值,一个是二值化处理后的图片)
thresh,dst = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)

# 展示
cv2.imshow('dog',np.hstack((gray,dst)))

# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()

三、自适应阈值二值化

前提:

在前面的部分我们使用是全局闻值,整幅图像采用同一个数作为闻值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应闻值。此时的闻值是根据图像上的每一个小区域计算与其对应的闻值。因此在同一幅图像上的不同区域采用的是不同的闻值,从而使我们能在亮度不同的情况下得到更好的结果

案例代码如下:

python 复制代码
import cv2
import numpy as np

img = cv2.imread('6.jpg')


cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.resizeWindow('img',1920,1080)

# 二值化操作是对灰度图像操作,把图像转为灰度图像
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 自适应阈值二值化只返回一个值,即二值化后的结果
dst = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,3,0)

# 展示
cv2.imshow('img',np.hstack((gray,dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()

四、腐蚀操作

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

腐蚀操作API:

案例代码如下:

python 复制代码
import cv2
import numpy as np

# 导入图片
img = cv2.imread('6.jpg')

# 定义核
kernel = np.ones((3,3),np.uint8)
dst = cv2.erode(img,kernel,iterations=2)

cv2.imshow('img',np.hstack((img,dst)))

cv2.waitKey(0)
cv2.destroyWindow()

五、获取形态学卷积核

OpenCv提供了获取卷积核的API,不需要我们手工创建卷积核

案例代码如下:

python 复制代码
import cv2
import numpy as np


img = cv2.imread('6.jpg')

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

# 腐蚀
dst = cv2.erode(img,kernel,iterations=2)

六、膨胀操作

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

案例代码如下:

python 复制代码
import cv2
import numpy as np

# 导入图片
img = cv2.imread('6.jpg')

# 动态获取卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

# 膨胀操作
dst = cv2.dilate(img,kernel,iterations=1)

# 展示图片
cv2.imshow('img',np.hstack((img,dst)))

# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()

七、开运算

开运算=腐蚀+膨胀

案例代码如下:

python 复制代码
import cv2
import numpy as np

# 开运算=腐蚀+膨胀
# 开运算提供了另一种去除噪声的思路
img = cv2.imread('6.jpg')

kernel = cv2.cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

# # 先腐蚀
# dst = cv2.erode(img,kernel,iterations=2)
#
# # 膨胀
# dst = cv2.dilate(dst,kernel,iterations=2)

# 直接调用OpenCv提供的开运算API
dst = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel,iterations=2)

# 展示图片
cv2.imshow('img',np.hstack((img,dst)))

# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下:

八、闭运算

闭运算=膨胀+腐蚀

案例代码如下:

python 复制代码
import cv2
import numpy as np

# 导入图片
img = cv2.imread('6.jpg')

# 卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

# 闭运算
dst = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel,iterations=2)

# 展示图片
cv2.imshow('img',np.hstack((img,dst)))

# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()
相关推荐
jndingxin32 分钟前
OpenCV相机标定与3D重建(26)计算两个二维点集之间的部分仿射变换矩阵(2x3)函数 estimateAffinePartial2D()的使用
opencv·3d
学术头条3 小时前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
18号房客3 小时前
一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的分类
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·sklearn
游客5203 小时前
opencv中的常用的100个API
图像处理·人工智能·python·opencv·计算机视觉
Ven%3 小时前
如何在防火墙上指定ip访问服务器上任何端口呢
linux·服务器·网络·深度学习·tcp/ip
IT猿手3 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·深度学习·算法·机器学习·matlab·多目标算法
强哥之神4 小时前
Nexa AI发布OmniAudio-2.6B:一款快速的音频语言模型,专为边缘部署设计
人工智能·深度学习·机器学习·语言模型·自然语言处理·音视频·openai
18号房客4 小时前
一个简单的深度学习模型例程,使用Keras(基于TensorFlow)构建一个卷积神经网络(CNN)来分类MNIST手写数字数据集。
人工智能·深度学习·机器学习·生成对抗网络·语言模型·自然语言处理·tensorflow
神秘的土鸡4 小时前
神经网络图像隐写术:用AI隐藏信息的艺术
人工智能·深度学习·神经网络
数据分析能量站4 小时前
神经网络-LeNet
人工智能·深度学习·神经网络·机器学习