使用分水岭算法批量处理图像文件并保存结果
时间: 2023-09-12 14:10:37 浏览: 158
分水岭算法是一种图像分割算法,可以将图像分成多个区域,每个区域具有不同的特征。这个算法可以用来处理图像中的物体分割,例如将一个水滴从背景中分离出来。
下面是使用Python和OpenCV库实现批量处理图像文件并保存结果的示例代码:
```python
import cv2
import os
# 图像文件夹路径
folder_path = 'path/to/folder'
# 循环遍历文件夹中的所有图像文件
for filename in os.listdir(folder_path):
if filename.endswith('.jpg') or filename.endswith('.png'):
# 读取图像
img_path = os.path.join(folder_path, filename)
img = cv2.imread(img_path)
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# 去除噪声
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=3)
# 获取前景
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
ret, sure_fg = cv2.threshold(dist_transform, 0.7*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 = cv2.watershed(img, markers)
img[markers == -1] = [255,0,0]
# 保存结果
result_path = os.path.join(folder_path, 'result', filename)
cv2.imwrite(result_path, img)
```
这个代码将遍历一个文件夹中的所有图像文件,并使用分水岭算法处理每个图像。处理后的图像将保存在一个名为“result”的子文件夹中。注意,代码中使用了一些OpenCV的函数来实现分水岭算法,包括cv2.threshold()、cv2.morphologyEx()、cv2.distanceTransform()和cv2.watershed()。
阅读全文