opencv-python学习笔记10-图像形态学处理

目录

一、基本概念: 

(1)结构元素(Structuring Element):

(2)膨胀(Dilation):

(3)腐蚀(Erosion):

(4)开运算(Opening)

(5)闭运算(Closing)

(6)形态学梯度(Morphological Gradient)

(7)顶帽(Top-hat)和黑帽(Black-hat)转换

(8)应用领域

 二、膨胀:

(1)基本概念:

(2)原理:

(3)方法:

(4)OpenCV中的膨胀函数:

(5)代码示例:

(6)应用领域:

(7)注意事项:

三、腐蚀:

(1)基本概念:

(2)原理:

(3)方法:

(4)OpenCV中的腐蚀函数:

(5)示例代码:

(6)应用领域:

(7)注意事项:

 四、开运算:

(1)开运算的数学定义:

(2)开运算的原理:

(3)开运算的应用:

(4)cv2.morphologyEx 函数:

函数原型:

参数:

常用的形态学操作:

(4)代码示例:

(5)注意事项:

五、闭运算: 

(1)基本原理:

(2)应用场景:

(3)OpenCV中的闭运算:

(4)注意事项:

六、 顶帽和黑帽:

(1)顶帽变换:

(2)黑帽变换:

(3)OpenCV中的实现:

(4)应用场景:

(5)注意事项:

七、膨胀-腐蚀实现形态学边缘检测:

(1)基本原理:

(2)数学表达:

(3)OpenCV中的实现:

(4)应用场景:

(5)注意事项:

 八、击中与不击中:

(1)基本原理:

(2)数学表达:

(3)OpenCV中的实现:

(4)应用场景:

(5)注意事项:

九、利用形态学运算提取水平线和垂直线:

(1)提取水平线和垂直线的原理:

(2)实现步骤:

(3)示例代码:

(4)注意事项:

 


一、基本概念: 

图像形态学是图像处理中的一种数学方法,它基于图像的形状和结构特征进行分析和处理。图像形态学的基本操作包括膨胀、腐蚀、开运算和闭运算等,这些操作通常使用结构元素来实现。

(1)结构元素(Structuring Element):

结构元素是一个小的矩阵,用于定义形态学操作的尺寸和形状。它在图像上滑动(或叫扫描),与图像的局部区域进行比较和计算。结构元素的形状可以是矩形、圆形、十字形等,大小和形状影响着形态学操作的结果。

(2)膨胀(Dilation):

膨胀操作是图像形态学中的一种基本操作,它通过将图像中的每个像素替换为其邻域(包括自身)中的最大值来实现。膨胀操作可以使图像中的物体边界向外扩展,连接邻近的物体。

(3)腐蚀(Erosion):

腐蚀操作是图像形态学中的另一种基本操作,它通过将图像中的每个像素替换为其邻域(包括自身)中的最小值来实现。腐蚀操作可以使图像中的物体边界向内收缩,分离接触的物体。

(4)开运算(Opening)

开运算是先进行腐蚀操作,再进行膨胀操作的过程。这种组合操作可以去除小的物体或细节,平滑较大物体的边界,同时不明显改变其面积。

(5)闭运算(Closing)

闭运算是先进行膨胀操作,再进行腐蚀操作的过程。这种组合操作可以填充小的孔洞或裂缝,连接邻近物体的边界。

(6)形态学梯度(Morphological Gradient)

形态学梯度是膨胀图像和腐蚀图像之差,用于突出显示物体的边界。

(7)顶帽(Top-hat)和黑帽(Black-hat)转换

顶帽转换是原始图像与开运算结果之差,用于提取小物体或细节。黑帽转换是闭运算结果与原始图像之差,用于提取大物体的暗区域。

(8)应用领域

  • 图像预处理:去噪声、平滑边界。
  • 图像分割:分离和识别图像中的不同对象。
  • 图像增强:增强图像的特定特征。
  • 特征提取:提取图像的形状和纹理信息。

 二、膨胀:

