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

大家好,我是微学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 * rhoy0 = b * rhox1 = 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://xiahunao.cn/news/3224458.html

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

相关文章

USB眼图eye diagram测试

前言: USB有一种测量称为EYE图或信号完整性测试。考虑数字信号从发射机传输到接收机的过程。到达接收器的信号质量可能受到许多因素的影响,包括发射器、电缆或PCB迹线以及连接器。信号质量也被称为信号完整性。眼图是一种用于快速评估数字信号质量的图形工具。眼图这个名字之…

Gymnasium 借游戏来学习人工智能

既然有了免费的linux系统GPU,干脆演示一下使用drivecolab套件来训练模型。 !apt-get install -y build-essential swig !pip install box2d-py !pip install gymnasium[all] !pip install gymnasium[atari] gymnasium[accept-rom-license] !pip install stable_bas…

Python函数 之 模块和包

1.模块 1, 在Python 中, 每个以 .py 结尾的 Python 代码⽂件 都可以称为是⼀个模块。 2, 在模块中 别⼈书写好的功能(变量, 函数, 类),我们可以拿来直接使⽤。 3, 我们自己写的代码文件, 想要作为模块让别⼈使⽤, 你的代码⽂件名(模块名) 满足标识符的规…

Linux驱动开发-03字符设备驱动框架搭建

一、字符设备驱动开发步骤 驱动模块的加载和卸载(将驱动编译模块,insmod加载驱动运行)字符设备注册与注销(我们的驱动实际上是去操作底层的硬件,所以需要向系统注册一个设备,告诉Linux系统,我有…

JVM是如何创建一个对象的?

哈喽,大家好🎉,我是世杰。 本文我为大家介绍面试官经常考察的**「Java对象创建流程」** 照例在开头留一些面试考察内容~~ 面试连环call Java对象创建的流程是什么样?JVM执行new关键字时都有哪些操作?JVM在频繁创建对象时,如何…

Studying-代码随想录训练营day33| 动态规划理论基础、509.斐波那契函数、70.爬楼梯、746.使用最小花费爬楼梯

第33天,动态规划开始,新的算法💪(ง •_•)ง,编程语言:C 目录 动态规划理论基础 动态规划的解题步骤 动态规划包含的问题 动态规划如何debug 509.斐波那契函数 70.爬楼梯 746.使用最小花费爬楼梯 总结 动态…

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…

HTML 标签简写和全称及其对应的中文说明和实例

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML 标签简写及全称</title><style>…

Linux udp编程

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

效果惊人!LivePortrait开源数字人技术,让静态照片生动起来

不得了了,快手已经不是众人所知的那个短视频娱乐平台了。 可灵AI视频的风口尚未过去,又推出了LivePortrait--开源的数字人项目。LivePortrait让你的照片动起来,合成逼真的动态人像视频,阿里通义EMO不再是唯一选择。 让图像动起来 LivePortrait 主要提供了对眼睛和嘴唇动作的…

20_Inception V3深度学习图像分类算法

回顾GoogleNet:传送门 1.1 介绍 InceptionV3是Google开发的一种深度卷积神经网络架构&#xff0c;它是Inception系列网络中的第三代模型&#xff0c;由Christian Szegedy等人在论文《Rethinking the Inception Architecture for Computer Vision》中提出&#xff0c;该论文发…

gitee上传和下载idea项目的流程

环境&#xff1a;idea2022 一、上传项目 1、在gitee中新建一个仓库。 2、打开所要上传的项目的文件夹&#xff0c;点击Git Bash&#xff0c;生成.git文件夹。 3、在idea中打开所要上传的项目&#xff0c;在控制台的Terminal菜单中&#xff0c;输入git add . (注意&#xf…

解决分布式环境下session共享问题

在分布式环境下&#xff0c;session会存在两个问题 第一个问题:不同域名下&#xff0c;浏览器存储的jsessionid是没有存储的。比如登录时认证服务auth.gulimall.com存储了session&#xff0c;但是搜索服务search.gulimall.com是没有这个session的&#xff1b; 第二个问题&…

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

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

Eyes Wide Shut Exploring the Visual Shortcomings of Multimodal LLMs

Eyes Wide Shut? Exploring the Visual Shortcomings of Multimodal LLMs 近两年多模态大模型&#xff08;Multimodal LLM&#xff0c;MLLM&#xff09;取得了巨大的进展&#xff0c;能够基于图片与人类对话&#xff0c;展现出强大的识别甚至推理能力。然而&#xff0c;在某些…

游戏AI的创造思路-技术基础-蒙特卡洛树搜索(2)

接上一篇&#xff0c;让我们来看更多的例子 目录 7. 更多例子 7.1. 国际象棋实例 7.2. RTS类游戏实例 7.3. FPS类游戏实例 7. 更多例子 蒙特卡洛树搜索&#xff08;Monte Carlo Tree Search&#xff0c;MCTS&#xff09;在游戏AI中有着广泛的应用&#xff0c;尤其是在那些…

孟德尔随机化--代谢生活方式与消化道癌

写在前面 今天阅读的文献是多种暴露与某结局的孟德尔随机化&#xff0c;算是以量取胜了。 The effect of metabolism-related lifestyle and clinical risk factors on digestive system cancers in East Asian populations: a two-sample Mendelian randomization analysis …

使用tkinter拖入excel文件并显示

使用tkinter拖入excel文件并显示 效果代码 效果 代码 import tkinter as tk from tkinter import ttk from tkinterdnd2 import TkinterDnD, DND_FILES import pandas as pdclass ExcelViewerApp(TkinterDnD.Tk):def __init__(self):super().__init__()self.title("Excel…

谷歌摸鱼神器来了:推出AI会议替身,一键总结提问发言_会议预约 ai对话

饱受会议折磨的打工人&#xff0c;终于可以解放了&#xff01; 就在刚刚举办的Google Cloud Next’23大会上&#xff0c;谷歌宣布了一系列科技新进展&#xff0c;最瞩目的要属其中的“开会AI替身”了。 只需要一句“帮我参加”&#xff0c;AI就能替你开会&#xff0c;并在合适…

设计模式探索:装饰器模式

1. 装饰器模式定义 装饰器模式&#xff08;Decorator Pattern&#xff09; 装饰器模式是一种结构型设计模式&#xff0c;允许向一个对象动态添加行为。在不改变类的接口的情况下&#xff0c;装饰器模式在原始类上增加额外的职责&#xff0c;并且支持多个装饰器嵌套使用。 装…