人工智能算法工程师(中级)课程2-Opencv视觉处理之高级操作

news2024/10/1 3:30:18

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程2-Opencv视觉处理之高级操作。在上一节课中的OpenCV基础操作我们了解到OpenCV是一个开源的计算机视觉软件库。它提供了各种视觉处理函数,并支持多种编程语言,如C++、Python、Java等。OpenCV具有跨平台性,可以在不同的操作系统上运行。它广泛应用于图像处理、视频分析、物体识别、人脸识别、动作识别等领域。

文章目录

  • 一、Opencv的高级操作
    • 1. 图像仿射变换
    • 2. 图像形态学操作
    • 3. 图像滤波操作
    • 4. 图像傅里叶变换
    • 5. 图像直方图均衡化
    • 6. 图像Canny算子操作
    • 7. 图像轮廓绘制与查找
    • 8. 图像边界检测
    • 9. 图像轮廓性质
    • 10. 图像金字塔操作
    • 11. 霍夫变换操作
    • 12. 分水岭算法

一、Opencv的高级操作

1. 图像仿射变换

图像仿射变换是一种二维变换,它保持了图像的直线和平行性。常用于图像校正和变换。

import cv2
import numpy as np
# 读取图像
image = cv2.imread('example.jpg')
# 定义仿射变换矩阵
rows, cols = image.shape[:2]
M = cv2.getAffineTransform(np.float32([[50,50],[200,50],[50,200]]), np.float32([[10,100],[200,50],[100,250]]))
# 应用仿射变换
warped = cv2.warpAffine(image, M, (cols, rows))
# 显示图像
cv2.imshow('Original', image)
cv2.imshow('Warped', warped)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

2. 图像形态学操作

图像形态学操作包括腐蚀、膨胀、开运算和闭运算等,用于图像的形状分析和特征提取。