图像膨胀(Dilation)是图像形态学中的一种基本操作,它用于图像处理和计算机视觉中的图像增强、图像分割、特征提取等任务。膨胀操作的目的是增加图像中特定对象的大小,特别是对于那些较小的、分散的对象,或者用于连接邻近的对象。

(1)基本概念:

膨胀操作通过使用一个称为结构元素(structuring element)或卷积核的小矩阵来与图像进行卷积,从而实现对图像的膨胀。结构元素定义了膨胀操作的范围和形状。

(2)原理:

在膨胀过程中,结构元素会在整个图像上滑动,对于图像中的每一个像素点,如果结构元素覆盖的图像区域中至少有一个像素值满足特定条件(通常是非零或特定值),则将该像素点的值设置为最大值(在二值图像中通常是255,表示白色)。

(3)方法:

  • 标准膨胀:

    • 对于每个像素,将结构元素与其对齐,检查结构元素覆盖的图像区域。
    • 如果结构元素下的任何像素值大于零,则将中心像素的值设置为最大值。
  • 迭代膨胀:

    • 迭代地应用膨胀操作,直到达到所需的对象大小或满足特定条件。

(4)OpenCV中的膨胀函数:

在OpenCV中,可以使用cv2.dilate函数来实现图像膨胀:

dst = cv2.dilate(src, kernel, iterations=1)
  • src:输入图像。
  • kernel:结构元素,定义了膨胀的形状和大小。
  • iterations:膨胀操作的迭代次数。

(5)代码示例:

