【形态学变换】——图像预处理(OpenCV)

目录

[1 核](#1 核)

[2 腐蚀](#2 腐蚀)

[3 膨胀](#3 膨胀)

[4 开运算](#4 开运算)

[5 闭运算](#5 闭运算)

[6 礼帽运算](#6 礼帽运算)

[7 黑帽运算](#7 黑帽运算)

[8 形态学梯度](#8 形态学梯度)


形态学变换是一种基于形状的简单变换,处理对象是二值化后的图像。有两个输入:原图像和核,一个输出:形态学变换后的图像。基本操作有以下四种。

1 核

核就是一个小区域,通常为3*3、5*5、7*7大小,比如矩形结构、椭圆结构、十字形结构,如下图所示:

2 腐蚀

核在原图(二值化后的图像)上进行从上到下,从左到右的滑动。**在滑动过程中,令核值为1的区域与该被核覆盖的对应区域进行相乘,得到最小值,就是卷积核覆盖区域中心像素点的新像素值。**简单记忆就是只要被覆盖区域有黑色(像素值为0),那么该区域的中心像素值必定为黑色。经过腐蚀之后变"瘦"了。

通过这样的遍历方式,腐蚀操作能够逐步收缩目标物体边界,消除孤立的噪声像素以及细化连续的前景区域。

总结:二值图腐蚀后白色像素(非0)变少了

案例:

python 复制代码
import cv2 as cv
import numpy as np

long = cv.imread("./images/long.png")
# 定义一个5x5的卷积核
kernel = np.ones((5,5),np.uint8)
# print(kernel)
# 腐蚀操作:cv2.erode(img,kernel,iterations=1)iterations:迭代次数,默认值为1
dst_erode = cv.erode(long,kernel=kernel,iterations=1)
cv.imshow("long",long)
cv.imshow("dst_erode",dst_erode)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

3 膨胀

核在滑动过程中,令核值为1的区域与被覆盖的对应区域进行相乘,得到最大值就是被覆盖区域中心像素点的新像素值。简单记忆就是,只要有白色(像素值为255),那么区域的中心像素点必为白色(255)。经过膨胀之后变"胖"了。

膨胀能逐步扩大物体的边界,连接断裂的前景部分,并填充内部空洞,使物体轮廓更加明显且连续。

总结:二值化膨胀后白色像素变多了。

案例:

python 复制代码
import cv2 as cv
import numpy as np

long = cv.imread("./images/long.png")
# 定义一个5x5的卷积核
kernel = np.ones((5,5),np.uint8)
# print(kernel)
# 膨胀操作:cv2.dilate(img,kernel,iterations)
dst_dilate = cv.dilate(long,kernel=kernel,iterations=2)
cv.imshow("long",long)
cv.imshow("dst_dilate",dst_dilate)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

4 开运算

先腐蚀后膨胀 ,作用:分离物体,消除小区域。特点:消除噪声,去除小的干扰块,而不影响原来的图像

案例:

python 复制代码
import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定义一个5x5的卷积核
kernel = np.ones((5,5),np.uint8)
# 开运算(先腐蚀,后膨胀)
opening = cv.morphologyEx(car,cv.MORPH_OPEN,kernel)
cv.imshow("car",car)
cv.imshow("opening",opening)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

5 闭运算

先膨胀后腐蚀,作用:消除/闭合物体里面的孔洞。特点:可以填充闭合区域。

案例:

python 复制代码
import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定义一个5x5的卷积核
kernel = np.ones((5,5),np.uint8)
# 闭运算(先膨胀,后腐蚀)
closing = cv.morphologyEx(car,cv.MORPH_CLOSE,kernel)
cv.imshow("car",car)
cv.imshow("closing",closing)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

6 礼帽运算

原图像与开运算结果图之差。作用:用来分离比邻近点亮一些的斑块。

案例:

python 复制代码
import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定义一个5x5的卷积核
kernel = np.ones((5,5),np.uint8)
# 礼帽运算(原图和开运算的差):cv.morphologyEx(img,cv.MORPH_TOPHAT,kernel)
tophat = cv.morphologyEx(car,cv.MORPH_TOPHAT,kernel)
cv.imshow("car",car)
cv.imshow("tophat",tophat)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

7 黑帽运算

原图与"闭运算"的结果图只差。作用:用来分离比邻近点暗一些的斑块。

案例:

python 复制代码
import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定义一个5x5的卷积核
kernel = np.ones((5,5),np.uint8)
# 黑帽运算(闭运算和原图之间的差):cv.morphologyEx(img,cv.MORPH_BLACKHAT,kernel)
blackhat = cv.morphologyEx(car,cv.MORPH_BLACKHAT,kernel)
cv.imshow("car",car)
cv.imshow("blackhat",blackhat)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

8 形态学梯度

形态学梯度是一个基于结构元素的图像处理方法,它通过比较原图像与膨胀图和腐蚀图之间的差异来突出图像边缘特征。 对于图像中的每个像素点,其形态学梯度值是该像素点在膨胀后的图像值与其在腐蚀后的图像值之差

作用:强化图像的边缘信息,并且对噪声有一定的抑制作用

案例:

python 复制代码
import cv2 as cv
import numpy as np
car = cv.imread("./images/car.png")
_,car =cv.threshold(car,127,255,cv.THRESH_BINARY_INV)
# 定义一个5x5的卷积核
kernel = np.ones((5,5),np.uint8)
# 形态学梯度(膨胀和腐蚀的差):cv.morphologyEx(img,cv.MORPH_GRADIENT,kernel)
gradient = cv.morphologyEx(car,cv.MORPH_GRADIENT,kernel)
cv.imshow("car",car)
cv.imshow("gradient",gradient)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

相关推荐
库库8391 天前
Spring AI 知识点总结
java·人工智能·spring
AndrewHZ1 天前
【图像处理基石】通过立体视觉重建建筑高度:原理、实操与代码实现
图像处理·人工智能·计算机视觉·智慧城市·三维重建·立体视觉·1024程序员节
Theodore_10221 天前
深度学习(3)神经网络
人工智能·深度学习·神经网络·算法·机器学习·计算机视觉
文火冰糖的硅基工坊1 天前
[人工智能-大模型-70]:模型层技术 - 从数据中自动学习一个有用的数学函数的全过程,AI函数计算三大件:神经网络、损失函数、优化器
人工智能·深度学习·神经网络
我叫张土豆1 天前
Neo4j 版本选型与 Java 技术栈深度解析:Spring Data Neo4j vs Java Driver,如何抉择?
java·人工智能·spring·neo4j
IT_陈寒1 天前
Vue3性能提升30%的秘密:5个90%开发者不知道的组合式API优化技巧
前端·人工智能·后端
on_pluto_1 天前
【基础复习1】ROC 与 AUC:逻辑回归二分类例子
人工智能·机器学习·职场和发展·学习方法·1024程序员节
渲吧云渲染1 天前
SaaS模式重构工业软件竞争规则,助力中小企业快速实现数字化转型
大数据·人工智能·sass
算家云1 天前
DeepSeek-OCR本地部署教程:DeepSeek突破性开创上下文光学压缩,10倍效率重构文本处理范式
人工智能·计算机视觉·算家云·模型部署教程·镜像社区·deepseek-ocr