图像处理/计算机视觉/python环境下/机器学习 之k近邻方法(KNN)、模板匹配算法对数据集的识别

机器学习

    • 一、基础知识
      • KNN算法
      • 模板匹配算法
    • 二、问题描述
    • 三、效果图
    • 四、代码附录
      • KNN算法
      • 模板匹配算法
      • 模板匹配算法二
    • 五、数据集附录

一、基础知识

KNN算法

KNN(K-Nearest Neighbor)是最简单的机器学习算法之一,可以用于分类和回归,是一种监督学习算法。它的思路是这样,如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。也就是说,该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

图像处理/计算机视觉/python环境下/机器学习 之k近邻方法(KNN)、模板匹配算法对数据集的识别_第1张图片

模板匹配算法

opencv官网对模板匹配的解释是:

模板匹配是一种用于在较大图像中搜索和查找模板图像位置的方法。为此,OpenCV带有一个函数cv2.matchTemplate()。它只是将模板图像滑动到输入图像上(就像在2D卷积中一样),然后在模板图像下比较模板和输入图像的补丁。OpenCV中实现了几种比较方法。(您可以检查文档以了解更多详细信息)。它返回一个灰度图像,其中每个像素表示该像素的邻域与模板匹配多少。如果输入图像的大小(WxH)和模板图像的大小(wxh),则输出图像的大小将为(W-w + 1,H-h + 1)。获得结果后,可以使用**cv2.minMaxLoc()**函数查找最大/最小值在哪里。将其作为矩形的左上角,并以(w,h)作为矩形的宽度和高度。该矩形是您模板的区域。

我的理解就是:模板在待检测的图像上从左至右,从上至下的滑动(我做了一个简陋的gif示意动画,如图),模板从源图像左上角开始每次以模板的左上角像素点为单位从左至右,从上至下移动,每到达一个像素点,就会以这个像素点为左上角顶点从源图像中截取出与模板一样大小的图像与模板进行像素比较运算。

更加详细的讲解请看我的另外两篇博客:
链接: 如何深入理解模板匹配算法
链接: 如何深入理解KNN算法

图像处理系列博客:

图像处理之维纳滤波还原图像、直方图均值化【附代码、亲测有效】

图像处理之仿真运动模糊复原【使用逆滤波、维纳滤波】

图像处理/人工智能/opencv之深入理解模板匹配算法

图像处理/计算机视觉/python环境下如何用滤波器、算法恢复图片,对图片去污【附代码】

图像处理/计算机视觉/python环境下/机器学习 之k近邻方法(KNN)、模板匹配算法对数据集的识别

图像处理/计算机视觉/python环境下/如何用四种不同滤波器处理噪声【附代码、亲测有效】

二、问题描述

采用KNN,模板匹配两种方法进行机器学习,切分训练集和测试集,从而实现对数据集的识别。

这里的例子采用的数据集是200张图片,包括手写的不同的0-9图片各20张,以此观察KNN算法和模板匹配算法下对于图片的识别的准确度差别。

三、效果图

图像处理/计算机视觉/python环境下/机器学习 之k近邻方法(KNN)、模板匹配算法对数据集的识别_第2张图片
图像处理/计算机视觉/python环境下/机器学习 之k近邻方法(KNN)、模板匹配算法对数据集的识别_第3张图片
图像处理/计算机视觉/python环境下/机器学习 之k近邻方法(KNN)、模板匹配算法对数据集的识别_第4张图片

四、代码附录

KNN算法

import numpy as np
import os
import cv2
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report

X = []
Y = []

for i in range(0, 10):
    # 遍历文件夹,读取图片
    for f in os.listdir("D:/pythonProject1/image/image1/numberTest/%s" %i):
        # 打开一张图片并灰度化
        print(f)
        Images = cv2.imread("D:/pythonProject1/image/image1/numberTest/%s/%s " % (i, f),0)
        print(("D:/pythonProject1/image/image1/numberTest/%s%s" % (i, f)))
        image = cv2.resize(Images, (256, 256),interpolation=cv2.INTER_CUBIC)
        print(image)
        hist = cv2.calcHist(image, [0, 1], None,[256, 256], [0.0, 255.0, 0.0, 255.0])
        X.append(((hist / 255).flatten()))
        Y.append(i)
X = np.array(X)
Y = np.array(Y)
# 切分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=1)


# 随机率为100%(保证唯一性)选取其中的20%作为测试集

