Python 图像处理进阶:特征提取与图像分类

news2024/11/15 11:39:26

在这里插入图片描述

特征提取

特征提取是计算机视觉中的一个重要环节,它可以从图像中提取出有助于后续处理的特征,比如用于识别和分类的关键点、纹理等。常见的特征提取方法包括SIFT、SURF和ORB等。

SIFT(尺度不变特征变换)

SIFT是一种用于检测图像中的关键点及其描述符的方法。SIFT特征具有尺度不变性和旋转不变性,适用于图像匹配和识别。

  • 原理:SIFT通过在不同尺度的空间内寻找极值点来检测关键点,并利用梯度方向的直方图计算关键点的方向,最后利用局部像素强度的比较来构建描述符。

  • 实现:OpenCV提供了SIFT的实现,可以方便地检测和计算特征点。

  • 示例代码

import cv2
import numpy as np

def detect_sift_features(image_path):
    # 创建SIFT对象
    sift = cv2.SIFT_create()

    # 读取图像
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

    # 计算SIFT特征点和描述符
    keypoints, descriptors = sift.detectAndCompute(img, None)

    # 在图像中标记特征点
    img_with_keypoints = cv2.drawKeypoints(img, keypoints, None)

    # 显示结果
    cv2.imshow('SIFT Features', img_with_keypoints)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    detect_sift_features("example.jpg")
SURF(加速鲁棒特征)

SURF是一种比SIFT更快的特征检测方法,同样具有尺度不变性和旋转不变性,适用于实时应用。

  • 原理:SURF通过使用积分图像和Hessian矩阵的近似值来快速定位关键点,然后使用二进制测试来构建描述符。

  • 实现:OpenCV也提供了SURF的实现。

  • 示例代码

import cv2
import numpy as np

def detect_surf_features(image_path):
    # 创建SURF对象
    surf = cv2.xfeatures2d.SURF_create(400)

    # 读取图像
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

    # 计算SURF特征点和描述符
    keypoints, descriptors = surf.detectAndCompute(img, None)

    # 在图像中标记特征点
    img_with_keypoints = cv2.drawKeypoints(img, keypoints, None)

    # 显示结果
    cv2.imshow('SURF Features', img_with_keypoints)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    detect_surf_features("example.jpg")
ORB(Oriented FAST and Rotated BRIEF)

ORB是一种快速的特征检测和描述方法,适用于需要快速处理的场合。

  • 原理:ORB结合了FAST角点检测和BRIEF描述子的优点,通过使用汉明距离来比较描述符。

  • 实现:OpenCV提供了ORB的实现。

  • 示例代码

import cv2
import numpy as np

def detect_orb_features(image_path):
    # 创建ORB对象
    orb = cv2.ORB_create()

    # 读取图像
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

    # 计算ORB特征点和描述符
    keypoints, descriptors = orb.detectAndCompute(img, None)

    # 在图像中标记特征点
    img_with_keypoints = cv2.drawKeypoints(img, keypoints, None)

    # 显示结果
    cv2.imshow('ORB Features', img_with_keypoints)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    detect_orb_features("example.jpg")
图像分类

图像分类是指给定一张图像,预测其属于哪个类别。这通常是机器学习的任务,需要大量的标注数据和适当的分类器。

训练分类器

训练分类器通常需要经过以下几个步骤:

  1. 准备数据集:收集大量带标签的图像样本。
  2. 特征提取:使用前面提到的特征提取方法提取图像的特征。
  3. 选择分类器:选择合适的机器学习算法作为分类器,如支持向量机(SVM)、随机森林等。
  4. 训练模型:使用训练数据集训练分类器。
  5. 评估性能:使用测试数据集评估分类器的性能。
示例代码:使用SVM进行图像分类

下面的示例代码展示了如何使用SVM进行图像分类。

import cv2
import numpy as np
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

def load_images_from_folder(folder):
    images = []
    labels = []
    for filename in os.listdir(folder):
        img = cv2.imread(os.path.join(folder, filename), cv2.IMREAD_GRAYSCALE)
        if img is not None:
            images.append(img)
            labels.append(int(filename.split('_')[0]))
    return images, labels

def extract_sift_features(images):
    # 创建SIFT对象
    sift = cv2.SIFT_create()

    # 提取所有图像的特征
    all_descriptors = []
    for img in images:
        kp, des = sift.detectAndCompute(img, None)
        if des is not None:
            all_descriptors.extend(des)
    return all_descriptors

def train_svm_classifier(images, labels):
    # 提取特征
    descriptors = extract_sift_features(images)

    # 训练SVM分类器
    clf = svm.SVC()
    clf.fit(descriptors, labels)
    return clf

