当前位置: 首页 > news >正文

网站备案号的区别广州企业网站建设报价

网站备案号的区别,广州企业网站建设报价,为什么石家庄突然封了,福州企业如何建网站形态学图像处理(Morphological Image Processing) 前言 ‍ 本博客为个人总结数字图像处理一课所写#xff0c;并给出适当的扩展和相应的demo。 写博客跟做 checkpoint​ 很像#xff0c;毕竟个人还不能达到那种信手拈来的境界#xff0c;忘了就是从零开始训练#xff0…形态学图像处理(Morphological Image Processing) 前言 ‍ 本博客为个人总结数字图像处理一课所写并给出适当的扩展和相应的demo。 写博客跟做 checkpoint​ 很像毕竟个人还不能达到那种信手拈来的境界忘了就是从零开始训练这就令人有些头疼了。 题外话说完开始吧。 ‍ Note: ‍ 笔者环境为 Ubuntu 24.04 LTS​延续以往的写作风格我会用自己的话来理解而非简单直接地贴上原本的概念(目的不是写paper)那当然是尽量侧重通俗易懂了除非我才疏学浅没词了令人感到悲哀的是我所谓的数字图像处理课的教材没这玩意(反正我也基本不用)我得参考一些资料尤其是英文的资料。 ‍ ‍ 目录 ‍ 文章目录 形态学图像处理(Morphological Image Processing)前言目录什么叫形态学图像处理(Morphological Image Processing)集合论须知的公式结构元素(structuring element)简要介绍邻域“窗口”算子(Neighborhood window operator)与结构元素结构元素的三大属性的影响 简述算子是什么二值形态学的基本运算腐蚀(Erosion)腐蚀的解释与公式腐蚀的应用腐蚀操作的demo实现 膨胀(Dilation)膨胀的解释与公式膨胀的应用膨胀操作的demo实现 膨胀与腐蚀的关系开运算(Opening)开运算的简介开运算的demo实现 闭运算(Closing)闭运算的简介闭运算的demo实现 开闭运算的侧重顶帽运算(Top Hat)顶帽运算的简介顶帽运算的demo实现 黑帽运算(Black Hat)黑帽运算的简介黑帽运算的demo实现 梯度运算(Gradient)梯度运算的简介梯度运算的demo实现 击中击不中变换(Hit - miss filter)击中击不中变换的解释与公式击中击不中变换的应用 灰度形态学的基本运算灰度图像Flat/一般腐蚀算子Flat/一般膨胀算子Flat腐蚀和膨胀算子和一般腐蚀和膨胀算子 形态学边缘检测(Morphological edge detectors)简要介绍对于二值图像对于灰度图像 参考资料datablog and related sources ‍ ‍ 什么叫形态学图像处理(Morphological Image Processing) ‍ 什么是形态学图像处理呢 我们打一个比方我们讲皮肉骨图像的形态就好比是皮肉支撑起皮肉的是骨头我们的形态学处理就是做生物改造通过改变里面的骨头进而改变其外在的皮肉的表现。 怎么改变骨头呢换骨头按照定好的规则对于原本的骨头用定制的骨头进行替换。 简而言之就是侧重于图像”皮肉“下的”骨头“的处理。 ‍ 下面是正式一点的介绍 ‍ 形态学图像处理在图像分析中具有重要地位广泛应用于计算机视觉、图像分割、特征提取等领域。 其主要操作包括膨胀、腐蚀、开闭运算、边缘检测等这些操作基于集合理论通过定义结构元素对图像进行处理能够有效提取图像的形状、结构和特征信息为后续的分析和理解奠定基础。 ‍ ‍ 集合论须知的公式 ‍ 概念如无必要就直接上公式 ‍ 集合的并(Union): A ∪ B { x ∣ x ∈ A or  x ∈ B } A \cup B \{x \mid x \in A \text{ or } x \in B\} A∪B{x∣x∈A or x∈B} 集合的交(Intersection): A ∩ B { x ∣ x ∈ A and  x ∈ B } A \cap B \{x \mid x \in A \text{ and } x \in B\} A∩B{x∣x∈A and x∈B} 集合的补(Complement) A ‾ { x ∣ x ∉ A } \overline{A} \{x \mid x \notin A\} A{x∣x∈/A} 集合的差(Difference): A − B { x ∣ x ∈ A and  x ∉ B } A - B \{x \mid x \in A \text{ and } x \notin B\} A−B{x∣x∈A and x∈/B} 集合的反射(Reflection): A ′ { ( − x , − y ) ∣ ( x , y ) ∈ A } A^{} \{(-x, -y) \mid (x, y) \in A \} A′{(−x,−y)∣(x,y)∈A} 集合的平移(Translation): A y { ( x y 1 , y y 2 ) ∣ ( x , y ) ∈ A } A \mathbf{y} \{ (x y_1, y y_2) \mid (x, y) \in A \} Ay{(xy1​,yy2​)∣(x,y)∈A} ‍ ‍ 结构元素(structuring element) ‍ 简要介绍 ‍ 提到图像形态学处理我们绕不开的一个概念是结构元素所谓的结构元素(也称核或模板)是一个小的二值(binary)图像用于与输入图像进行数学操作以提取图像的特定形状特征。 什么是二值图像呢就是一个尺寸较小 { 3 × 3 , 5 × 5 , … } \{3\times3,5\times5,\ldots\} {3×3,5×5,…} 的图像(或者叫方阵)只包含0(背景黑色)1(前景白色)两种像素值。它是灰度/彩色图像分析系统中的中间抽象常用于阈值分割、判断图像属性等如文本和线条图形、文档图像处理。 结构元素有多种形状常见的为方形圆形十字形线形等等。 确定了结构元素的大小和形状后我们还需要确定结构元素中的原点(锚点)所谓原点就是结构元素中用于与输入图像对齐的参考点具体描述就是结构元素跟原图像某个位置按运算的规则匹配上后就会基于锚点和运算进行相应的像素值的处理。 综上结构元素有三大属性大小形状原点。 ‍ ‍ 邻域“窗口”算子(Neighborhood “window” operator)与结构元素 ‍ 邻域“窗口”算子同结构元素密切相关其公式表示为 W { f [ x , y ] } { f [ x − x ′ , y − y ′ ] : [ x ′ , y ′ ] ∈ ∏ x y } W\{f[x, y]\}\left\{f\left[x-x, y-y\right]:\left[x, y\right] \in \prod_{x y}\right\} W{f[x,y]}{f[x−x′,y−y′]:[x′,y′]∈xy∏​} 这里 f [ x , y ] f[x, y] f[x,y] 是图像在坐标 ( x , y ) (x, y) (x,y) 处的像素值 Π x y \Pi_{xy} Πxy​ 定义了一个特定的邻域范围它确定了在处理像素 f [ x , y ] f[x, y] f[x,y] 时需要考虑的周围像素的集合范围。 它与结构元素的不同在于它是用结构元素去选取图像中的像素集合再根据具体的形态学操作对这些像素值进行组合计算而结构元素本身并不进行计算操作个人以为这也是为什么结构元素又被叫做模板的原因。 说的通俗点拿印章举例结构元素就是印章的图案邻域“窗口”算子则是印章的印油。 这个公式也有两个变种这两个变种我们会在后面的二值形态学的基本运算中用到。 W ( − ) { f [ x , y ] } { f [ x − x ′ , y − y ′ ] : [ x ′ , y ′ ] ∈ ∏ x y } W^{\left(-\right)}\{f[x,y]\}\left\{f\left[x-x^{\prime},y-y^{\prime}\right]:\left[x^{\prime},y^{\prime}\right]\in\prod_{xy}\right\} W(−){f[x,y]}{f[x−x′,y−y′]:[x′,y′]∈xy∏​} ‍ 根据结构元素 Π x y \Pi_{xy} Πxy​ 的形状和大小确定图像 f f f 中以 ( x , y ) (x, y) (x,y) 为中心的邻域-对于结构元素 Π x y \Pi_{xy} Πxy​ 中的每一个点 ( x ′ , y ′ ) (x, y) (x′,y′) 计算图像 f f f 中对应的点 ( x − x ′ , y − y ′ ) (x - x, y - y) (x−x′,y−y′)-获取该点的像素值 f [ x − x ′ , y − y ′ ] f[x - x, y - y] f[x−x′,y−y′] -将所有这些像素值收集到一个集合中这个集合就是 W ( − ) { f [ x , y ] } W^{(-)}\{f[x,y]\} W(−){f[x,y]}​。 W ( ) { f [ x , y ] } { f [ x x ′ , y y ′ ] : [ x ′ , y ′ ] ∈ ∏ x y } W^{\left(\right)}\{f[x,y]\}\left\{f\left[xx^{\prime},yy^{\prime}\right]:\left[x^{\prime},y^{\prime}\right]\in\prod_{xy}\right\} W(){f[x,y]}{f[xx′,yy′]:[x′,y′]∈xy∏​} 同理。 ‍ ‍ 结构元素的三大属性的影响 ‍ 前面我们提到结构元素有三大属性那么这三大属性会怎样影响最后的处理效果呢 大小越大说明什么变化大影响的范围大形态学的操作效果会更明显对原本图像的“骨架”进行更大影响相应的细节就可能在处理中发生丢失小的话则相反。 形状不同的形状意味着处理的侧重不同结构元素的形状决定了改造后的图像的“骨架”的倾向。 原点可以理解为我们的工作中心中心在哪里处理的结果的落脚点就在在哪里。原点的不同使得最终“骨架”的变化方向细节处理和特征的匹配有显著的影响。 ‍ ‍ 简述算子是什么 ‍ 我想很多同我一样的初学者会有一个疑问什么是算子 我们知道函数简单来说函数的构成是输入特定的规则和将输入经过规则变换得到的结果。 算子的构成则是输入的函数特定的规则和将输入的函数经过规则变换得到的另一个函数的映射或操作规则。 换而言之算子处理的对象是函数。 ‍ ‍ 二值形态学的基本运算 ‍ 二值形态学的基本运算包括腐蚀、膨胀、开运算和闭运算。这些运算在图像处理中用于提取图像的形状特征如边界、区域和连通性等。 二值图像中像素用 0 0 0 (背景黑色)和 1 1 1 (前景白色)表示是灰度/彩色图像分析系统中的中间抽象。 有一点值得注意各种形态学的运算操作都是基于腐蚀和膨胀操作的组合。 因此我们可以说在二值形态学下和灰度形态学下的形态学运算我们只需要专门关注腐蚀和膨胀操作的不同即可其余的组合运算就不需要反复强调。 ‍ ‍ 腐蚀(Erosion) ‍ 腐蚀的解释与公式 ‍ 首先我们得回答一个问题为什么叫腐蚀 字面意思来讲就是将一个东西进行“消减”的操作那么首先想到的效果就是“变细”或者“变瘦”。在我们的二值图像中的表现就是将前景物体(像素值为 1 1 1 )缩小。 把公式先端上来 g [ x , y ] A N D [ W ( ) { f [ x , y ] } ] : e r o d e ( f , W ) g[x,y]AND[W^{()}\{f[x,y]\}]:erode(f,W) g[x,y]AND[W(){f[x,y]}]:erode(f,W) 其含义为对于每个像素 f [ x , y ] f[x, y] f[x,y] W ( ) W^{()} W() 按照 Π x y \Pi_{xy} Πxy​ 定义的邻域范围移动结构元素选取结构元素覆盖到的像素值进行逻辑与 A N D AND AND 操作。 当结构元素 W ( ) W^{()} W() 在图像上移动时只有当结构元素覆盖区域内的所有像素值都为 1 1 1 时在腐蚀后的图像 g [ x , y ] g[x,y] g[x,y] 中对应结构元素中心位置的像素值才为 1 1 1只要该区域内有一个像素值为 0 0 0 那么腐蚀后对应位置的像素值就为 0 0 0。 我想得画图才能表示地更加清晰。 ‍ ​​ ‍ 通过上图再直观一点说腐蚀操作是用结构元素扫描图像中的每一个像素当结构元素与图像中对应区域完全匹配时结构元素中心所对应的像素在腐蚀后的图像中才被置为 1 1 1否则被置为 0 0 0。 对于上面的公式我们可能比较陌生我们更熟悉的可能是下面这个公式 A ⊖ B { x ∣ ( B ) y ⊆ A } A \ominus B \{ x \mid (B)_{y} \subseteq A \} A⊖B{x∣(B)y​⊆A} 其中 ‍ A A A表示原始的二值图像其中包含前景(值为1的像素)和背景(值为0的像素)。 B B B表示结构元素它是一个较小的二值图像用于探测 A A A 中的特定形状或特征。 ⊖ \ominus ⊖ 表示腐蚀操作。 ( B ) y (B)_{y} (B)y​表示结构元素 B B B 通过平移操作使其原点移动到空间中的位置 y y y。 ‍ 简单地解释这个公式若 ( B ) y (B)_{y} (B)y​ 仍包含于 A A A 中则其所有 y y y 点组成的集合称为 A A A 被 B B B 腐蚀。 ‍ ‍ 腐蚀的应用 ‍ 去除噪声去除孤立噪声点图像细化得到骨架结构目标分离分离粘连目标特征提取获取边界信息 ‍ 腐蚀操作的demo实现 ‍ import cv2 import numpy as np from matplotlib import pyplot as pltdef save_pair_imgs(imgs,original_title,processed_title):plt.figure(figsize(10, 8))plt.subplot(1, 2, 1)plt.imshow(imgs[0],gray)plt.title(original_title)plt.xticks([]), plt.yticks([])plt.subplot(1, 2, 2)plt.imshow(imgs[1],gray)plt.title(processed_title)plt.xticks([]), plt.yticks([])title original_title _ processed_titleplt.savefig(f../imgs/{title}.png, bbox_inchestight)plt.show()# 读取图像 image cv2.imread(../data/Lena.bmp, 0) # 0表示以灰度模式读取# 定义结构元素 kernel np.ones((5,5), np.uint8)# 腐蚀操作 erosion cv2.erode(image, kernel, iterations 1) save_pair_imgs([image,erosion],Original Image,Erosion)‍ 效果图如下 ‍ ​​ ‍ ‍ ‍ 膨胀(Dilation) ‍ 膨胀的解释与公式 ‍ 膨胀跟腐蚀相反它是把图像进行一个“变胖”或者说“变粗”的操作。二值图像中的表现就是将前景物体扩大。 端上公式 g [ x , y ] O R [ W ( − ) { f [ x , y ] } ] : d i l a t e ( f , W ) g[x,y]OR[W^{(-)}\{f[x,y]\}]:dilate(f,W) g[x,y]OR[W(−){f[x,y]}]:dilate(f,W) 当结构元素 W ( − ) W^{(-)} W(−) 在图像上移动时只有当结构元素覆盖区域内的所有像素值都为 0 0 0 时在膨胀后的图像 g [ x , y ] g[x,y] g[x,y] 中对应结构元素中心位置的像素值才为 0 0 0只要该区域内有一个像素值为 1 1 1 那么膨胀后对应位置的像素值就为 1 1 1。 继续上图 ‍ ​​ ‍ 直观一点说膨胀操作是用结构元素扫描图像中的每一个像素当结构元素与图像中对应区域至少有一个匹配时结构元素中心所对应的像素在膨胀后的图像中就被置为 1 1 1否则被置为 0 0 0。 同样地我们通常看到的是下面的公式 A ⊕ B { x ∣ ( B ) y ∩ A ≠ ∅ } A \oplus B \{ x \mid (B)_{y}\cap A \neq \emptyset \} A⊕B{x∣(B)y​∩A∅} 其中 ‍ A A A表示原始的二值图像其中包含前景(值为1的像素)和背景(值为0的像素)。 B B B表示结构元素它是一个较小的二值图像用于探测 A A A 中的特定形状或特征。 ⊕ \oplus ⊕ 表示膨胀操作。 ( B ) y (B)_{y} (B)y​表示结构元素 B B B 通过平移操作使其原点移动到空间中的位置 y y y。 ‍ 简单地解释这个公式若 ( B ) y (B)_{y} (B)y​ 与 A A A 的交集不为空则其所有 y y y 点组成的集合称为 A A A 被 B B B 膨胀。 ‍ ‍ 膨胀的应用 ‍ 图像预处理填充孔洞连接断裂部分目标增强突出物体轮廓扩大目标区域形态学梯度计算获取边缘信息 ‍ ‍ 膨胀操作的demo实现 ‍ import cv2 import numpy as np from matplotlib import pyplot as pltdef save_pair_imgs(imgs,original_title,processed_title):plt.figure(figsize(10, 8))plt.subplot(1, 2, 1)plt.imshow(imgs[0],gray)plt.title(original_title)plt.xticks([]), plt.yticks([])plt.subplot(1, 2, 2)plt.imshow(imgs[1],gray)plt.title(processed_title)plt.xticks([]), plt.yticks([])title original_title _ processed_titleplt.savefig(f../imgs/{title}.png, bbox_inchestight)plt.show()# 读取图像 image cv2.imread(../data/Lena.bmp, 0) # 0表示以灰度模式读取# 定义结构元素 kernel np.ones((5,5), np.uint8)# 膨胀操作 dilation cv2.dilate(image, kernel, iterations1) save_pair_imgs([image, dilation], Original Image, Dilation)‍ 效果图如下 ‍ ​​ ‍ ‍ 膨胀与腐蚀的关系 ‍ 对偶性 d i l a t e ( f , W ) N O T [ e r o d e ( N O T [ f ] , W ) ] dilate(f,W)NOT[erode(NOT[f],W)] dilate(f,W)NOT[erode(NOT[f],W)] e r o d e ( f , W ) N O T [ d i l a t e ( N O T [ f ] , W ) ] erode(f,W)NOT[dilate(NOT[f],W)] erode(f,W)NOT[dilate(NOT[f],W)] 也就是说对前景进行膨胀相当于对背景进行腐蚀对背景进行腐蚀相当于对前景进行膨胀。 但腐蚀不是膨胀的逆运算 f [ x , y ] ≠ e r o d e ( d i l a t e ( f , W ) , W ) ≠ d i l a t e ( e r o d e ( f , W ) , W ) f[x,y]\neq erode(dilate(f,W),W)\neq dilate(erode(f,W),W) f[x,y]erode(dilate(f,W),W)dilate(erode(f,W),W) ‍ ‍ 开运算(Opening) ‍ 开运算的简介 ‍ 开运算是先腐蚀后膨胀的组合操作: o p e n ( f , W ) d i l a t e ( e r o d e ( f , W ) , W ) open(f,W)dilate(erode(f,W),W) open(f,W)dilate(erode(f,W),W) ‍ 我们更常见的公式如下: A ∘ B ( A ⊖ B ) ⊕ B A \circ B (A \ominus B) \oplus B A∘B(A⊖B)⊕B 其中 A A A 是原始图像 B B B 是结构元素。 前面我们知道腐蚀可以去除皮肉露出骨架去掉噪声的同时会损失一些细节那么我们就用膨胀操作把它们长回来那不就可以做到去掉噪声又基本保留物体原本的轮廓了吗(腐蚀和膨胀没有逆运算的性质所以说是基本)? 简单来说开运算所做的就是去除小的前景部分(数值为1)也就是去除一些细小突出物、较小的粘连、小面积的噪声同时保持了物体的基本形状。 ‍ ‍ 开运算的demo实现 ‍ import cv2 import numpy as np from matplotlib import pyplot as pltdef save_pair_imgs(imgs,original_title,processed_title):plt.figure(figsize(10, 8))plt.subplot(1, 2, 1)plt.imshow(imgs[0],gray)plt.title(original_title)plt.xticks([]), plt.yticks([])plt.subplot(1, 2, 2)plt.imshow(imgs[1],gray)plt.title(processed_title)plt.xticks([]), plt.yticks([])title original_title _ processed_titleplt.savefig(f../imgs/{title}.png, bbox_inchestight)plt.show()# 读取图像 image cv2.imread(../data/Lena.bmp, 0) # 0表示以灰度模式读取# 定义结构元素 kernel np.ones((5,5), np.uint8)# 开运算操作 opening cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) save_pair_imgs([image, opening], Original Image, Opening)‍ 效果图如下 ‍ ​​ ‍ ‍ ‍ 闭运算(Closing) ‍ 闭运算的简介 ‍ 闭运算是先膨胀后腐蚀的组合操作: c l o s e ( f , W ) e r o d e ( d i l a t e ( f , W ) , W ) close(f,W)erode(dilate(f,W),W) close(f,W)erode(dilate(f,W),W) 我们更常见的公式如下: A ∙ B ( A ⊕ B ) ⊖ B A \bullet B (A \oplus B) \ominus B A∙B(A⊕B)⊖B 其中 A A A 是原始图像 B B B 是结构元素。 我们为什么要闭运算先膨胀去除边界凹陷包含掉背景噪声填充孔洞连接相邻再腐蚀就能将包含的背景噪声去除也保留物体原本的主要特征。 闭运算去除的是小的背景部分(数值为0)。 ‍ ‍ 闭运算的demo实现 ‍ import cv2 import numpy as np from matplotlib import pyplot as pltdef save_pair_imgs(imgs,original_title,processed_title):plt.figure(figsize(10, 8))plt.subplot(1, 2, 1)plt.imshow(imgs[0],gray)plt.title(original_title)plt.xticks([]), plt.yticks([])plt.subplot(1, 2, 2)plt.imshow(imgs[1],gray)plt.title(processed_title)plt.xticks([]), plt.yticks([])title original_title _ processed_titleplt.savefig(f../imgs/{title}.png, bbox_inchestight)plt.show()# 读取图像 image cv2.imread(../data/Lena.bmp, 0) # 0表示以灰度模式读取# 定义结构元素 kernel np.ones((5,5), np.uint8)# 闭运算操作 closing cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel) save_pair_imgs([image, closing], Original Image, Closing)‍ 效果图如下 ‍ ​​ ‍ ‍ 开闭运算的侧重 ‍ 闭运算的侧重点是去除小的背景部分保留主要​**特征**。 开运算的侧重点是去除小的前景部分保留主要​**轮廓**。 ‍ ‍ 顶帽运算(Top Hat) ‍ 顶帽运算的简介 ‍ 顶帽运算也称为礼帽运算它是原图像与开运算结果的差值。 其公式定义如下 T f − ( f ∘ b ) T f - (f \circ b) Tf−(f∘b) ‍ ‍ 顶帽运算能够提取出图像中比周围结构元素尺寸范围内背景更亮的部分它主要用于分离图像中的明亮部分如比周围区域亮的物体或噪声与整体背景。 也就是分离出噪声信息或者比元素图像更亮的边缘信息。 ‍ ‍ 顶帽运算的demo实现 ‍ import cv2 import numpy as np from matplotlib import pyplot as pltdef save_pair_imgs(imgs,original_title,processed_title):plt.figure(figsize(10, 8))plt.subplot(1, 2, 1)plt.imshow(imgs[0],gray)plt.title(original_title)plt.xticks([]), plt.yticks([])plt.subplot(1, 2, 2)plt.imshow(imgs[1],gray)plt.title(processed_title)plt.xticks([]), plt.yticks([])title original_title _ processed_titleplt.savefig(f../imgs/{title}.png, bbox_inchestight)plt.show()# 读取图像 image cv2.imread(../data/Lena.bmp, 0) # 0表示以灰度模式读取# 定义结构元素 kernel np.ones((5,5), np.uint8)# Top Hat 操作 tophat cv2.morphologyEx(image, cv2.MORPH_TOPHAT, kernel) save_pair_imgs([image, tophat], Original Image, Top Hat)‍ 效果图如下 ‍ ​​ ‍ ‍ 黑帽运算(Black Hat) ‍ 黑帽运算的简介 ‍ 黑帽运算的功能与顶帽运算相反它能够提取出图像中比周围结构元素尺寸范围内背景更暗的部分主要用于分离图像中的暗部分如比周围区域暗的物体或阴影与整体背景。 也就是获取图像内部的小孔前景色中的小黑点或者比原始图像的边缘更暗的边缘部分。 黑帽运算是闭运算结果与原图像的差值。 其公式定义如下 B ( f ⋅ b ) − f B(f \cdot b) - f B(f⋅b)−f ‍ ‍ 黑帽运算的demo实现 ‍ import cv2 import numpy as np from matplotlib import pyplot as pltdef save_pair_imgs(imgs,original_title,processed_title):plt.figure(figsize(10, 8))plt.subplot(1, 2, 1)plt.imshow(imgs[0],gray)plt.title(original_title)plt.xticks([]), plt.yticks([])plt.subplot(1, 2, 2)plt.imshow(imgs[1],gray)plt.title(processed_title)plt.xticks([]), plt.yticks([])title original_title _ processed_titleplt.savefig(f../imgs/{title}.png, bbox_inchestight)plt.show()# 读取图像 image cv2.imread(../data/Lena.bmp, 0) # 0表示以灰度模式读取# 定义结构元素 kernel np.ones((5,5), np.uint8)# Black Hat 操作 blackhat cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel) save_pair_imgs([image, blackhat], Original Image, Black Hat)‍ 效果图如下 ‍ ​​ ‍ ‍ 梯度运算(Gradient) ‍ 梯度运算的简介 ‍ 什么是梯度运算梯度我们下意识可以想到高数中的梯度。 梯度是一个向量其方向指向标量函数增长最快的方向其大小或长度表示该方向上的增长速率。 边缘通常是图像中物体与背景之间像素值变化剧烈的地方因此梯度运算可以突出图像中的边缘信息(位置和强度) 梯度运算的公式很多常见的基本差分梯度公式如下 ‍ 对于二维离散图像 f ( x , y ) f(x,y) f(x,y) 水平方向梯度 G x f ( x 1 , y ) − f ( x , y ) G_x f(x 1,y) - f(x,y) Gx​f(x1,y)−f(x,y)它衡量了图像在水平方向上相邻像素值的变化。例如在一个灰度图像中如果从左到右像素值逐渐增加那么 G x G_x Gx​ 在相应位置将为正值表示从暗到亮的变化趋势反之如果像素值逐渐减小 G x G_x Gx​ 为负值表示从亮到暗的变化。垂直方向梯度 G y f ( x , y 1 ) − f ( x , y ) G_y f(x,y 1) - f(x,y) Gy​f(x,y1)−f(x,y)用于检测图像在垂直方向上的像素值变化情况。与 G x G_x Gx​​ 类似其正负值反映了垂直方向上像素值的增减趋势。总的梯度幅值 G G x 2 G y 2 G \sqrt{G_x^2 G_y^2} GGx2​Gy2​ ​这种计算方式综合考虑了水平和垂直方向的梯度变化得到一个标量值表示每个像素点的梯度大小。梯度值越大说明该像素点处图像的变化越剧烈越有可能是边缘位置。 ‍ ‍ ‍ 梯度运算的demo实现 ‍ import cv2 import numpy as np from matplotlib import pyplot as pltdef save_pair_imgs(imgs,original_title,processed_title):plt.figure(figsize(10, 8))plt.subplot(1, 2, 1)plt.imshow(imgs[0],gray)plt.title(original_title)plt.xticks([]), plt.yticks([])plt.subplot(1, 2, 2)plt.imshow(imgs[1],gray)plt.title(processed_title)plt.xticks([]), plt.yticks([])title original_title _ processed_titleplt.savefig(f../imgs/{title}.png, bbox_inchestight)plt.show()# 读取图像 image cv2.imread(../data/Lena.bmp, 0) # 0表示以灰度模式读取# 定义结构元素 kernel np.ones((5,5), np.uint8)# 梯度操作 gradient cv2.morphologyEx(image, cv2.MORPH_GRADIENT, kernel) save_pair_imgs([image, gradient], Original Image, Gradient)‍ 效果图如下 ‍ ​​ ‍ ‍ 击中击不中变换(Hit - miss filter) ‍ 击中击不中变换的解释与公式 ‍ 击中击不中变换用于在二值图像中检测特定形状和结构它基于结构元素与图像像素的匹配情况来确定目标形状或结构的位置。 击中击不中变换需要使用两个结构元素结构元素 V V V用于匹配前景目标元素和结构元素 W W W 用于匹配背景目标元素的周围的背景元素。对于图像中的每个像素点当以该像素点为中心的图像区域与结构元素 V V V 在前景部分完全匹配同时与结构元素 W W W 在背景部分完全匹配时该像素点被标记为目标形状或结构的位置。 设二值图像为 f f f 击中击不中变换后的图像为 g g g 则击中击不中变换可以表示为 g f ⊛ ( V , W ) g f \circledast (V,W) gf⊛(V,W) 其中 ⊛ \circledast ⊛ 表示击中击不中变换操作。 具体计算时先对图像 f f f 进行腐蚀操作腐蚀结构元素为 V V V 得到一个中间结果 f V f_V fV​ 再对图像 f f f 的补集即背景部分进行腐蚀操作腐蚀结构元素为 W W W 得到另一个中间结果 f W C f_W^C fWC​ 最后将 f V f_V fV​ 和 f W C f_W^C fWC​ 进行逻辑与操作得到击中击不中变换的结果 g g g 即 g ( f ⊖ V ) ∩ ( f C ⊖ W ) g (f \ominus V) \cap (f^C \ominus W) g(f⊖V)∩(fC⊖W) 其中 ⊖ \ominus ⊖ 表示腐蚀操作 f C f^C fC 表示 f f f 的补集。 我们可以理解为完全匹配前景和背景元素需要跟设定的完全一致。 上图 ‍ ​​ ‍ Note在击中击不中变换的结构元中-1表示背景1表示前景0表示不关心 ‍ ‍ 击中击不中变换的应用 ‍ 形状检测与识别在工业检测中用于检测产品表面特定形状的缺陷或标记如检测电路板上的特定形状的焊点是否完整、有无缺陷等。通过设计合适的结构元素来匹配正常焊点的形状利用击中击不中变换可以快速准确地找出不符合形状要求的焊点从而实现产品质量的检测和控制。纹理分析在纹理图像分析中某些纹理特征可能具有特定的形状或结构模式击中击不中变换可以帮助提取这些纹理特征用于图像分类、分割等任务。例如在分析纺织品的纹理时检测其中特定的编织图案或纹理结构以判断纺织品的质量和类型。字符识别预处理在光学字符识别OCR系统中可作为预处理步骤用于检测字符的特定结构部分如字母中的孔洞如字母“o”“p”等中的圆形孔洞、笔画的端点和交叉点等特征这些特征信息可以为后续的字符分类和识别提供重要依据提高字符识别的准确性和效率。 ‍ ‍ 灰度形态学的基本运算 ‍ 灰度图像 ‍ 灰度图像与二值图像不同它的像素值范围为 x ∈ [ 0 − 255 ] , x ∈ Z x\in[0-255],x\in\mathbb{Z} x∈[0−255],x∈Z能够表示图像的明暗变化、纹理等细节。 对于灰度图像 f [ x , y ] f[x,y] f[x,y]我们可以通过阈值集合 T θ ( f [ x , y ] ) { [ x , y ] : f [ x , y ] ≥ θ } , − ∞ θ ∞ T_{\theta}(f[x,y])\{[x,y]:f[x,y]\geq\theta\},-\infty\theta\infty Tθ​(f[x,y]){[x,y]:f[x,y]≥θ},−∞θ∞ 来分解图像原始图像可由 f [ x , y ] s u p { θ : [ x , y ] ∈ T θ ( f [ x , y ] ) } f[x,y]sup\{\theta:[x,y]\in T_{\theta}(f[x,y])\} f[x,y]sup{θ:[x,y]∈Tθ​(f[x,y])} 重建。 阈值集合表示的是图像中灰度值大于等于的 θ \theta θ 所有像素点的集合。如果 θ 128 \theta128 θ128 那么 T 128 ( f [ x , y ] ) T_{128}(f[x,y]) T128​(f[x,y]) 就是图像中所有灰度值大于等于 128 128 128 的像素点的集合。 简单来说对于灰度图像我们可以通过一个叫做阈值化的操作来分解图像然后可以通过 supremum​ 操作重建图像。 ‍ ‍ Flat/一般腐蚀算子 ‍ 灰度形态学中Flat腐蚀算子定义如下 g [ x , y ] min ⁡ { W ( ) { f [ x , y ] } } : e r o d e ( f , W ) g[x,y]\min\{W^{()}\{f[x,y]\}\}:erode(f,W) g[x,y]min{W(){f[x,y]}}:erode(f,W) 其中 ‍ f [ x , y ] f[x,y] f[x,y] 是原始的灰度图像在坐标 ( x , y ) (x,y) (x,y) 处的像素值 W ( ) W^{()} W() 是结构元素相关的邻域“窗口”算子 g [ x , y ] g[x,y] g[x,y] 是腐蚀后的图像在坐标 ( x , y ) (x,y) (x,y) 处的像素值 ‍ 其含义为在图像的每个像素位置取结构元素窗口 W W W 内的最小值作为该像素的新值。 那么图像中的暗区域就会扩大而明亮区域就会缩小(因为变成小值了越小越暗)。 也就是暗大明小。 ‍ 灰度形态学中一般腐蚀算子定义如下 g [ x , y ] inf ⁡ α , β { f [ x α , y β ] − w [ α , β ] } e r o d e ( f , w ) g[x,y]\inf_{\alpha,\beta}\{f[x\alpha,y\beta]-w[\alpha,\beta]\}erode(f,w) g[x,y]α,βinf​{f[xα,yβ]−w[α,β]}erode(f,w) 这里 inf​ 表示取下确界(类似最小值)。 其含义为对于图像 f [ x , y ] f[x,y] f[x,y] 中的每个像素点 ( x , y ) (x,y) (x,y) 要在结构元素 w [ α , β ] w[\alpha,\beta] w[α,β] 所覆盖的邻域内进行计算即计算 f [ x α , y β ] f[x\alpha,y\beta] f[xα,yβ]即图像在平移 ( α , β ) (\alpha,\beta) (α,β) 后的像素值与结构元素在 ( α , β ) (\alpha,\beta) (α,β) 位置的值的差值并取这些差值中的下确界作为像素点 ( x , y ) (x,y) (x,y) 经过腐蚀后的新值 g [ x , y ] g[x,y] g[x,y]。 ‍ ‍ Flat/一般膨胀算子 ‍ 灰度形态学中Flat膨胀算子定义如下 g [ x , y ] max ⁡ { W ( − ) { f [ x , y ] } } : d i l a t e ( f , W ) g[x,y]\max\{W^{(-)}\{f[x,y]\}\}:dilate(f,W) g[x,y]max{W(−){f[x,y]}}:dilate(f,W) 与Flat腐蚀算子相反它所做的是在图像的每个像素位置取结构元素窗口 W W W 内的最大值作为该像素的新值。 那么图像中的明亮区域就会扩大而暗区域就会缩小(因为变成大值了越大越亮)。 也就是明大暗小。 ‍ 灰度形态学中一般膨胀算子定义如下 g [ x , y ] s u p α , β { f [ x − α , y − β ] w [ α , β ] } s u p α , β { w [ x − α , y − β ] f [ α , β ] } g[x,y]sup_{\alpha,\beta}\{f[x-\alpha,y-\beta]w[\alpha,\beta]\}sup_{\alpha,\beta}\{w[x-\alpha,y-\beta]f[\alpha,\beta]\} g[x,y]supα,β​{f[x−α,y−β]w[α,β]}supα,β​{w[x−α,y−β]f[α,β]} 这里的 s u p sup sup 表示取上确界类似于取最大值。对于图像 f [ x , y ] f[x,y] f[x,y] 中的每个像素点 ( x , y ) (x,y) (x,y)在结构元素 w [ α , β ] w[\alpha,\beta] w[α,β] 的邻域内计算 f [ x − α , y − β ] f[x-\alpha,y-\beta] f[x−α,y−β]图像平移 ( − α , − β ) (-\alpha,-\beta) (−α,−β) 后的像素值与 w [ α , β ] w[\alpha,\beta] w[α,β] 的和并取这些和中的上确界作为像素点 ( x , y ) (x,y) (x,y) 经过膨胀后的新值 g [ x , y ] g[x,y] g[x,y]。 ‍ ‍ Flat腐蚀和膨胀算子和一般腐蚀和膨胀算子 ‍ 从名字上可以猜到Flat算子其实是一般算子的特殊情况。 用途上就是没特殊需要或者精度要求就用Flat算子简单处理即可否则就要使用计算更加复杂的一般算子来处理。 ‍ ‍ 形态学边缘检测(Morphological edge detectors) ‍ 简要介绍 ‍ 我们知道腐蚀去皮肉留下骨头膨胀让骨头长出肉那么我们将膨胀后的结果与腐蚀后的结果进行差异的比较那么是不是就可以直接得到外面的皮肉的轮廓了 正式点说对原图像腐蚀会减小前景物体对原图像膨胀会增大前景物体那么两者的差异则是物体的边界轮廓。 但是有个前提如下 ‍ e r o d e ( f , W ) ≠ f A N D d i l a t e ( f , W ) ≠ e r o d e ( f , W ) erode(f,W)\neq f \space AND \space dilate(f,W)\neq erode(f,W) erode(f,W)f AND dilate(f,W)erode(f,W) ‍ 在图像中边缘检测可突出物体轮廓有助于后续的目标识别、图像分割等任务如检测图像中物体的边界。 ‍ 优点保持边缘连通性对噪声鲁棒性较好缺点边缘定位精度相对较低依赖于结构元素的选择 ‍ ‍ 对于二值图像 ‍ g e d g e [ x , y ] g d i l a t e [ x , y ] X O R g e r o d e [ x , y ] g_{edge}[x,y] g_{dilate}[x,y] \space XOR \space g_{erode}[x,y] gedge​[x,y]gdilate​[x,y] XOR gerode​[x,y] ‍ 我们知道二值图像只有 { 0 , 1 } \left\lbrace0,1\right\rbrace {0,1} 两种值那么我们将膨胀运算后的结果与腐蚀运算后的结果进行逻辑异或运算就可以精确地提取出边缘像素进而直接显示出物体的轮廓边界。 ‍ ‍ 对于灰度图像 ‍ g e d g e [ x , y ] g d i l a t e [ x , y ] − g e r o d e [ x , y ] g_{edge}[x,y] g_{dilate}[x,y] - g_{erode}[x,y] gedge​[x,y]gdilate​[x,y]−gerode​[x,y] ‍ ‍ ‍ ‍ 参考资料 ‍ data ‍ Lena图等: http://www.eecs.qmul.ac.uk/~phao/IP/Images/ 检索到的出处: https://blog.csdn.net/nbu_dahe/article/details/114698790 ‍ blog and related sources ‍ 图像数学形态学的基本原理与代码实现腐蚀、膨胀、开闭运算https://blog.csdn.net/deepsprings/article/details/107291741第8章形态学操作 https://blog.csdn.net/weixin_57440207/article/details/122647000斯坦福大学Bernd Girod教授的《数字图像处理》课程的讲义: https://web.stanford.edu/class/ee368/Handouts/Lectures/2015_Autumn/7-Morphological_16x9.pdf
http://www.dnsts.com.cn/news/163927.html