class KNN:
    def __init__(self, train_data, train_label, test_data):
        self.train_data = train_data
        self.train_label = train_label
        self.test_data = test_data

    def classify(self):
        num_train = (self.train_data).shape[0]
        num_test = (self.test_data).shape[0]
        labels = []
        for i in range(num_test):
            y = []
            for j in range(num_train):
                dis = np.sum(np.square((self.train_data)[j] - (self.test_data)[i]))
                y.append(dis)
            labels.append(self.train_label[y.index(min(y))])
        labels = np.array(labels)
        return labels


knn = KNN(X_train, y_train, X_test)
predictions_labels = knn.classify()
print(confusion_matrix(y_test, predictions_labels))
print(classification_report(y_test, predictions_labels))

模板匹配算法

import numpy as np
import os
import cv2
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report

X = []
Y = []

for i in range(0, 10):
    # 遍历文件夹,读取图片
    for f in os.listdir("D:/pythonProject1/image/image1/numberTest/%s" %i):
        # 打开一张图片并灰度化
        print(f)
        Images = cv2.imread("D:/pythonProject1/image/image1/numberTest/%s/%s " % (i, f),0)
        print(("D:/pythonProject1/image/image1/numberTest/%s%s" % (i, f)))
        image = cv2.cvtColor(Images,cv2.COLOR_BGR2GRAY)
        print(image)
        hist = cv2.calcHist(image, [0, 1], None,[256, 256], [0.0, 255.0, 0.0, 255.0])
        X.append(((hist / 255).flatten()))
        Y.append(i)
X = np.array(X)
Y = np.array(Y)
# 切分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=1)

class moran:
    def __init__(self, train_data, train_label, test_data):
        self.train_data = train_data
        self.train_label = train_label
        self.test_data = test_data

    def classify(self):
        num_train = (self.train_data).shape[0]
        num_test = (self.test_data).shape[0]
        labels = []
        for i in range(num_test):
            y = []
            for j in range(num_train):
             res = cv2.matchTemplate(image, num_test, cv2.TM_CCOEFF_NORMED)
            threshold = 0.65
            loc = np.where(res >= threshold)
        for pt in zip(*loc[::-1]):
            y.append(res)
        labels.append(self.train_label[y.index(min(y))])
        labels = np.array(labels)
        return labels

moran = moran(X_train, y_train, X_test)
predictions_labels = moran.classify()
print(confusion_matrix(y_test, predictions_labels))
print(classification_report(y_test, predictions_labels))

模板匹配算法二

import cv2
import numpy as np
from matplotlib import pyplot as plt

img_rgb = cv2.imread('')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template1 = cv2.imread('roi4_1.png', 0) #相当于测试集
template2 = cv2.imread('roi4_2.png', 0)
template3 = cv2.imread('roi4_3.png', 0)
template_list = ['roi4_1.png', 'roi4_2.png', 'roi4_3.png']

w1, h1 = template1.shape[::-1] #测试集的数据
w2, h2 = template1.shape[::-1]
w3, h3 = template1.shape[::-1]

plt.subplot(131)
plt.imshow(template1)
plt.subplot(132)
plt.imshow(template2)
plt.subplot(133)
plt.imshow(template3)
plt.show()


for i in range(len(template_list)):
    template = cv2.imread(template_list[i], 0)
    w, h = template.shape[::-1]
    res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
    threshold = 0.65
    loc = np.where(res >= threshold)
    for pt in zip(*loc[::-1]):
        gray = int(255/(i+1))
        cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (gray, gray, gray), 2)

plt.imshow(img_rgb)
plt.show()

链接: 如何深入理解模板匹配算法
链接: 如何深入理解KNN算法

五、数据集附录

手绘数据集展示如下:
图像处理/计算机视觉/python环境下/机器学习 之k近邻方法(KNN)、模板匹配算法对数据集的识别_第5张图片
图像处理/计算机视觉/python环境下/机器学习 之k近邻方法(KNN)、模板匹配算法对数据集的识别_第6张图片
图像处理/计算机视觉/python环境下/机器学习 之k近邻方法(KNN)、模板匹配算法对数据集的识别_第7张图片

图像处理/计算机视觉/python环境下/机器学习 之k近邻方法(KNN)、模板匹配算法对数据集的识别_第8张图片

你可能感兴趣的:(人工智能,python,机器学习,计算机视觉,算法,人工智能)