当前位置: 首页 > news >正文

人工智能算法工程师(中级)课程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中常用的高级视觉操作的概览。每个操作都有其特定的应用场景和参数设置,可以根据实际需求进行调整。在实际应用中,可能需要结合多种操作来达到预期的图像处理效果。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于STM32设计的药品柜温湿度监测系统(华为云IOT)(184)
  • Linux 命令集
  • 【ai】决策树
  • 关于魔兽世界服务器负载的资料、计算和思考
  • 修改ES索引名称
  • vue3中谷歌地图+外网申请-原生-实现地址输入搜索+点击地图获取地址回显 +获取国外的geoJson实现省市区级联选择
  • 什么是软件定义安全SDSec
  • Archery 之SQL审核系统部署
  • MT6825磁编码IC在智能双旋机器人中的应用
  • 端到端拥塞控制的本质
  • CSS实现table表格:隔行换色的效果
  • 使用F1C200S从零制作掌机之debian文件系统完善NES
  • 电压反馈型运算放大器的增益和带宽
  • Delta的最新更新可让iPad用户同时模拟多款游戏
  • Redis6.2.1版本集群新加副本
  • [deviceone开发]-do_Webview的基本示例
  • [译]前端离线指南(上)
  • 【面试系列】之二:关于js原型
  • dva中组件的懒加载
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JavaScript 一些 DOM 的知识点
  • JavaScript类型识别
  • SpiderData 2019年2月13日 DApp数据排行榜
  • text-decoration与color属性
  • Twitter赢在开放,三年创造奇迹
  • 聊聊hikari连接池的leakDetectionThreshold
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 使用 Docker 部署 Spring Boot项目
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 一道面试题引发的“血案”
  • 以太坊客户端Geth命令参数详解
  • 【干货分享】dos命令大全
  • Hibernate主键生成策略及选择
  • 如何在招聘中考核.NET架构师
  • ​ArcGIS Pro 如何批量删除字段
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #QT(智能家居界面-界面切换)
  • #预处理和函数的对比以及条件编译
  • (06)金属布线——为半导体注入生命的连接
  • (4)(4.6) Triducer
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (NSDate) 时间 (time )比较
  • (Ruby)Ubuntu12.04安装Rails环境
  • (不用互三)AI绘画工具应该如何选择
  • (二开)Flink 修改源码拓展 SQL 语法
  • (回溯) LeetCode 46. 全排列
  • (算法)大数的进制转换
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .CSS-hover 的解释
  • .env.development、.env.production、.env.staging
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET_WebForm_layui控件使用及与webform联合使用
  • .net6+aspose.words导出word并转pdf
  • @JoinTable会自动删除关联表的数据