import cv2
import numpy as np# 读取图像
image = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\Coin0.jpg", cv2.IMREAD_GRAYSCALE)
# 定义结构元素
kernel = np.ones((5, 5), np.uint8)
# 应用Otsu阈值法进行二值化
retval, binary_image = cv2.threshold(image, 0, 255,cv2.THRESH_OTSU)
dst = cv2.dilate(binary_image, kernel, iterations=2)# 显示结果
cv2.imshow('Binary Image', binary_image)
cv2.imshow('swell', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

(6)应用领域:

  • 图像增强:增强图像中的特定特征,如边缘。
  • 图像分割:在图像分割过程中扩大前景区域。
  • 图像预处理:在进一步的图像分析之前改善图像质量。

(7)注意事项:

  • 结构元素的选择对膨胀效果有重要影响,应根据具体应用选择合适的结构元素大小和形状。
  • 过度膨胀可能导致对象之间的边界模糊,因此需要仔细调整膨胀的迭代次数。

 

三、腐蚀:

图像腐蚀(Erosion)是图像形态学中的另一种基本操作,与膨胀操作相反,它用于减小图像中对象的尺寸或消除对象的细小部分。腐蚀操作在图像处理和计算机视觉中用于多种应用,如去噪、细化图像中的对象、分离接触的对象等。

(1)基本概念:

腐蚀操作通过使用一个称为结构元素(structuring element)或卷积核的小矩阵来与图像进行卷积,从而实现对图像的腐蚀。结构元素定义了腐蚀操作的范围和形状。

(2)原理:

在腐蚀过程中,结构元素会在整个图像上滑动,对于图像中的每一个像素点,只有当结构元素覆盖的图像区域完全满足特定条件(通常是所有像素值都为非零或特定值)时,才将该像素点的值设置为最大值(在二值图像中通常是255,表示白色)。如果结构元素下的任何像素值不满足条件,则中心像素的值设置为最小值(在二值图像中通常是0,表示黑色)。

(3)方法:

  • 标准腐蚀:

    • 对于每个像素,将结构元素与其对齐,检查结构元素覆盖的图像区域。
    • 如果结构元素下的所有像素值都大于零,则将中心像素的值设置为最大值。
  • 迭代腐蚀:

    • 迭代地应用腐蚀操作,直到对象达到所需的大小或满足特定条件。

(4)OpenCV中的腐蚀函数:

在OpenCV中,可以使用cv2.erode函数来实现图像腐蚀:

dst = cv2.erode(src, kernel, iterations=1)
  • src:输入图像。
  • kernel:结构元素,定义了腐蚀的形状和大小。
  • iterations:腐蚀操作的迭代次数。

(5)示例代码:

import cv2
import numpy as np# 读取图像
image = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\Coin0.jpg", cv2.IMREAD_GRAYSCALE)
# 定义结构元素
kernel = np.ones((5, 5), np.uint8)
# 应用Otsu阈值法进行二值化
retval, binary_image = cv2.threshold(image, 0, 255,cv2.THRESH_OTSU)
dst = cv2.dilate(binary_image, kernel, iterations=2)
dst1 = cv2.erode(binary_image, kernel, iterations=1)
# 显示结果
cv2.imshow('Binary Image', binary_image)
cv2.imshow('swell', dst)
cv2.imshow('corrosion', dst1)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

(6)应用领域:

  • 去噪:去除图像中的小噪声点。
  • 细化:减小图像中对象的尺寸,用于对象的细化。
  • 分离对象:分离接触的对象,特别是在二值图像中。

(7)注意事项:

  • 结构元素的选择对腐蚀效果有重要影响,应根据具体应用选择合适的结构元素大小和形状。
  • 过度腐蚀可能导致对象的过度细化或丢失重要信息,因此需要仔细调整腐蚀的迭代次数。

 四、开运算:

开运算(Opening Operation)是图像形态学中的一个基本操作,它结合了腐蚀和膨胀两个步骤。开运算的目的是去除图像中的小物体、平滑较大物体的边界,同时保持其面积基本不变。开运算通常用于去除小的噪声点、断开狭窄的连接,以及平滑较大物体的边界。

(1)开运算的数学定义:

开运算可以定义为先对图像进行腐蚀,然后对腐蚀结果进行膨胀。数学上,开运算可以用以下公式表示:

其中,A 是输入图像,B 是结构元素。

(2)开运算的原理:

  • 腐蚀:腐蚀操作会缩小图像中的物体,移除小的突出部分和细小的物体。
  • 膨胀:随后的膨胀操作会尝试恢复物体的大小,但由于腐蚀已经移除了小物体和细节,这些部分不会在膨胀过程中恢复。

(3)开运算的应用:

开运算在图像处理中有多种应用,包括但不限于:

  • 去噪:去除图像中的小噪声点。
  • 平滑边界:平滑较大物体的边界,同时保持物体的基本形状。
  • 分离物体:分离接触或接近的物体。

(4)cv2.morphologyEx 函数:

cv2.morphologyEx 函数是 OpenCV 库中用于执行高级形态学操作的函数。这个函数可以执行腐蚀、膨胀、开运算、闭运算、梯度、顶帽和黑帽等操作。它是一个非常灵活的工具,可以用来处理各种图像处理任务,如去噪、特征提取、图像分割等。

函数原型:
dst = cv2.morphologyEx(src, op, kernel, anchor=None,iterations=None, borderType=cv2.BORDER_CONSTANT)
参数:
  • src:输入图像,可以是灰度图像或彩色图像。
  • op:指定要执行的形态学操作类型,如 cv2.MORPH_ERODEcv2.MORPH_DILATEcv2.MORPH_OPEN 等。
  • kernel:结构元素,用于定义形态学操作的形状和大小。可以是 cv2.getStructuringElement 函数生成的矩阵。
  • anchor:定义结构元素的锚点位置,默认为 (-1, -1),表示结构元素的中心。
  • iterations:操作的迭代次数。对于腐蚀和膨胀操作,可以指定执行多次迭代。
  • borderType:边界像素的填充类型,如 cv2.BORDER_CONSTANTcv2.BORDER_REPLICATE 等。
常用的形态学操作:
  • cv2.MORPH_ERODE:腐蚀操作。
  • cv2.MORPH_DILATE:膨胀操作。
  • cv2.MORPH_OPEN:开运算(先腐蚀后膨胀)。
  • cv2.MORPH_CLOSE:闭运算(先膨胀后腐蚀)。
  • cv2.MORPH_GRADIENT:形态学梯度(膨胀图像减去腐蚀图像)。
  • cv2.MORPH_TOPHAT:顶帽变换(原始图像减去开运算结果)。
  • cv2.MORPH_BLACKHAT:黑帽变换(闭运算结果减去原始图像)。

(4)代码示例:

在OpenCV中,开运算可以通过cv2.morphologyEx函数实现。

import cv2
import numpy as np# 读取图像
image = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\Coin0.jpg", cv2.IMREAD_GRAYSCALE)
# 定义结构元素
kernel = np.ones((3, 3), np.uint8)
# 应用Otsu阈值法进行二值化
retval, binary_image = cv2.threshold(image, 0, 255,cv2.THRESH_OTSU)
# 应用开运算
opened_image = cv2.morphologyEx(binary_image, cv2.MORPH_OPEN, kernel)
# 显示结果
cv2.imshow('Binary Image', binary_image)
cv2.imshow('opened_image', opened_image)cv2.waitKey(0)
cv2.destroyAllWindows()

 

首先定义了一个3x3的结构元素,然后使用cv2.morphologyEx函数对图像进行开运算。这将去除图像中的小噪声点,并平滑物体的边界。

(5)注意事项:

  • 结构元素的选择对开运算的结果有重要影响。较大的结构元素可以去除更大的噪声,但可能会导致图像中较大物体的边界变得模糊。
  • 开运算不会改变图像中物体的总面积,但会改变物体的形状。

五、闭运算: 

闭运算(Closing Operation)是图像形态学中的一个基本操作,它是先膨胀后腐蚀的过程。闭运算的目的在于填充前景物体内部的小孔洞、连接临近的物体以及平滑物体的边界,同时尽量保持物体的原始面积和形状。

(1)基本原理:

闭运算可以定义为对图像先进行膨胀操作,然后进行腐蚀操作。数学上,闭运算可以用以下公式表示:

其中,A 是输入图像,B 是结构元素,⊕ 表示闭运算,⊖ 表示腐蚀操作,⊙ 表示膨胀操作。

(2)应用场景:

闭运算在图像处理中的应用包括但不限于:

  • 填充孔洞:在图像中填充小的孔洞或裂缝。
  • 连接物体:连接接近的物体,使它们成为一个整体。
  • 平滑边界:平滑物体的边界,减少边界的不规则性。
  • 去除小物体:去除小的噪声点或细小的物体。

(3)OpenCV中的闭运算:

在OpenCV中,可以使用 cv2.morphologyEx 函数来执行闭运算。

import cv2
import numpy as np# 读取图像
image = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\Coin0.jpg", cv2.IMREAD_GRAYSCALE)
# 定义结构元素
kernel = np.ones((3, 3), np.uint8)
# 应用Otsu阈值法进行二值化
retval, binary_image = cv2.threshold(image, 0, 255,cv2.THRESH_OTSU)
# 应用闭运算
closed_image = cv2.morphologyEx(binary_image, cv2.MORPH_CLOSE, kernel)# 显示结果
cv2.imshow('Binary Image', binary_image)
cv2.imshow('opened_image', closed_image)cv2.waitKey(0)
cv2.destroyAllWindows()

 

首先读取一幅图像,并定义了一个3x3的结构元素。然后,我们使用 cv2.morphologyEx 函数对图像进行闭运算,这有助于填充图像中的小孔洞,并平滑物体的边界。最后,显示处理后的图像。

(4)注意事项:

  • 结构元素的选择对闭运算的效果有重要影响。较大的结构元素可以填充更大的孔洞,但可能会导致图像中较大物体的边界变得模糊。
  • 闭运算不会改变图像中物体的总面积,但会改变物体的形状。

六、 顶帽和黑帽:

在图像处理中,顶帽(Top Hat)和黑帽(Black Hat)变换是两种高级形态学操作,它们用于增强图像中的特定特征。

(1)顶帽变换:

顶帽变换是原图像与开运算结果之差。它用于突出比其周围亮的物体,即提取比结构元素小的亮区域。顶帽变换可以用于增强小的亮物体,例如在暗背景下的小亮点。数学上,顶帽变换定义为:

其中,src 是输入图像,open(src) 是对 src 应用开运算的结果。

(2)黑帽变换:

黑帽变换是闭运算结果与原图像之差。它用于突出比其周围暗的物体,即提取比结构元素小的暗区域。黑帽变换可以用于增强小的暗物体,例如在亮背景下的小暗点。数学上,黑帽变换定义为:

其中,close(src) 是对 src 应用闭运算的结果。

(3)OpenCV中的实现:

在OpenCV中,可以使用 cv2.morphologyEx 函数来实现顶帽和黑帽变换。

import cv2
import numpy as np# 读取图像
image = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\Coin0.jpg", cv2.IMREAD_GRAYSCALE)
# 定义结构元素
kernel = np.ones((3, 3), np.uint8)
# 应用Otsu阈值法进行二值化
retval, binary_image = cv2.threshold(image, 0, 255,cv2.THRESH_OTSU)
# 应用顶帽变换
tophat = cv2.morphologyEx(binary_image, cv2.MORPH_TOPHAT, kernel)
# 应用黑帽变换
blackhat = cv2.morphologyEx(binary_image, cv2.MORPH_BLACKHAT, kernel)# 显示结果
cv2.imshow('Binary Image', binary_image)
cv2.imshow('tophat', tophat)
cv2.imshow('blackhat', blackhat)cv2.waitKey(0)
cv2.destroyAllWindows()

(4)应用场景:

  • 顶帽变换:用于增强图像中的小亮物体,如星星、文字等。
  • 黑帽变换:用于增强图像中的小暗物体,如孔洞、裂缝等。

(5)注意事项:

  • 结构元素的选择对变换结果有重要影响。较大的结构元素可以提取更大的特征,但可能会导致图像中的细节丢失。
  • 顶帽和黑帽变换对噪声敏感,可能需要先进行噪声抑制处理。

七、膨胀-腐蚀实现形态学边缘检测:

在图像形态学中,膨胀-腐蚀操作可以用来实现边缘检测。这种组合操作通常被称为形态学梯度,它可以用来突出图像中的边缘和细节。以下是如何使用膨胀和腐蚀来实现形态学边缘检测的详细说明:

(1)基本原理:

形态学梯度是通过计算图像的膨胀和腐蚀之间的差异来实现的。膨胀操作会使图像中的亮区域变大,而腐蚀操作则会使亮区域变小。将膨胀后的图像减去腐蚀后的图像,可以得到图像的边缘。

(2)数学表达:

形态学梯度 G可以表示为: G=D−E

其中,D 是膨胀操作,E 是腐蚀操作。

(3)OpenCV中的实现:

在OpenCV中,可以使用 cv2.dilatecv2.erode 函数来实现膨胀和腐蚀操作,然后计算它们的差值来得到形态学梯度。

import cv2
import numpy as np# 读取图像
image = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\canny.jpg", cv2.IMREAD_GRAYSCALE)
# 定义结构元素
kernel = np.ones((3, 3), np.uint8)
# 应用膨胀操作
dilated_image = cv2.dilate(image, kernel, iterations=1)# 应用腐蚀操作
eroded_image = cv2.erode(image, kernel, iterations=1)# 计算形态学梯度
morph_gradient = cv2.subtract(dilated_image, eroded_image)# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Dilated Image', dilated_image)
cv2.imshow('Eroded Image', eroded_image)
cv2.imshow('Morphological Gradient', morph_gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

(4)应用场景:

  • 边缘检测:形态学梯度可以用来检测图像中的边缘,尤其是在图像中存在噪声时。
  • 细节增强:形态学梯度也可以用来增强图像的细节,如纹理和轮廓。

(5)注意事项:

  • 结构元素的选择对边缘检测的结果有重要影响。较大的结构元素可以检测更宽的边缘,但可能会丢失细节。
  • 迭代次数也会影响结果,更多的迭代次数会增加膨胀和腐蚀的效果。

 八、击中与不击中:

击中与不击中变换(Hit-or-Miss Transform)是图像形态学中的一种操作,它用于在二值图像中检测特定形状或模式。这种变换特别适用于检测图像中的特定结构,如线条的端点、交叉点、角点等。

(1)基本原理:

击中与不击中变换使用两个结构元素:一个用于“击中”(hit)感兴趣的目标形状,另一个用于“不击中”(miss)不希望的形状或背景。这种变换通过两次腐蚀操作来实现:

  • 击中腐蚀:使用一个结构元素对图像进行腐蚀,以识别与结构元素匹配的前景区域。
  • 不击中腐蚀:使用另一个结构元素对图像的补集进行腐蚀,以识别与结构元素不匹配的背景区域。
  • 逻辑与操作:将两次腐蚀的结果进行逻辑与操作,得到最终的击中与不击中变换结果。

(2)数学表达:

击中与不击中变换可以表示为: 其中,f(x,y) 是输入图像,B 是由两个结构元素 B1​ 和 B2​ 组成的复合结构元素,fc​(x,y) 是 f(x,y) 的补集。

(3)OpenCV中的实现:

在OpenCV中,可以使用 cv2.morphologyEx 函数来实现击中与不击中变换。以下是一个Python代码示例:

import cv2
import numpy as np# 读取图像并转换为二值图像
image = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)
_, binary_image = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY)# 定义击中和不击中结构元素
kernel_hit = np.array([[1, 1, 1],[1, 1, 1],[1, 1, 1]
], dtype=np.uint8)kernel_miss = np.array([[0, 0, 0],[0, 0, 0],[0, 0, 0]
], dtype=np.uint8)# 应用击中与不击中变换
hit_miss_image = cv2.morphologyEx(binary_image, cv2.MORPH_HITMISS, kernel_hit)# 显示结果
cv2.imshow('Hit-Miss Transform', hit_miss_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

首先将图像转换为二值图像,然后定义了击中和不击中结构元素。cv2.morphologyEx 函数用于执行击中与不击中变换。结果图像中,满足击中结构元素的形状将被突出显示。

(4)应用场景:

击中与不击中变换在图像处理中的应用包括:

  • 特定形状检测:如检测图像中的特定形状或模式。
  • 图像预处理:在进一步的图像分析之前,用于去除或突出特定结构。
  • 特征提取:在图像识别和分析中提取有用的特征。

(5)注意事项:

  • 结构元素的设计对于击中与不击中变换的效果至关重要。需要根据目标形状的大小和形状来设计合适的结构元素。
  • 击中与不击中变换通常用于二值图像,因此可能需要先对图像进行二值化处理。

九、利用形态学运算提取水平线和垂直线:

利用形态学运算提取图像中的线条是一种常见的图像处理技术。在OpenCV中,可以通过自定义结构元素(structuring element)来实现膨胀和腐蚀操作,从而提取水平线和垂直线。

(1)提取水平线和垂直线的原理:

  • 膨胀:在图像中添加像素,使得线条变粗。
  • 腐蚀:在图像中移除像素,使得线条变细。
  • 开运算:先腐蚀后膨胀,用于移除小对象并平滑较大对象的边界。

(2)实现步骤:

  • 读取图像:加载需要处理的图像。
  • 灰度转换:将图像转换为灰度图像,以便进行二值化处理。
  • 二值化:将灰度图像转换为二值图像,以便进行形态学操作。
  • 定义结构元素:创建水平和垂直的结构元素,用于提取相应的线条。
  • 开运算:对二值图像进行开运算,提取水平或垂直线。

(3)示例代码:

import cv2
import numpy as np# 读取图像
image = cv2.imread("C:\\Users\\86173\\Desktop\\TI\\Coin0.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)# 定义水平和垂直结构元素
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 1))
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 30))# 提取水平线
horizontal_lines = cv2.morphologyEx(binary, cv2.MORPH_OPEN, horizontal_kernel)# 提取垂直线
vertical_lines = cv2.morphologyEx(binary, cv2.MORPH_OPEN, vertical_kernel)# 显示结果
cv2.imshow('Horizontal Lines', horizontal_lines)
cv2.imshow('Vertical Lines', vertical_lines)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

