用python写一个图像边界线提取和骨架化提取代码 要求图像批量输入和图像批量输出
时间: 2024-05-07 21:19:30 浏览: 77
并行图像细化算法和C代码实现.rar_thinning_并行细化算法_线条提取_细化_骨架提取
好的,我可以为您提供一个基于Python的边界线提取和骨架化提取代码,并支持批量输入和输出图像。
代码如下:
```python
import cv2
import os
# 边界线提取函数
def get_contour(img):
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行二值化处理
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 提取轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
return img
# 骨架化提取函数
def get_skeleton(img):
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行二值化处理
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 进行形态学处理,获取骨架
size = np.size(binary)
skel = np.zeros(binary.shape, np.uint8)
element = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
done = False
while not done:
eroded = cv2.erode(binary, element)
temp = cv2.dilate(eroded, element)
temp = cv2.subtract(binary, temp)
skel = cv2.bitwise_or(skel, temp)
binary = eroded.copy()
zeros = size - cv2.countNonZero(binary)
if zeros == size:
done = True
# 显示骨架
cv2.imshow("skeleton", skel)
cv2.waitKey(0)
return skel
# 批量处理函数
def batch_process(path, process_func):
# 遍历指定路径下所有图像
for file_name in os.listdir(path):
# 仅处理jpg和png格式的图像文件
if file_name.endswith(".jpg") or file_name.endswith(".png"):
# 读取图像
img_path = os.path.join(path, file_name)
img = cv2.imread(img_path)
# 进行图像处理
img_processed = process_func(img)
# 保存处理后的图像
processed_path = os.path.join(path, "processed")
if not os.path.exists(processed_path):
os.makedirs(processed_path)
processed_file_name = os.path.splitext(file_name)[0] + "_processed.jpg"
processed_file_path = os.path.join(processed_path, processed_file_name)
cv2.imwrite(processed_file_path, img_processed)
# 测试
if __name__ == '__main__':
# 指定图像路径
img_path = "your_image_folder_path"
# 批量进行边界线提取
batch_process(img_path, get_contour)
# 批量进行骨架化提取
batch_process(img_path, get_skeleton)
```
在代码中,我们定义了两个图像处理函数:`get_contour` 和 `get_skeleton`,分别用于边界线提取和骨架化提取。这两个函数都接受一个图像作为输入,并返回处理后的图像。
我们还定义了一个批量处理函数 `batch_process`,该函数接受一个图像路径和一个处理函数作为参数,遍历指定路径下的所有图像,对每个图像应用指定的处理函数,并保存处理后的图像。
您只需要将您的图像放在指定路径下,运行代码即可批量处理所有图像。处理后的图像将保存在`processed`文件夹中。
阅读全文