腐蚀、膨胀、开运算、闭运算

一、腐蚀、膨胀、开运算、闭运算

腐蚀:图像中的高亮部分进行膨胀
膨胀:原图中的高亮部分被腐蚀,类似于领域被蚕食
开运算:先腐蚀再膨胀,可以去掉目标外孤立的点
闭运算:先膨胀再腐蚀,可以去掉目标内的孔

二、python

以下图为例:
腐蚀、膨胀、开运算、闭运算_第1张图片
二值化图:
腐蚀、膨胀、开运算、闭运算_第2张图片

腐蚀后图:
腐蚀、膨胀、开运算、闭运算_第3张图片上述算法代码:

import cv2 as cv 
import matplotlib.pyplot as plt
def erode_demo(image):  #腐蚀
    print(image.shape)
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
    plt.figure("binary")
    plt.imshow(binary)
    plt.axis('off')
    plt.title('binary')
    plt.show()
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))#可以修改卷积核大小来增加腐蚀效果,越大腐蚀越强
    dst = cv.erode(binary,kernel)
    plt.figure("erode_demo")
    plt.imshow(dst)
    plt.axis('off')
    plt.title('erode_demo')
    plt.show()

src = cv.imread("./11.jpg")  #读取图片


erode_demo(src)
plt.figure("input image")
plt.imshow(src)
plt.axis('off')
plt.title('erode_demo')
plt.show()

opencv自带的腐蚀算法,效果不是很好:
腐蚀、膨胀、开运算、闭运算_第4张图片

上述算法代码:

import cv2
import numpy as np
 
## 测试图片,为反斜杠
pic = './11.jpg'
 
## a.图像的二值化 ,这里没有做阈值处理
src = cv2.imread(pic,cv2.IMREAD_UNCHANGED)
 
 
## b.设置卷积核5*5
kernel = np.ones((3,3),np.uint8)
 
## c.图像的腐蚀,默认迭代次数
erosion = cv2.erode(src,kernel)
 
## 效果展示
plt.figure("origin")
plt.imshow(src)
plt.axis('off')
plt.title('origin')
plt.show()
 
## 腐蚀后
plt.figure("after erosion")
plt.imshow(erosion)
plt.axis('off')
plt.title('after erosion')
plt.show()

膨胀:
腐蚀、膨胀、开运算、闭运算_第5张图片
代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
## 测试图片,为反斜杠
pic = './11.jpg'
 
## a.图像的二值化 ,这里没有做阈值处理
src = cv2.imread(pic,cv2.IMREAD_UNCHANGED)
 
 
## b.设置卷积核5*5
kernel = np.ones((5,5),np.uint8)

## 图像的膨胀
dst = cv2.dilate(src,kernel)
 
## 膨胀后

plt.figure("after dilate")
plt.imshow(dst)
plt.axis('off')
plt.title('after dilate')
plt.show()

开运算与闭运算:
腐蚀、膨胀、开运算、闭运算_第6张图片代码:

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

# 读取图片
source = cv.imread("./11.jpg", cv.IMREAD_GRAYSCALE)

# 设置卷积核
kernel = np.ones((5, 5),np.uint8)

# 图像腐蚀
erode_img = cv.erode(source, kernel)

# 图像膨胀
dilate_result = cv.dilate(erode_img, kernel)

# 显示结果
titles = ['Source Img','Erode Img','Dilate Img']
images = [source, erode_img, dilate_result]

# matplotlib 绘图
for i in range(3):
   plt.subplot(1, 3, i+1), plt.imshow(images[i],'gray')
   plt.title(titles[i])
   plt.xticks([]),plt.yticks([])

plt.show()

三、matlab

腐蚀:
J = imerode(I,SE)
J = imerode(I,nhood)
J = imerode(___,packopt,m)
J = imerode(___,shape)

J = imerode(I,SE) 腐蚀灰度图像、二值图像或压缩二值图像 I,返回腐蚀图像 J。SE 是结构元素对象或结构元素对象的数组,由 strel 或 offsetstrel 函数返回。

J = imerode(I,nhood) 腐蚀图像 I,其中 nhood 是由指定结构元素邻域的 0 和 1 组成的矩阵。imerode 函数通过 floor((size(nhood)+1)/2) 确定邻域的中心元素。

此语法等效于 imerode(I,strel(nhood))。

J = imerode(___,packopt,m) 指定输入图像 I 是否为压缩二值图像。m 指定原始未压缩图像的行维度。

J = imerode(___,shape) 指定输出图像的大小。

以下图为例:
腐蚀、膨胀、开运算、闭运算_第7张图片腐蚀:
腐蚀、膨胀、开运算、闭运算_第8张图片

originalBW = imread('text.png');
se = strel('line',11,90);
erodedBW = imerode(originalBW,se);
figure
imshow(erodedBW)

膨胀:
腐蚀、膨胀、开运算、闭运算_第9张图片

BW = imread('text.png');
se = strel('line',11,90);
BW2 = imdilate(BW,se);
figure, imshow(BW2), title('Dilated')

你可能感兴趣的:(opencv)