人工智能算法工程师(中级)课程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 * 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.mfbz.cn/a/788121.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2-29 基于matlab的CEEMD

基于matlab的CEEMD(Complementary Ensemble Empirical Mode Decomposition,互补集合经验模态分解),先将数据精心ceemd分解,得到imf分量,然后通过相关系数帅选分量,在求出他们的样本熵的特征。用…

HTML语言常见标签

语法 HEAD部分的HTML标签 1 标题标签 <title>标题内容</title> 2 段落标签 <meta charset"utf-8"/> BODY部分的HTML标签 1标题标签&#xff08;独占一行&#xff09;<h1>标题内容</h1> 2段落标签&#xff08;独占一行&#xff09;…

FUSE(用户空间文件系统)命令参数

GPT-4 (OpenAI) FUSE (Filesystem in Userspace)是一个允许创建用户空间文件系统的接口。它提供了一个API&#xff0c;让开发者在未修改内核代码的情况下&#xff0c;通过自己的程序实现文件系统。FUSE 文件系统通常通过 mount 命令来挂载&#xff0c;而且这个命令可以接受各…

深度学习--系统配置流程

Win10系统配置双系统Ubuntu18.04 深度学习台式服务器自装练手1.win10磁盘管理2.下载系统镜像制作U盘3.系统安装4. 安装后的系统设置工作5.配置CUDA环境CUDNN安装 深度学习台式服务器自装练手 写在最前 CUDA最高支持11.4 显卡3060 1.win10磁盘管理 首先对原有磁盘进行分区整理…

240709_昇思学习打卡-Day21-文本解码原理--以MindNLP为例

240709_昇思学习打卡-Day21-文本解码原理–以MindNLP为例 今天做根据前文预测下一个单词&#xff0c;仅作简单记录及注释。 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 &#x1d44a;_0:初始上下文单词序列&#x1d447;: 时间步当生成EOS标签时&a…

【QML之·基础语法概述】

系列文章目录 文章目录 前言一、QML基础语法二、属性三、脚本四、核心元素类型4.1 元素可以分为视觉元素和非视觉元素。4.2 Item4.2.1 几何属性(Geometry&#xff09;:4.2.2 布局处理:4.2.3 键处理&#xff1a;4.2.4 变换4.2.5 视觉4.2.6 状态定义 4.3 Rectangle4.3.1 颜色 4.4…

系统化学习 H264视频编码(01)基础概念

说明&#xff1a;我们参考黄金圈学习法&#xff08;什么是黄金圈法则?->模型 黄金圈法则&#xff0c;本文使用&#xff1a;why-what&#xff09;来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法&#xff0c;理论方面会更多地讲清楚 音视频中概念的…

基于java+springboot+vue实现的校园二手书交易平台(文末源码+Lw)287

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

【hive】数据采样

参考https://hadoopsters.com/how-random-sampling-in-hive-works-and-how-to-use-it-7cdb975aa8e2&#xff0c;可以直接查看原文&#xff0c;下面只是对原文进行概括和实际性能测试。 1.distribute by sort by2.测试3.map端数据过滤优化采样 在说数据采样之前&#xff0c;需要…

03_Shell变量

【Shell】03_Shell变量 一、环境变量 Linux系统配置文件&#xff08;全局配置文件和用户个人配置文件&#xff09;中定义的变量&#xff0c;提供给所有Shell程序使用 1.1、全局环境变量 1.1.1、配置文件位置 /etc/environment /etc/bashrc&#xff08;或者/etc/bash.bashrc…

PTA - sdut-使用函数求a+aa+aaa++⋯+aa.....aaa(n个a)之和

题目描述&#xff1a; 给定两个均不超过9的正整数a和n&#xff0c;要求&#xff1a;编写函数fn(a,n)&#xff0c; 求aaaaaa⋯aa⋯aa(n个a&#xff09;之和&#xff0c;fn须返回的是数列之和。 函数接口定义&#xff1a; def fn(a,n):其中&#xff0c; a 和 n 都是传入的参数…

IEC62056标准体系简介-2.IEC62056标准体系及对象标识系统(OBIS)

1. IEC 62056标准体系 IEC 62056标准体系目前共包括六部分&#xff0c;见图1&#xff1a; 第61部分&#xff1a;对象标识系统第62部分&#xff1a;接口类第53部分&#xff1a;COSEM应用层第46部分&#xff1a;使用HDLC&#xff08;High Level Data Link Control&#xff09;协…

39 线程库

目录 thread类的简单介绍线程函数参数锁线程交替打印原子性操作库无锁CAS智能指针的线程安全单例模式的线程安全 1. thread类的简单介绍 在c11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;如windows和linux下各有自己的接口&#xff0c;这使得…

【STM32/HAL】嵌入式课程设计:简单的温室环境监测系统|DS18B20 、DHT11

前言 板子上的外设有限&#xff0c;加上想法也很局限&#xff0c;就用几个传感器实现了非常简单的监测&#xff0c;显示和效应也没用太复杂的效果。虽说很简单&#xff0c;但传感器驱动还是琢磨了不久&#xff0c;加上串口线坏了&#xff0c;调试了半天才发现不是代码错了而是…

多标签问题

一、多标签问题与单标签问题的区别&#xff1a; 多标签问题是单标签问题的推广。 举个例子&#xff0c;同时识别图片中的小汽车&#xff0c;公交车&#xff0c;行人时&#xff0c;标签值有三个&#xff1a;小汽车&#xff0c;公交车&#xff0c;行人。 单标签问题仅对一个标签…

网络安全——防御实验

防御实验一 拓扑结构展示&#xff1a; 一、 根据题目&#xff0c;先为办公区做安全策略主要策略有以下几点&#xff1a; 1、书写名称和描述&#xff0c;名称和描述要明确&#xff0c;让除本人以外的人也能理解 2、确定源地址为办公区&#xff0c;目标地址为DMZ区 3、确定时间…

utf8mb4和utf8的不同、若依框架,代码生成器,gitee,前端vue的下载、修复和启动(寻求大佬帮助若依框架三、2.3)

2024.7.9 一、数据库的排序和统一问题。utf8mb4和utf8的不同1.1 发现问题1.2 解决问题-在idea中用sql生成器&#xff0c;生成sql语句&#xff0c;然后在里面修改1.3 utf8和utf8mb4的区别 二、若依前后端框架。代码生成器&#xff08;还没研究懂&#xff0c;但有三个方案&#x…

2024前端面试真题【JS篇】

DOM DOM&#xff1a;文本对象模型&#xff0c;是HTML和XML文档的编程接口。提供了对文档的结构化的表述&#xff0c;并定义可一种方式可以使从程序中对该结构进行访问&#xff0c;从而改变文档的结构、样式和内容。 DOM操作 创建节点&#xff1a;document.createElement()、do…

ER模型理论和三范式

ER模型理论和三范式 各种关系多对一一对一一对多多对多 三范式理论函数依赖完全函数依赖部分函数依赖传递&#xff08;间接&#xff09;函数依赖 第一范式&#xff1a;属性&#xff08;表字段&#xff09;不可切割第二范式&#xff1a;不能存在 部分函数依赖(都存在完全函数依赖…

最全windows提权总结(建议收藏)

当以低权用户进去一个陌生的windows机器后&#xff0c;无论是提权还是后续做什么&#xff0c;第一步肯定要尽可能的搜集信息。知己知彼&#xff0c;才百战不殆。 常规信息搜集 systeminfo 查询系统信息hostname 主机名net user 查看用户信息netstat -ano|find "3389&quo…