相关文章:

  • 北京公司可以在上海建网站吗网站开发者id
  • 企业网站推广服务如何修改wordpress权限
  • 外贸建站模板价格企业网站推广最有效的方法
  • 乌海建设局网站wordpress远程访问
  • 怎么做网站用于推广wordpress管理后台没有登陆
  • 整形网站 源码网站前端模板下载
  • 网站打开速度慢是否需要升级带宽网站快速收录方法
  • 品牌网站建设帮你大蝌蚪自己搭建网站的步骤
  • 登建设厅锁子的是哪个网站ytwzjs烟台网站建设
  • 徐州市建设局网站软件工程考研要考哪些科目
  • 教育类网站开发模板营销软文范例大全
  • 怎样建设一个购物网站安装wordpress安装地址修改
  • 地方网站发展方向网页设计怎么分析网站啊
  • 成都公司核名的网站wordpress主题下载
  • 在那里做网站换网站公司
  • 网站开发公司vue框架搜索引擎营销的原理是什么
  • 自己做网站创业个人网页设计
  • 微信微网站是什么格式代理网页地址
  • 南宁网站设计公司正能量应该懂我的意思
  • 佛山网站优化服务北京推广
  • seo实战培训班佛山厂家推广优化
  • 做网站那个公司百度云 wordpress 教程
  • 怎么在百度上发广告网站关键词优化公司哪家好
  • 用织梦做的网站ftp怎么登陆西安市建设工程交易信息网
  • 杭州北京网站建设公司哪家好建设众筹类网站
  • 营销型网站制作成都微博营销案例有哪些
  • 宽城区建设局网站html代码是什么
  • 烟台做外贸网站重庆快速排名优化
  • 怎么做m开头的网站交易平台
  • 济南网站技术怎么做网站建设的ppt