图像形态学

# 在绘图中显示中文字体,而非乱码
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]
import cv2
import matplotlib.pyplot as plt
import numpy as np

1、导入一张图像,对其进行二值化,然后实现二值图像的腐蚀和膨胀运算,并观察和记录连续执行腐蚀和膨胀运算后,二值图像的变化过程。

# 第一题代码部分
img = cv2.imread(你的图片, cv2.IMREAD_GRAYSCALE)
img1 = 255 - img
e, img_thre = cv2.threshold(img1, 160, 255, cv2.THRESH_BINARY)
title_list = ["原始图像", "二值图像"]
img_list = [img, img_thre]
for i in range(2):
    plt.subplot(1, 2, i+1)
    plt.imshow(img_list[i], 'gray')
    plt.title(title_list[i])
    plt.xticks([])
    plt.yticks([])
plt.show()
#开运算
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (11, 11))
eroded11 = cv2.erode(img_thre, kernel1,1)
dilated11 = cv2.dilate(eroded11, kernel1,1)
title_list1 = ["结构矩形元素", "腐蚀图像", "腐蚀后膨胀图像"]
img_list1 = [ kernel1, eroded11, dilated11]
for i in range(3):
    plt.subplot(1, 3, i+1)
    plt.imshow(img_list1[i], 'gray')
    plt.title(title_list1[i])
    plt.xticks([])
    plt.yticks([])
plt.show()

#闭运算
kernel4 = cv2.getStructuringElement(cv2.MORPH_RECT, (11, 11))
dilated41 = cv2.dilate(img_thre, kernel4,1)
eroded41 = cv2.erode(dilated41, kernel4,1)
title_list4 = ["结构矩形元素", "膨胀图像", "膨胀后腐蚀图像"]
img_list4 = [ kernel4, dilated41, eroded41]
for i in range(3):
    plt.subplot(1, 3, i+1)
    plt.imshow(img_list4[i], 'gray')
    plt.title(title_list4[i])
    plt.xticks([])
    plt.yticks([])
plt.show()

#开闭运算
kernel3 = cv2.getStructuringElement(cv2.MORPH_RECT, (11, 11))
eroded31 = cv2.erode(img_thre, kernel3,1)
dilated31 = cv2.dilate(eroded31, kernel3,1)
dilated32 = cv2.dilate(dilated31, kernel3,1)
eroded32 = cv2.erode(dilated32, kernel3,1)
title_list3 = ["结构矩形元素", "腐蚀图像", "腐蚀后膨胀图像","膨胀2","腐蚀2"]
img_list3 = [ kernel3,eroded31,dilated31,dilated32,eroded32]
for i in range(5):
    plt.subplot(2, 3, i+1)
    plt.imshow(img_list3[i], 'gray')
    plt.title(title_list3[i])
    plt.xticks([])
    plt.yticks([])
plt.show()

第一题文字部分:

对二值图像而言:

腐蚀:腐蚀操作会消除二值图像中前景对象的细小突出部分,缩小对象的大小,并且消除小的噪声点。

膨胀:膨胀操作会扩大二值图像中前景对象的边界,填补对象内部的小孔,并且连接相邻的对象

开运算:开运算是先腐蚀后膨胀的组合,可以用来消除小的噪声点,并且分离相距较近的对象。开运算会移除二值图像中小的白色区域(噪声),并且平滑较大白色区域的边界。

闭运算:闭运算是先膨胀后腐蚀的组合,可以用来填充前景对象内部的小孔和裂缝,并且消除小的黑色区域(空洞)。闭运算会填补二值图像中白色区域的小洞,并且平滑黑色区域的边界。

开闭运算:开闭运算可以是先进行闭运算再进行开运算,或者相反。开闭运算可以平滑图像的边界,同时减少噪声。开闭运算会使得二值图像的边界更加平滑,小的噪声点被去除,小的空洞被填补,但不会改变对象的整体形状和大小。

2、导入一幅图像,综合运用本章所学内容,对其进行图像分割(需涉及形态学相关运算),并简要叙述代码编写思路。

# 第二题代码部分
img = cv2.imread(你的图片)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
thresh=255-thresh
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
sure_bg = cv2.dilate(opening, kernel, iterations=2)
sure_fg = cv2.erode(opening, kernel, iterations=2)
unknown = cv2.subtract(sure_bg, sure_fg) 
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
cv2.normalize(dist_transform, dist_transform, 0, 1.0, cv2.NORM_MINMAX)
ret, sure_fg = cv2.threshold(dist_transform, 0.5*dist_transform.max(), 255, 0)
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)
ret, markers = cv2.connectedComponents(sure_fg)
markers = markers+1
markers[unknown==255] = 0
markers_copy = markers.copy()
markers_copy[markers==0] = 150 
markers_copy[markers==1] = 0  
markers_copy[markers>1] = 255 
markers_copy = np.uint8(markers_copy)
markers = cv2.watershed(img, markers)
img[markers==-1] = [0,0,255] 
title_list = ["二值图像", "距离图像", "确定前景", "确定背景", "不确定部分", "分割结果"]
img_list = [thresh, dist_transform, sure_fg, sure_bg, unknown, markers]
for i in range(6):
    plt.subplot(1, 6, i+1)
    plt.imshow(img_list[i], 'gray')
    plt.title(title_list[i])
    plt.xticks([])
    plt.yticks([])
plt.show()

第二题文字部分:

1.读取图像后,转变为二值图像,然后进行降噪处理,创建一个3x3的矩形结构元素,使用cv2.morphologyEx函数进行开运算,以消除噪声和平滑较大白色区域的边界。随后确定背景和前景区域,分别使用cv2.dilate函数和cv2.erode函数对开运算后的图像进行膨胀/腐蚀,以分别确定背景和前景区域。

2.使用距离变换函数距离cv2.distanceTransform对开运算后的图像获取每个像素点到最近前景像素的距离,然后使用cv2.normalize函数将距离变换后的图像进行规范化,使其值在0到1.0之间。

3.使用分水岭算法cv2.connectedComponents函数对确定的前景区域进行连通域分析,得到标记图像。随后对标记图像进行处理,将背景标记为0,前景标记为255,未知区域标记为150使用cv2.watershed函数分割前景和背景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值