好的,以下是一个基于传统图像处理算法的 Python 代码,实现灰度图像的分类:
``` python
import os
import cv2
import numpy as np
# 定义图像路径和分类标签
image_dir = 'path/to/image/directory'
categories = ['cat', 'dog']
# 定义图像大小和像素阈值
image_size = 50
threshold = 100
# 加载图像数据
def load_data():
data = []
for category in categories:
path = os.path.join(image_dir, category)
label = categories.index(category)
for img in os.listdir(path):
img_path = os.path.join(path, img)
try:
# 转换为灰度图并调整大小
gray_img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
resized_img = cv2.resize(gray_img, (image_size, image_size))
# 二值化处理
_, thresh_img = cv2.threshold(resized_img, threshold, 255, cv2.THRESH_BINARY)
# 将图像数据和标签添加到列表中
data.append([np.array(thresh_img), label])
except Exception as e:
pass
return data
# 定义特征提取函数
def extract_features(img):
# 计算图像的平均灰度值
mean_gray = np.mean(img)
# 计算图像的方差值
var_gray = np.var(img)
# 计算图像的梯度值
grad_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
grad_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
grad_mag = np.sqrt(grad_x**2 + grad_y**2)
mean_grad = np.mean(grad_mag)
var_grad = np.var(grad_mag)
# 将特征向量返回
return [mean_gray, var_gray, mean_grad, var_grad]
# 加载图像数据并进行特征提取
data = load_data()
np.random.shuffle(data)
X = []
y = []
for features, label in data:
X.append(extract_features(features))
y.append(label)
# 转换为numpy数组并进行归一化处理
X = np.array(X)
X = (X - np.mean(X, axis=0)) / np.std(X, axis=0)
y = np.array(y)
# 拆分为训练集和测试集
train_size = int(0.8 * len(X))
X_train = X[:train_size]
y_train = y[:train_size]
X_test = X[train_size:]
y_test = y[train_size:]
# 定义分类器并进行训练
from sklearn.svm import SVC
clf = SVC()
clf.fit(X_train, y_train)
# 进行预测
def predict(image_path):
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
resized_img = cv2.resize(img, (image_size, image_size))
_, thresh_img = cv2.threshold(resized_img, threshold, 255, cv2.THRESH_BINARY)
features = extract_features(thresh_img)
X = np.array(features).reshape(1, -1)
X = (X - np.mean(X_train, axis=0)) / np.std(X_train, axis=0)
prediction = clf.predict(X)
return categories[prediction[0]]
# 测试预测函数
print(predict('path/to/test/image'))
```
这段代码中,我们首先定义了图像路径和分类标签,然后通过 `load_data()` 函数加载图像数据,并将图像数据进行灰度化、大小调整、二值化等处理,最终将图像数据和标签添加到列表中。然后,我们定义了一个特征提取函数 `extract_features()`,该函数计算图像的平均灰度值、方差值、梯度值等特征,并将特征向量返回。接着,我们对图像数据进行特征提取,并将特征向量进行归一化处理。然后,我们将数据随机拆分为训练集和测试集,并使用支持向量机分类器进行训练。最后,我们定义了一个预测函数 `predict()`,将图像进行预处理并进行预测。