首先将图像转换为灰度图像,然后进行二值化处理。接着,定义水平和垂直的结构元素,并使用开运算提取了水平线和垂直线。最后,显示提取线条的结果。

(4)注意事项:

  • 结构元素的大小和形状对提取线条的效果有重要影响。较大的结构元素可以提取更粗的线条,但可能会包含非目标线条。
  • 二值化阈值的选择也会影响提取线条的效果。适当的阈值可以帮助更好地区分线条和背景。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/150271.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

巧用解压软件:高效处理云盘文件

百度网盘支持多种文件格式,包括文本文件格式如.txt、.doc、.docx 等;图片文件格式如.jpg、.png 等;音频文件格式如.mp3、.wav 等;视频文件格式如.avi、.mp4 等;压缩文件格式如.zip、.rar、.7z 等;可执行文件…

进度条QProgressBar

进度条控价,用来只是任务的完成情况 值 包括当前值、最大值、最小值 // 获取和设置当前值 int value() const; void setValue(int);// 获取和设置最大值 int maximum() const; void setMaximum(int);// 获取和设置最小值 int minimum() const; void setMinimum(i…

http增删改查四种请求方式操纵数据库

注意:在manage.py项目入口文件中的路由配置里,返回响应的 return语句后面的代码不会执行,所以路由配置中每个模块代码要想都执行,不能出现return 激活虚拟环境:venv(我的虚拟环境名称)\Scripts\activate …

