From 8eedaec824137c944d2aec7a133807a0235386bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BA=B7=E9=A3=9E?= <13191081+shallowdreamqaq@user.noreply.gitee.com> Date: Sun, 16 Jul 2023 14:42:42 +0000 Subject: [PATCH] knn MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 王康飞 <13191081+shallowdreamqaq@user.noreply.gitee.com> --- 水稻叶片病害分类/大作业/run.py | 84 ++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 水稻叶片病害分类/大作业/run.py diff --git a/水稻叶片病害分类/大作业/run.py b/水稻叶片病害分类/大作业/run.py new file mode 100644 index 0000000..5d6a318 --- /dev/null +++ b/水稻叶片病害分类/大作业/run.py @@ -0,0 +1,84 @@ +# 调用第三方库 +import os +import cv2 +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.metrics import confusion_matrix, classification_report + +# 第一步 切分训练集和测试集 +X = [] # 定义图像名称 +Y = [] # 定义图像分类类标 +Z = [] # 定义图像像素 +for i in range(1, 4): + # 遍历文件夹,读取图片,本例中的图像文件可以在上面分享的链接中提取 + for f in os.listdir("photo\%s" % i): + # 获取图像名称 + X.append("photo//" + str(i) + "//" + str(f)) + # 获取图像类标即为文件夹名称 + Y.append(i) +X = np.array(X) +Y = np.array(Y) +# 随机率为100% 选取其中的30%作为测试集 +X_train, X_test, y_train, y_test = train_test_split(X, + Y, + test_size=0.3, + random_state=1) +print(len(X_train), len(X_test), len(y_train), len(y_test)) + +# 第二步 图像读取及转换为像素直方图 +# 训练集 +XX_train = [] +for i in X_train: + # 读取图像 + image = cv2.imread(i) + + # 图像像素大小一致 + img = cv2.resize(image, (256, 256), interpolation=cv2.INTER_CUBIC) + + # 计算图像直方图并存储至X数组 + hist = cv2.calcHist([img], [0, 1], None, [256, 256], + [0.0, 255.0, 0.0, 255.0]) + + XX_train.append(((hist / 255).flatten())) + +# 测试集 +XX_test = [] +for i in X_test: + # 读取图像 + # print i + image = cv2.imread(i) + # 图像像素大小一致 + img = cv2.resize(image, (256, 256), interpolation=cv2.INTER_CUBIC) + # 计算图像直方图并存储至X数组 + hist = cv2.calcHist([img], [0, 1], None, [256, 256], + [0.0, 255.0, 0.0, 255.0]) + XX_test.append(((hist / 255).flatten())) + +# 第三步 基于KNN的图像分类处理 +from sklearn.neighbors import KNeighborsClassifier # 调用分类器 + +clf = KNeighborsClassifier(n_neighbors=10).fit(XX_train, y_train) +predictions_labels = clf.predict(XX_test) + +print('预测结果:') +print(predictions_labels) + +print('算法评价:') +print((classification_report(y_test, predictions_labels))) + +# 输出前10张图片及预测结果 +k = 0 +t=0 +while k < 100: + # 读取图像 + temp = [] + temp=X_test[k].split('//') + image = cv2.imread(X_test[k]) + if temp[1]==str(predictions_labels[k]): + t=t+1 + + # 显示图像 + # cv2.imshow("img", image) + k = k + 1 + +print(t/100.0) \ No newline at end of file