# 读取图像并转换为灰度
gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 定义结构元素
kernel = np.ones((5,5), np.uint8)
# 腐蚀操作
erosion = cv2.erode(gray, kernel, iterations=1)
# 显示图像
cv2.imshow('Original', gray)
cv2.imshow('Erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 图像滤波操作

图像滤波操作用于平滑图像或去除图像中的噪声。

# 读取图像
image = cv2.imread('example.jpg')
# 均值滤波
blur = cv2.blur(image, (5,5))
# 显示图像
cv2.imshow('Original', image)
cv2.imshow('Blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

4. 图像傅里叶变换

图像傅里叶变换将图像从空间域转换到频率域,用于图像分析和频域滤波。

import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像并转换为灰度
gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 傅里叶变换
dft = cv2.dft(np.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 频率谱
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
# 显示图像
plt.subplot(121), plt.imshow(gray, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

5. 图像直方图均衡化

直方图均衡化用于增强图像的对比度。

# 读取图像并转换为灰度
gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 直方图均衡化
equalized = cv2.equalizeHist(gray)
# 显示图像
cv2.imshow('Original', gray)
cv2.imshow('Equalized', equalized)
cv2.waitKey(0)
cv2.destroyAllWindows()

6. 图像Canny算子操作

Canny边缘检测算法用于检测图像中的边缘。

# 读取图像并转换为灰度
gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# Canny边缘检测
edges = cv2.Canny(gray, 100, 200)
# 显示图像
cv2.imshow('Original', gray)
cv2.imshow('Canny', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

7. 图像轮廓绘制与查找

用于在图像中查找和绘制轮廓。

# 读取图像并转换为灰度
gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 边缘检测
edged = cv2.Canny(gray, 30, 100)
# 查找轮廓
contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
cv2.drawContours(image, contours, -1, (0,255,0), 3)
# 显示图像
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

8. 图像边界检测

边界检测通常使用Sobel算子实现,用于检测图像中的水平和垂直边界。

import cv2
import numpy as np

# 读取图像并转换为灰度
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)

# 使用Sobel算子进行边界检测
# 参数分别是:图像,深度,x方向上的导数阶数,y方向上的导数阶数,核的大小
grad_x = cv2.Sobel(image, cv2.CV_32F, 1, 0, ksize=3)
grad_y = cv2.Sobel(image, cv2.CV_32F, 0, 1, ksize=3)

# 将梯度转换回8位整数
abs_grad_x = cv2.convertScaleAbs(grad_x)
abs_grad_y = cv2.convertScaleAbs(grad_y)

# 合并梯度
grad = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)

# 显示结果
cv2.imshow('Original', image)
cv2.imshow('Sobel', grad)
cv2.waitKey(0)
cv2.destroyAllWindows()

9. 图像轮廓性质

轮廓性质包括轮廓的面积、周长、重心等,这些属性可以用于图像分析和物体识别。

import cv2
# 读取图像并转换为灰度
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 使用Canny检测边缘
edges = cv2.Canny(image, 100, 200)
# 查找轮廓
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 假设我们只对第一个轮廓感兴趣
if len(contours) > 0:
    cnt = contours[0]
    # 计算轮廓的面积
    area = cv2.contourArea(cnt)
    # 计算轮廓的周长
    perimeter = cv2.arcLength(cnt, True)
    # 计算轮廓的重心
    M = cv2.moments(cnt)
    cx = int(M['m10'] / M['m00'])
    cy = int(M['m01'] / M['m00'])
    # 绘制重心
    cv2.circle(image, (cx, cy), 5, (255, 0, 0), -1)
    # 显示结果
    cv2.imshow('Image', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    print(f'Area: {area}, Perimeter: {perimeter}, Centroid: ({cx}, {cy})')

10. 图像金字塔操作

图像金字塔是图像的多尺度表示,用于图像的尺寸变换和特征提取。

import cv2
# 读取图像
image = cv2.imread('example.jpg')
# 构建高斯金字塔
gaussian_pyramid = [image]
for i in range(5):
    image = cv2.pyrDown(image)
    gaussian_pyramid.append(image)
# 显示高斯金字塔
for i in range(len(gaussian_pyramid)):
    cv2.imshow(f'Gaussian Pyramid {i}', gaussian_pyramid[i])
cv2.waitKey(0)
cv2.destroyAllWindows()

11. 霍夫变换操作

霍夫变换用于检测图像中的直线或圆。

import cv2
import numpy as np
# 读取图像并转换为灰度
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 使用Canny检测边缘
edges = cv2.Canny(image, 50, 150)
# 霍夫变换检测直线
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
# 绘制检测到的直线
if lines is not None:
    for rho, theta in lines[:, 0]:
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a * rho
        y0 = b * rho
        x1 = int(x0 + 1000 * (-b))
        y1 = int(y0 + 1000 * (a))
        x2 = int(x0 - 1000 * (-b))
        y2 = int(y0 - 1000 * (a))
        cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
# 显示结果
cv2.imshow('Hough Lines', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

12. 分水岭算法

分水岭算法是一种图像分割算法,用于根据图像的灰度将图像分割成不同的区域。

import cv2
import numpy as np
# 读取图像并转换为灰度
image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 二值化
_, thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 查找轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 创建标记
marker = np.zeros_like(image)
# 为每个轮廓创建一个不同的标签
for i in range(len(contours)):
    cv2.drawContours(marker, contours, i, (i+1), -1)
# 应用 watershed 算法
marker = cv2.watershed(image, marker)
# 显示结果
cv2.imshow('Watershed', marker)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上代码提供了OpenCV中常用的高级视觉操作的概览。每个操作都有其特定的应用场景和参数设置,可以根据实际需求进行调整。在实际应用中,可能需要结合多种操作来达到预期的图像处理效果。

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

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

相关文章

鸿蒙语言基础类库:【@ohos.util (util工具函数)】

util工具函数 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 该模块…

鸟类领域超大规模检测实践,基于YOLOv8轻量级检测模型开发构建超大规模生活场景下500种鸟类检测识别分析系统

关于鸟类的检测、识别相关的开发实践在前面的系列博文中也有不少的实践记录,感兴趣的话可以自行移步阅读即可: 【检测类】 《AI识鸟,基于YOLOv5【n/s/m/l/x】全系列参数模型开发构建工业野外场景下鸟类检测识别分析系统》 《基于轻量级YOL…

2018-2022 年份微博签到数据集

前阵子接到一个实验室老师的需求,采集五年前(2024-52019)过年前后的北京微博签到数据。 前两年采集的深圳签到数据是 2022 年是当年的尚可,这次虽然时间跨度只有两个月,但是由于时间太过久远,但是颇费了一…

快速入门,springboot知识点汇总

学习 springboot 应该像学习一门编程语言一样,首先要熟练掌握常用的知识,而对于不常用的内容可以简单了解一下。先对整个框架和语言有一个大致的轮廓,然后再逐步补充细节。 前序: Spring Boot 通过简化配置和提供开箱即用的特性&#xff0c…

「C++系列」C++ 修饰符类型

文章目录 一、C 修饰符类型1. 访问修饰符(Access Modifiers)2. 存储类修饰符(Storage Class Specifiers)3. 类型修饰符(Type Modifiers)4. 函数修饰符 二、C 修饰符类型-案例1. 访问修饰符案例2. 存储类修饰…

以终为始,胜意费控云「包干管控」助力精细管控与体验提升

在全球宏观经济环境的波动和内在经济逻辑的推动下,我国经济正经历着关键的结构调整期。如何稳健穿越周期,是企业必须直面的课题。与此同时,企业成本管控也面临着更为精细和严格的挑战。 企业需要一种更为灵活合理的费用管控策略。胜意费控云升…

【人工智能】-- 搜索技术(状态空间法)

个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉引言 🍈介绍 🍉状态空间法 🍈状态空间的构成 🍍状态 🍍算符…

Pyecharts绘制热力图的说明+代码实战

引言 热力图在数据可视化中是一种强大的工具,可以直观地展示数据的分布情况和变化趋势。Pyecharts是一个基于Echarts的Python可视化库,提供了丰富的图表类型,包括热力图。在本文中,我们将深入探讨Pyecharts绘制多种炫酷热力图的参…

数据结构 实验 3

题目一:最短路径dijkstra算法 一、实验目的 熟练图的邻接矩阵和邻接表表示法掌握图的最短路径Dijkstra算法的基本思想用C语言实现Dijkstra算法 二、实验内容 从键盘输入的数据创建图(图的存储结构采用邻接矩阵),设计Dijkstra算…

领导者视角:识别系统问题的信号

作为企业的领导者,有时候我们面对的不仅是表面的小问题,而是根深蒂固的系统性问题。如果您发现以下症状,可能就是时候深入挖掘了: 1、资源消耗大:一个看似小的问题,解决起来却不断耗费大量资源。 2、反复无…

LeetCode热题100刷题10:46. 全排列、78. 子集、17. 电话号码的字母组合、39. 组合总和、138. 随机链表的复制

回溯问题 46. 全排列 全排列问题&#xff1a; path 递归终止条件&#xff1a;path中是否已存储所有元素&#xff1b; for循环处理节点集合&#xff1a;used0未被使用的元素 class Solution { public:vector<int> path;vector<vector<int>> res;void backt…

odoo中的钩子 Hooks

钩子 钩子&#xff08;Hooks&#xff09;是一种在特定时间点或特定事件发生时执行自定义代码的机制。它们允许开发者在不修改核心代码的情况下&#xff0c;为Odoo添加自定义功能或扩展现有功能。以下是关于Odoo钩子的一些关键点和常见用法&#xff1a; 一、钩子的类型 pre_i…

Thinking--在应用中添加动态水印,且不可删除

Thinking系列&#xff0c;旨在利用10分钟的时间传达一种可落地的编程思想。 水印是一种用于保护版权和识别内容的技术&#xff0c;通常用于图像、视频或文档中。它可以是文本、图像或两者的组合&#xff0c;通常半透明或以某种方式嵌入到内容中&#xff0c;使其不易被移除或篡改…

《Windows API每日一练》9.13资源-鼠标位图和字符串

鼠标指针位图&#xff08;Mouse Cursor Bitmap&#xff09;是用于表示鼠标指针外观的图像。在 Windows 窗口编程中&#xff0c;可以使用自定义的鼠标指针位图来改变鼠标的外观&#xff0c;并提供更加个性化的用户体验。 ■以下是一些与鼠标指针位图相关的要点&#xff1a; ●…

局域网远程共享桌面如何实现

在局域网内实现远程共享桌面&#xff0c;可以通过以下几种方法&#xff1a; 一、使用Windows自带的远程桌面功能&#xff1a; 首先&#xff0c;在需要被控制的电脑上右键点击“此电脑”&#xff0c;选择“属性”。 进入计算机属性界面后&#xff0c;点击“高级系统设置”&am…

这不是在搞技术,而是在玩心态~

正文 大家好&#xff0c;我是bug菌~ 如今为制造业提供大型设备的研发型公司大多数都是做系统集成&#xff0c;一部分有技术实力的公司会把核心部分自研&#xff0c;其他相对比较通用的周边设备由其他公司产品来集成&#xff1b;也有一部分公司只是做做方案和资源整合&#xff0…

科普文:深入理解负载均衡(四层负载均衡、七层负载均衡)

概叙 网络模型&#xff1a;OSI七层模型、TCP/IP四层模型、现实的五层模型 应用层&#xff1a;对软件提供接口以使程序能使用网络服务&#xff0c;如事务处理程序、文件传送协议和网络管理等。&#xff08;HTTP、Telnet、FTP、SMTP&#xff09; 表示层&#xff1a;程序和网络之…

bazel基础知识

ABOUT BAZEL 什么是Bazel&#xff1f; 构建系统&#xff0c;而不是构建生成器&#xff08;直接调用编译器&#xff09;【A build system, not a build generator (invokes directly the compiler)】 具有完整的测试功能&#xff08;测试报告、片状测试处理等&#xff09;【Wi…

腾讯又一平台即将停止运营

随着腾讯公司业务和战略的调整&#xff0c;某些业务逐渐退出历史舞台&#xff0c;如“腾讯直播平台NOW”&#xff0c;以及“QQ签到”&#xff0c;“腾讯待办”&#xff0c;“企鹅FM音频平台”等&#xff0c;最近又有一则重磅消息&#xff0c;那就是“腾讯课堂”也即将停止运营。…

【Linux】进程(9):进程控制2(进程等待)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;9&#xff09;进程控制2&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 为什么要进程等待二. 如何进行进程等待1.wait函数—…