【论文翻译】AFLGuard: Byzantine-robust Asynchronous Federated Learning

提示:该论文标题为AFLGuard: Byzantine-robust Asynchronous Federated Learning,我将对其进行部分翻译,便于后续阅读。 文章目录 AFLGuard:拜占庭鲁棒的异步联邦学习一、摘要二、引言三、知识前提拜占庭鲁棒联邦学习 四、问题表述…

排序(插入,希尔,堆排)

常见的排序算法: 插入排序: 直接插入排序:是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个…

mysql如何替换数据库所有表中某些字段含有的特定值

目录 背景查询所有表名查询表的所有字段过虑特征字段替换字段中含有的特定值 背景 公司的测试域名更换了,导致存放在数据库中的域名也要跟着替换,当然把域名存放在数据库表中是不科学的,不建议这样做,但公司的同事就这样做了&…

AWS开启MFA,提高安全性

引言 多因素认证(Multi-Factor Authentication, MFA)是一种重要的安全措施,可以显著提高您的AWS账号的安全性。通过启用MFA,即使密码被盗,攻击者也难以访问您的账户。本文中九河云将详细介绍如何在AWS Management Con…

element-plus表格操作

elememt-plus安装见上文 表格的特性 element-plus中的表格和原版表格最大的不同是写法不同,原版表格以行的方式写,element-plus以列的方式写。 element-plus的表格可以更方便的展示数据,只需要考虑数据的格式即可。 表格标签 表格标签有两种…

