目录

一、腐蚀

二、膨胀

三、开运算

四、闭运算

五、形态学梯度

六、Top-Hat

七、Black-Hot

八、形态学操作之间的关系

九、构造结构化元素(核)


形态学转换原理:一般情况下对二值化图像进行操作。需要两个参数,一个是原始图像,另一个是结构化元素(核),它是用来决定操作的性质的。基本操作腐蚀膨胀,他们的变体构成了开运算、闭运算、梯度

谢谢这朵小花!!!

opencv 与大模型_opencv 与大模型

一、腐蚀

把前景物体的边界腐蚀掉,但是前景依然是白色的。卷积核沿着图像滑动,如果与卷积核对应的原始图片的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为0。根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为0),所以前景物体会变小整幅图片的白色区域会减少

这对于除去白噪声很有用,也可以用来断开两个连在一起的物体。

cv2.erode(img,kernel,iterations=1)

  • iterations:迭代数
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations=1)

image = np.hstack((img,erosion))

while True:
    cv2.imshow('image',image)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

opencv 与大模型_计算机视觉_02

二、膨胀

与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是1,中心元素的像素值就是1.所以这个操作会增加图像中白色区域(前景)。一般在去噪声时先腐蚀再膨胀。因为腐蚀再去掉白噪声的同时,也会使得前景对象变小,所以我们再膨胀。这时候噪声已经去除了,但是前景还在增加,膨胀也可以用来连接两个分开的物体。

cv2.dilate(img,kernel,iterations=1)

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(img,kernel,iterations=1)

image = np.hstack((img,dilation))

while True:
    cv2.imshow('image',image)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

opencv 与大模型_opencv 与大模型_03

三、开运算

先进行腐蚀再进行膨胀

被用来去除噪声

cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

image = np.hstack((img,opening))

while True:
    cv2.imshow('image',image)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

opencv 与大模型_计算机视觉_04

四、闭运算

先膨胀后腐蚀

被用来填充前景物体中的小洞,或者是前景中的小黑点

closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

image = np.hstack((img,closing))

while True:
    cv2.imshow('image',image)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

opencv 与大模型_计算机视觉_05

五、形态学梯度

其实就是一幅图像膨胀和腐蚀的差别所展现的样子,结果看上去像是前景物体的轮廓

cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
gradient = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)

image = np.hstack((img,gradient))

while True:
    cv2.imshow('image',image)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

opencv 与大模型_卷积_06

六、Top-Hat

原始图像与开运算之后得到的图像之间的差别

cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)

image = np.hstack((img,tophat))

while True:
    cv2.imshow('image',image)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

opencv 与大模型_卷积_07

七、Black-Hot

原始图像与闭运算之后得到的图像之间的差别

cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0)
kernel = np.ones((5,5),np.uint8)
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)

image = np.hstack((img,blackhat))

while True:
    cv2.imshow('image',image)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

opencv 与大模型_计算机视觉_08

八、形态学操作之间的关系

opencv 与大模型_cv_09

九、构造结构化元素(核)

之前的例子都是使用numpy构建的结构化元素,都是正方形的。

但是如果需要构建椭圆形或者是圆形的核,可以使用cv2.getStructuringElement(),只需要说明清楚核的形状和大小

import cv2
import numpy as np

rectangular_kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
ellipticalr_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
cross_shapedr_kernel= cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))

print('\nrectangularr_kernel\n',rectangularr_kernel)
print('\nellipticalr_kernel\n',ellipticalr_kernel)
print('\ncross_shapedr_kernel\n',cross_shapedr_kernel)

opencv 与大模型_cv_10