我的数据集是D:\wjd这个路径下有八个文件夹,分别是Al,Ag,Au,Cu,Mo,Cu,V,W这8个文件夹,每个文件夹下面是300张1000*1000的格式为png的ovito三色图,现在想用一种无监督方法对这个路径下D:\wjd下的8个文件夹的图片进行特征提取,然后归为两大类,一类是FCC,一类是BCC,然后把分类结果放到两个文件夹里,一个叫FCC,另外一个叫BCC可以根据这些描述,给我写程序吗
时间: 2024-02-21 11:01:25 浏览: 160
好的,根据您的描述,我可以给您提供一个简单的流程:
1. 导入必要的库和模块:
```python
import os
import cv2
import numpy as np
from sklearn.cluster import KMeans
```
2. 定义一个函数来读取图像数据并提取特征:
```python
def extract_features(image_path):
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
pixels = np.float32(image.reshape(-1, 3))
kmeans = KMeans(n_clusters=2, random_state=42).fit(pixels)
labels = kmeans.labels_.reshape(image.shape[:2])
features = np.concatenate([np.mean(pixels[labels == i], axis=0) for i in range(2)])
return features
```
3. 定义一个函数来对图像进行分类:
```python
def classify_images(image_dir):
for subdir in ['FCC', 'BCC']:
os.makedirs(os.path.join(image_dir, subdir), exist_ok=True)
for metal in os.listdir(image_dir):
metal_dir = os.path.join(image_dir, metal)
if not os.path.isdir(metal_dir):
continue
for image_file in os.listdir(metal_dir):
if not image_file.endswith('.png'):
continue
image_path = os.path.join(metal_dir, image_file)
features = extract_features(image_path)
if features[0] > features[1]:
subdir = 'FCC'
else:
subdir = 'BCC'
dest_path = os.path.join(image_dir, subdir, metal + '_' + image_file)
os.rename(image_path, dest_path)
```
4. 调用 `classify_images` 函数对图像进行分类:
```python
image_dir = 'D:/wjd'
classify_images(image_dir)
```
这个程序会遍历 `D:/wjd` 目录下的每个子目录,为每个图像提取特征并根据特征值将其分类到 `FCC` 或 `BCC` 目录中。注意,在运行程序之前,请确保 `D:/wjd` 目录下只包含您要处理的图像文件夹和图像文件。
阅读全文