LeetCode 257. 二叉树的所有路径,dfs

LeetCode 257. 二叉树的所有路径 给定一个二叉树,返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 目录 LeetCode 257. 二叉树的所有路径算法选择数据结构解题步骤算法流程算法代码算法分析易错点和注意事项相似题目 算法选择 深度优…

Web端云剪辑解决方案,提供多轨视频、音频、特效、字幕轨道可视化编辑

传统视频剪辑软件的繁琐安装、高昂硬件要求以及跨平台协作的局限性,让无数创意者望而却步。美摄科技作为云端视频编辑技术的领航者,携其革命性的Web端云剪辑解决方案,正重新定义视频创作的边界,让专业级视频剪辑触手可及&#xff…

k8s StorageClass 存储类

文章目录 一、概述1、StorageClass 对象定义2、StorageClass YAML 示例 二、StorageClass 字段1、provisioner(存储制备器)1.1、内置制备器1.2、第三方制备器 2、reclaimPolicy(回收策略)3、allowVolumeExpansion(允许…

多线程:死锁

目录 死锁的条件 死锁的示例 死锁的预防与解决 死锁的检测 总结 死锁(Deadlock)是多线程或多进程环境中一种特定的状态,指的是两个或多个线程或进程在执行过程中,由于争夺资源而造成的一种相互等待的状态,导致它们…

Linux usb主机控制器HC阅读

intel的UHCI 一种usb主机控制器的接口规范,遵守它的硬件称为UHCI主机控制器,Linux中,把这种硬件叫做HC,host controller,与之对应的软件,叫做HCD,hc driver, depends on usb & pci: 它的内核软件模块代码是uhci-hcd.c uhci_hcd_init初始化开始: usb_disable函数:…

【openwrt】 libubox组件——ustream

文章目录 ustream 核心数据结构struct ustreamstruct ustream_buf_liststruct ustream_bufstruct ustream_fd ustream 核心APIustream_fd_initustream_uloop_cbustream_fd_read_pendingustream_fill_read ustream_write_pendingustream_writeustream_fd_write ustream 应用示例…

前端开发必须了解的css知识

文本过长省略显示 单行 .ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }多行 方法一: .ellipsis {overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp: 3;word-break: break-all; }方法二: .ellipsis {ove…

文献笔记 - Neural Lander: Stable Drone Landing ControlUsing Learned Dynamics

这篇博文是自己看文章顺手做的笔记 只是简单翻译和整理 仅做个人参考学习和分享 如果作者看到觉得内容不妥请联系我 我会及时处理 本人非文章作者,文献的引用格式如下,原文更有价值 [1]Guanya Shi∗,Xichen Shi∗,Michael OConnell∗,et al.Neural La…

LOGO设计新革命:5款AI工具让你秒变设计大师(必藏)

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 你是否曾因设计一个既独特又专业的LOGO而感…

Tableau|二 如何利用功能区创建视图

一 认识 Tableau 数据 1.数据角色 维度和度量是Tableau的一种数据角色划分,离散和连续是另一种划分方式。 1.维度和度量 维度往往是一些分类、时间方面的定性字段,将其拖放到功能区时,Tableau不会对其进行计算,而是对视图区进行分…

Swin Transformer(ICCV 2021 best paper):基于卷积层级式架构的移动窗口视觉Transformer!

有关ViT的学习笔记详见:学习笔记——ViT(Vision Transformer)-CSDN博客 ViT在图像分类方面的结果令人鼓舞,但由于其低分辨率的特征映射和复杂度随图像大小的二次方增长,其架构不适合作为密集视觉任务或高分辨率输入图像的backbone。根据经验&…

JetBrains系列产品无限重置免费试用方法

JetBrains系列产品无限重置免费试用方法 写在前面安装插件市场安装插件 写在前面 支持的产品: IntelliJ IDEA AppCode CLion DataGrip GoLand PhpStorm PyCharm Rider RubyMine WebStorm为了保证无限重置免费试用方法的稳定性,推荐下载安装2021.2.2及其…