江苏网站开发建设,设计方案怎么讲解,网站风格有哪些类型,广告设计公司 上海膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的#xff0c;膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象#xff08;前景#xff09;接触到的背景点合并到当前对象内#xff0c;从而实现将图像的边界点向外扩张。如果图像内两个对象的… 膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象前景接触到的背景点合并到当前对象内从而实现将图像的边界点向外扩张。如果图像内两个对象的距离较近那么在膨胀的过程中两个对象可能会连通在一起。膨胀操作对填补图像分割后图像内所存在的空白相当有帮助。 原理
二值图像的膨胀示例如图 8-8 所示。
同腐蚀过程一样在膨胀过程中也是使用一个结构元来逐个像素地扫描要被膨胀的图像并根据结构元和待膨胀图像的关系来确定膨胀结果。 例如在图 8-9 中整幅图像的背景色是黑色的前景对象是一个白色的圆形。图像左上角的深色小块表示遍历图像所使用的结构元。在膨胀过程中要将该结构元逐个像素地遍历整幅图像并根据结构元与待膨胀图像的关系来确定膨胀结果图像中与结构元中心点对应位置像素点的值。 图 8-10 中的两幅图像代表结构元与前景色的两种不同关系。根据这两种不同关系来决定 膨胀结果图像中与结构元中心像素重合的点的像素值。
如果结构元中任意一点处于前景图像中就将膨胀结果图像中对应像素点处理为前景色。如果结构元完全处于背景图像外就将膨胀结果图像中对应像素点处理为背景色。 针对图 8-10 中的图像膨胀的结果就是前景对象的白色圆直径变大。上述结构元也被称为核。
例如有待膨胀的图像 img其值为
[[0 0 0 0 0]
[0 0 0 0 0]
[0 1 1 1 0]
[0 0 0 0 0]
[0 0 0 0 0]]有一个结构元 kernel其值为
[[1]
[1]
[1]]如果使用结构元 kernel 对图像 img 进行膨胀则可以得到膨胀结果图像 rst
[[0 0 0 0 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 0 0 0 0]]这是因为当结构元 kernel 在图像 img 内逐个像素地进行遍历时当核 kernel 的中心点 kernel[1,0]位于 img 中的 img[1,1]、img[1,2]、img[1,3]、img[2,1]、img[2,2]、img[2,3]、img[3,1]、img[3,2]或 img[3,3]处时核内像素点都存在与前景对象重合的像素点。所以在膨胀结果图像中这 9 个像素点的值被处理为 1其余像素点的值被处理为 0。
上述示例的示意图如图 8-11 所示其中 图(a)表示待膨胀的 img。 图(b)是核 kernel。 图©中的阴影部分是 kernel 在遍历 img 时kernel 中心像素点位于 img[1,1]、img[3,3] 时与前景色存在重合像素点的两种可能情况实际上共有 9 个这样的与前景对象重合的可能位置。核 kernel 的中心分别位于 img[1,1]、img[1,2]、img[1,3]、img[2,1]、img[2,2]、 img[2,3]、img[3,1]、img[3,2]或 img[3,3]时核内像素点都存在与前景图像重合的像素点。 图(d)是膨胀结果图像 rst。在 kernel 内当任意一个像素点与前景对象重合时其中心点所对应的膨胀结果图像内的像素点值的为 1当 kernel 与前景对象完全无重合时其中心点对应的膨胀结果图像内像素点的值为 0。 函数说明
在 OpenCV 内采用函数 cv2.dilate()实现对图像的膨胀操作该函数的语法结构为 dst cv2.dilate( src, kernel[, anchor[, iterations[, borderType[, borderValue]]]]) 式中
dst 代表膨胀后所输出的目标图像该图像和原始图像具有同样的类型和大小。src 代表需要进行膨胀操作的原始图像。图像的通道数可以是任意的但是要求图像的深度必须是 CV_8U、CV_16U、CV_16S、CV_32F、CV_64F 中的一种。element 代表膨胀操作所采用的结构类型。它可以自定义生成也可以通过函数cv2.getStructuringElement()生成。 参数 kernel、anchor、iterations、borderType、borderValue 与函数 cv2.erode()内相应参数的含义一致。
代码示例使用数组演示膨胀的基本原理
import cv2
import numpy as np
imgnp.zeros((5,5),np.uint8)
img[2:3,1:4]1
kernel np.ones((3,1),np.uint8)
#对图像进行膨胀操作
dilation cv2.dilate(img,kernel)
print(img\n,img)
print(kernel\n,kernel)
print(dilation\n,dilation)运行结果
img[[0 0 0 0 0][0 0 0 0 0][0 1 1 1 0][0 0 0 0 0][0 0 0 0 0]]
kernel[[1][1][1]]
dilation[[0 0 0 0 0][0 1 1 1 0][0 1 1 1 0][0 1 1 1 0][0 0 0 0 0]]
从本例中可以看到只要当核 kernel 的任意一点处于前景图像中时就将当前中心点所对应的膨胀结果图像内像素点的值置为 1。
示例2使用函数 cv2.dilate()完成图像膨胀操作。 代码如下;
import cv2
import numpy as np
ocv2.imread(dilation.bmp,cv2.IMREAD_UNCHANGED)
kernel np.ones((9,9),np.uint8)
dilation cv2.dilate(o,kernel)
cv2.imshow(original,o)
cv2.imshow(dilation,dilation)
cv2.waitKey()
cv2.destroyAllWindows()在本例中使用语句 kernelnp.ones((9,9),np.uint8)生成 9×9 的核来对原始图像进行膨胀操作。
运行结果
左图是原始图像右图是膨胀处理结果。从图中可以看到膨胀操作将原始图像“变粗”了。
示例3调节函数 cv2.dilate()的参数观察不同参数控制下的图像膨胀效果。
import cv2
import numpy as np
ocv2.imread(dilation.bmp,cv2.IMREAD_UNCHANGED)
kernel np.ones((5,5),np.uint8)
dilation cv2.dilate(o,kernel,iterations 9)
cv2.imshow(original,o)
cv2.imshow(dilation, dilation)
cv2.waitKey()
cv2.destroyAllWindows()在本例中参数做了两个调整
核的大小变为 5×5。使用语句 iterations 9 对迭代次数进行控制让膨胀重复 9 次。
运行结果 左图是原始图像右图是膨胀处理结果。从图中 可以看到膨胀操作让原始图像实现了“生长”。在本例中由于重复了 9 次所以图像被膨胀得更严重了。
更多的操作自己多动手实验感受一下