def test_svm_classifier(clf, test_images, test_labels):
    # 提取测试图像的特征
    descriptors = extract_sift_features(test_images)

    # 预测测试图像的标签
    predictions = clf.predict(descriptors)

    # 计算准确率
    accuracy = accuracy_score(test_labels, predictions)
    return accuracy

if __name__ == "__main__":
    # 加载训练数据
    train_images, train_labels = load_images_from_folder("train_data")

    # 训练SVM分类器
    svm_classifier = train_svm_classifier(train_images, train_labels)

    # 加载测试数据
    test_images, test_labels = load_images_from_folder("test_data")

    # 测试SVM分类器
    accuracy = test_svm_classifier(svm_classifier, test_images, test_labels)
    print("Accuracy:", accuracy)
图像配准

图像配准是指将多张图像对齐到同一个坐标系的过程,常用于医学影像分析、遥感图像处理等领域。

示例代码:基于特征的图像配准

下面的示例代码展示了如何使用SIFT特征进行图像配准。

import cv2
import numpy as np

def align_images(ref_image_path, input_image_path):
    # 读取参考图像和输入图像
    ref_img = cv2.imread(ref_image_path, cv2.IMREAD_GRAYSCALE)
    input_img = cv2.imread(input_image_path, cv2.IMREAD_GRAYSCALE)

    # 创建SIFT对象
    sift = cv2.SIFT_create()

    # 计算特征点和描述符
    ref_kp, ref_des = sift.detectAndCompute(ref_img, None)
    input_kp, input_des = sift.detectAndCompute(input_img, None)

    # 匹配特征点
    matcher = cv2.BFMatcher()
    matches = matcher.match(ref_des, input_des)
    matches = sorted(matches, key=lambda x: x.distance)

    # 计算变换矩阵
    src_pts = np.float32([ref_kp[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
    dst_pts = np.float32([input_kp[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)
    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)

    # 对输入图像应用变换
    aligned_img = cv2.warpPerspective(input_img, M, (ref_img.shape[1], ref_img.shape[0]))

    # 显示结果
    cv2.imshow('Aligned Image', aligned_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    align_images("reference.jpg", "input.jpg")

总结

通过以上示例,我们详细探讨了如何使用Python的OpenCV库进行更高级的图像处理操作,包括特征提取、图像分类以及图像配准等。这些技术可以用来创建更加智能的应用程序。您可以根据需要扩展这些示例,添加更多的功能,或者探索OpenCV文档中的其他高级特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web-ssrfme--redis 未授权访问攻击

目录 1、题目源码 2、测试ssrf 3、发现主机 4、发现服务 5、redis 未授权访问攻击 6&#xff0c;拿flag 1、题目源码 <?php highlight_file(__file__); function curl($url){ $ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER…

用Maven开发Spring Boot 项目

一、初识 Spring Boot Spring Boot框架是一 套开源的后台开发框架&#xff0c; 继承了Spring MVC框架的前辈SSM框架的优秀特性&#xff0c;通过注解大幅减少程序员写配置的工作量。从企业开发角度来看&#xff0c;它提供了自动化配置&#xff0c;内嵌容器和兼容Maven等核心功…

银河麒麟桌面操作系统V10:如何快速将应用固定到任务栏?

银河麒麟桌面操作系统V10&#xff1a;如何快速将应用固定到任务栏&#xff1f; 1、图形界面方法2、命令行方法2.1 固定应用2.2 取消固定 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在银河麒麟V10中&#xff0c;/usr/share/applications…

Vue 绘制圆形 上下左右

效果图 代码&#xff1a; <div style"transform: rotate(45deg)"><div id"top"><div id"top-left" click"addformData(true, form.lat, 0.000003, lat)"><ArrowUpBold style"height: 25px; width: 25px; tr…

winform 实现优美的进度条 包含百分比

winform 原生控件中包含进度条控件 ProgressBar。 但这个控件并没有告诉我们如何在上面实现 显示百分比进度的方式&#xff0c;或者说根本就不支持。但没 有百分比显示的进度条是没有灵魂的&#xff0c;可能是有点让人一头雾水的。 还好我们可以通过实现 ProgressBar 的 OnP…

海康VisionMaster使用学习笔记18-常见问题排查

常见问题排查思路 常见问题排查方法-安装阶段 常见问题排查方法-启动阶段 常见问题排查方法-使用阶段 常见问题排查方法-相关资料

outlook在“对我发送的邮件应用规则”时只能移动邮件副本的问题和解决方案

outlook在“对我发送的邮件应用规则时”只能移动邮件副本的问题 问题描述问题的解决方案第一步第二步 其他说明参考 问题描述 如果我们想对自己发送的邮件进行分类&#xff0c;可以使用规则将已发送的邮件移动到指定文件夹中&#xff0c;但是。当操作对象为“自己发送的邮件时…

运维学习————LVS集群和Keepalived+LVS高可用

目录 官网&#xff1a;LVS中文官网 一、概念 二、组成及软件工作层次图 ​编辑 三、整体架构 四、名词解释 五、三种工作模式 1、LVS-NAT 2、LVS-TUN 3、LVS-DR 六、DR模式的实现 1、克隆出LVS&#xff0c;配置虚拟IP 2、配置Nginx的虚拟IP Nginx1的配置 Nginx2…

Linux的一些实例

# 1.编写脚本&#xff0c;让用户输入firstname和lastname&#xff0c;最后在屏幕上显示your full name is&#xff1a; #!/bin/bash read -p "please input firstname:" var1 read -p "please input lastname:" var2 echo "your full name is:$var1…

【机器学习】线性回归的概念以及如何从最小二乘法推导到正规方程和实际线性回归实例(含python代码)

引言 线性回归是一种广泛应用于统计分析、经济预测、机器学习等领域的建模方法。它旨在通过自变量&#xff08;解释变量&#xff09;来预测因变量&#xff08;响应变量&#xff09;的值 文章目录 引言一、线性回归的概念1.1 线性回归的基本概念1.2 最小二乘法1.2.1 最小二乘法的…

来了!!!来了!!!--我需要在Docker中运行Java应用程序,但是没有Docker经验,你能给我一个简单的入门指南吗?

在Docker中运行Java应用程序的简单入门指南&#xff1a; 1.安装Docker 首先&#xff0c;确保你的系统上安装了Docker。你可以从Docker官网下载并安装适合你操作系统的Docker版本。 Windows10 安装 Docker&#xff0c;每个步骤作者亲测&#xff0c;细节记录最全教程 2. 编写D…

Sublime Text 配置 Terminal (CMD)

1. 安装package 按住 【ctrlshiftp】 , 在弹出的输入框中输入“install”&#xff0c;选择“install package”,回车,等待20秒左右 2. 安装terminal 按住 【ctrlshiftp】 , 在弹出的输入框中输入“install”&#xff0c;选择“install package”,回车,等待新弹窗出来&#…

稀土长余辉发光剂在陶瓷中的应用

稀土长余辉发光剂是一种特殊的发光材料&#xff0c;主要由稀土元素&#xff08;如镧、铈、钕、铽、镝等&#xff09;掺杂而成&#xff0c;基于电子陷阱机理&#xff0c;可实现长余辉效果&#xff0c;发光时间长达6-8小时。 稀土长余辉发光材料在陶瓷上的应用主要利用了其在激…

不相交的线(Lc1035)——动态规划

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j]且绘制的直线不与任何其他连线&#xff08;非水平线&#xff09;相…

论文翻译:ChatGPT passing USMLE shines a spotlight on the flaws of medical education

ChatGPT passing USMLE shines a spotlight on the flaws of medical education https://journals.plos.org/digitalhealth/article?id10.1371/journal.pdig.0000205 ChatGPT 通过美国执业医师执照考试&#xff08;USMLE&#xff09;凸显了医学教育的缺陷 阿马拉奇B姆巴克韦1…

你不知道的100个国外搜索引擎升级版

首先是要支持国产品牌磁力狐&#xff0d;cilih.com DMOZ – 一个多语种、开放式网站目录。 Food Blog Search -可以让你从上千个博客和网站查找菜谱。 Swoogle – 一个语义、文件、术语和数据的搜索引擎&#xff0c;不同于普通的搜索引擎。 SimilarSiteSearch – 帮你找到相似…

排序------快速排序(C语言实现)

目录 快速排序算法 例题 题目描述 具体代码&#xff1a; 代码分析 函数定义&#xff1a; 主函数&#xff1a; 快速排序算法 快速排序&#xff08;QuickSort&#xff09;是一种高效的排序算法&#xff0c;它采用分治策略&#xff0c;通过选择一个“基准”元素并将其他元素…

计算机网络面试真题总结(五)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 说一说HTTP1.0&#xff0c;1.1&#xff0c;2.0 的区别 HTTP/1.0 H…

国际篮球联合会(FIBA)标准篮球比赛记录表

相关资源 下载地址>>https://download.csdn.net/download/boomcode/89675132 篮球比赛计时计分展示管理系统开发及使用手册>>

3D渐变的轮播图效果,有点儿意思!

阅读原文&#xff1a;原文地址 一、前言 在Web开发中&#xff0c;轮播图&#xff08;Carousel&#xff09;是一种非常常见的功能&#xff0c;用于展示图片或内容&#xff0c;通过自动或手动的方式切换不同的视图&#xff0c;在网页设计中扮演着重要的角色。 吸引注意力&…