我的数据集是D:\wjd这个路径下分别是Al,W这2个子文件夹,每个子文件夹下面是300张1000*1000的格式为png的ovito三色图,现在想用一种无监督方法对这个路径下D:\wjd下的8个文件夹的图片进行特征提取,然后归为两大类,一类是FCC,一类是BCC,然后把分类结果放到两个文件夹里,一个叫FCC,另外一个叫BCC,这两个文件夹放在D:\wjd这个路径下,可以根据这些描述,给我写程序吗
时间: 2024-02-21 10:57:33 浏览: 84
好的,根据您的描述,我可以提供以下Python代码实现您的需求:
```python
import os
import cv2
import numpy as np
from sklearn.cluster import KMeans
# 定义路径和分类类别
path = "D:/wjd"
categories = ["FCC", "BCC"]
# 获取所有图片路径
file_paths = []
for category in categories:
folder_path = os.path.join(path, category)
for img_name in os.listdir(folder_path):
img_path = os.path.join(folder_path, img_name)
file_paths.append(img_path)
# 提取特征并聚类
features = []
for file_path in file_paths:
img = cv2.imread(file_path)
img = cv2.resize(img, (224, 224)) # 调整图片大小
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转换颜色通道
feature = np.reshape(img, (-1, 3))
features.append(feature)
features = np.concatenate(features, axis=0)
kmeans = KMeans(n_clusters=2, random_state=0).fit(features)
# 分类并保存图片
for i, file_path in enumerate(file_paths):
category = categories[kmeans.labels_[i]]
save_folder = os.path.join(path, category)
if not os.path.exists(save_folder):
os.makedirs(save_folder)
save_path = os.path.join(save_folder, os.path.basename(file_path))
img = cv2.imread(file_path)
cv2.imwrite(save_path, img)
```
代码实现的具体步骤如下:
1. 首先定义路径和分类类别,这里是"FCC"和"BCC"。
2. 获取所有图片路径,使用`os.listdir`遍历每个文件夹下的图片,将图片路径添加到`file_paths`列表中。
3. 读取每张图片并提取特征,这里使用了简单的RGB颜色直方图作为特征。将所有特征拼接成一个矩阵`features`。
4. 使用KMeans聚类算法将所有特征分为两类,这里设置聚类数为2。
5. 遍历所有图片路径,根据聚类结果将其分类并保存到对应的文件夹中。如果文件夹不存在则先创建文件夹。
请确保在运行代码之前已经安装了必要的Python库,如`opencv-python`和`scikit-learn`。另外,这里提取特征的方法比较简单,可能无法很好地区分FCC和BCC结构。如果需要更准确的分类结果,可以考虑使用更复杂的特征提取方法或者使用深度学习模型进行分类。
阅读全文