操作前的图片:
操作后:
代码实现:
import cv2
import numpy as np
from PIL import Image
import os
import matplotlib.pyplot as plt
# 生成文件夹
def makedir(path):
folder = os.path.exists(path)
if not folder:
os.makedirs(path)
print("...New folder...")
else:
print("...There is this folder!")
# 使用plt显示Image格式的图片
def plt_show_Image_image(image_show):
plt.figure()
plt.imshow(image_show)
plt.show()
def dilate_demo(d_image):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (6, 6)) # 定义结构元素的形状和大小
# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10)) # 椭圆形
# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (6, 6)) # 十字形
image = cv2.dilate(d_image, kernel) # 膨胀操作
# plt_show_Image_image(image)
return image
def erode_demo(e_image):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (6, 6)) # 定义结构元素的形状和大小 矩形
# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10)) # 椭圆形
# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (6, 6)) # 十字形
image = cv2.erode(e_image, kernel) # 腐蚀操作
# plt_show_Image_image(image)
return image
# 腐蚀主要就是调用cv2.erode(img,kernel,iterations),这个函数的参数是
# 第一个参数:img指需要腐蚀的图
# 第二个参数:kernel指腐蚀操作的内核,默认是一个简单的3X3矩阵,我们也可以利用getStructuringElement()函数指明它的形状
# 第三个参数:iterations指的是腐蚀次数,省略是默认为1
for i in range(0, 3):
# 图片存放的根目录
root_path = "C:\\FeigeDownload\\humanparsing\\"
# 同一个文件多次膨胀腐蚀
# 读取文件夹图片
a = str(i)
image_root = os.path.join(root_path, 'SegmantationClassDilateErode' + a)
# 图片列表
imagename_list = os.listdir(image_root) # '2500_1.jpg'
# 创建文件夹,作为存放图片的地方
b = str(i + 1)
new_image_root = os.path.join(root_path, 'SegmantationClassDilateErode' + b)
makedir(new_image_root)
# 保存图片
save_root = new_image_root
for m in imagename_list:
path = os.path.join(image_root, m)
img = cv2.imread(path)
# plt_show_Image_image(img)
# 对图片进行膨胀
mask_dil = dilate_demo(img)
# 对图片进行腐蚀
mask_dil_ero = erode_demo(mask_dil)
# 保存图片
save_path = os.path.join(save_root, m)
cv2.imwrite(save_path, mask_dil_ero)
# plt_show_Image_image(mask_dil_ero)
PS:有个bug,重复操作几次后的结果与初始时差不多???