
一、实验目的掌握使用形态学方法处理图像。熟悉形态学图像分割的基本理论和方法二、实验内容1.对图像noise.png进行腐蚀操作选择结构元素为[1 1 1;1 1 1;1 1 1]和[1 1 1 1 1;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1;1 1 1 1 1]观察其处理效果的异同。图1 noise.pngimport cv2 import numpy as np import matplotlib.pyplot as plt img cv2.imread(r./image/noise.png, 0) # 定义两种结构元素 kernel3 np.ones((3, 3), np.uint8) kernel5 np.ones((5, 5), np.uint8) # 腐蚀操作 erode3 cv2.erode(img, kernel3, iterations1) erode5 cv2.erode(img, kernel5, iterations1) plt.figure(figsize(12, 4)) plt.subplot(131), plt.imshow(img, cmapgray), plt.title(原图) plt.subplot(132), plt.imshow(erode3, cmapgray), plt.title(3x3) plt.subplot(133), plt.imshow(erode5, cmapgray), plt.title(5x5) plt.show()相同点两种结构元素都会对图像中的亮区域进行腐蚀减少噪声点使图像边缘变瘦。不同点3x3结构元素腐蚀程度较轻保留更多图像细节但对较大噪声去除效果有限。5x5结构元素腐蚀程度更强能去除更大的噪声点但会导致图像细节损失更多。2.对图像text.tif进行膨胀操作选择结构元素为[1 1 1;1 1 1;1 1 1]和[0 1 0;1 1 1;0 1 0]观察其处理效果的异同如果一次膨胀的效果不明显可多次膨胀再比较图2 text.tifimport cv2 import numpy as np import matplotlib.pyplot as plt img cv2.imread(r./image/text.tif, 0) # 定义两种结构元素 kernel1 np.ones((3, 3), np.uint8) kernel2 np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]], np.uint8) # 膨胀操作可修改 iterations 次数来多次膨胀 iterations 2 dilate1 cv2.dilate(img, kernel1, iterationsiterations) dilate2 cv2.dilate(img, kernel2, iterationsiterations) plt.figure(figsize(12, 4)) plt.subplot(131) plt.imshow(img, cmapgray) plt.title(Original Image) plt.subplot(132) plt.imshow(dilate1, cmapgray) plt.title(Dilated with Kernel1) plt.subplot(133) plt.imshow(dilate2, cmapgray) plt.title(Dilated with Kernel2) plt.show()相同点两种结构元素的膨胀操作都会使图像中的亮区域扩大填充一些小的间隙让文字看起来更“粗”。不同点结构元素[1 1 1;1 1 1;1 1 1]是全1的正方形膨胀时会向各个方向均匀扩展文字的各个方向边缘都会等距变粗。结构元素[0 1 0;1 1 1;0 1 0]中间行全1上下行中间为1膨胀时在水平方向以及垂直方向的中间部分扩展更明显文字的水平笔画以及垂直笔画的中间部分会比使用全1结构元素时更粗整体形状在扩展方式上与全1结构元素有差异。3.对图像Fingerprint.png进行形态学处理得到干净的指纹图像。图3 Fingerprint.pngimport cv2 import numpy as np img cv2.imread(r./image/Fingerprint.png, 0) # 定义结构元素这里选择椭圆形结构元素也可根据需要调整大小 kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) # 先进行开运算腐蚀膨胀去除小的噪声点 opening cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) # 再进行闭运算膨胀腐蚀填充指纹纹线间的小间隙 closing cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel) cv2.imshow(Original, img) cv2.imshow(Processed, closing) cv2.waitKey(0) cv2.destroyAllWindows()4.思考题如果想让第1题的图1经过形态学处理得到图4的效果目标大小没有太大变化用什么形态学操作更好图4开运算先腐蚀后膨胀是更合适的选择。开运算的步骤先对图像进行腐蚀操作再进行膨胀操作。腐蚀可去除图像中的小噪声点同时会让目标主体有一定收缩。膨胀在腐蚀的基础上将目标主体再膨胀回接近原来的大小这样既保留了目标的整体形态又消除了小噪声使图像更干净更接近图4的效果。import cv2 import numpy as np img cv2.imread(r./image/noise.png, 0) # 定义3x3结构元素 kernel np.ones((3, 3), np.uint8) # 开运算处理去噪同时保持目标大小 result cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) cv2.imshow(Original, img) cv2.imshow(Processed, result) cv2.waitKey(0) cv2.destroyAllWindows()