OPENCV(0-1之0.2)

OPENCV-0.2

  • 学习安排
  • 图像基础
    • 像素
      • 访问和修改像素值
    • 色彩空间转换
      • RGB到灰度的转换
      • RGB到HSV的转换
  • 图像操作
    • 裁剪
    • 缩放
    • 旋转和翻转
  • 图像滤波
    • 平滑和模糊图像
    • 边缘检测
  • 图像变换
    • 仿射变换
    • 透视变换
  • 总结

官方文档

学习安排

  1. 图像基础
  1. 像素:了解像素的概念,包括像素值的意义(如RGB颜色空间中的R、G、B值),以及如何访问和修改图像的像素值。
  2. 色彩空间转换:学习如何在不同的色彩空间之间转换图像,例如从RGB转换到灰度、HSV(色调、饱和度、亮度)等。这对于图像处理的很多应用都是基础,例如在特定色彩空间中更容易地进行颜色检测和跟踪。
  1. 图像操作
  1. 图像裁剪:学习如何裁剪图像的特定区域。这在需要关注图像的某一部分时非常有用。
  2. 缩放:了解如何改变图像的尺寸,包括使用不同的插值方法来优化缩放的效果。
  3. 旋转和翻转:学习如何对图像进行旋转和翻转操作,这对于图像校正或增强用户体验很有帮助。
  1. 图像滤波
  1. 平滑和模糊图像:掌握使用不同类型的滤波器(如均值滤波、高斯滤波等)来平滑或模糊图像,这对于去噪或降低图像的细节级别很有用。
  2. 边缘检测算法:学习使用如Canny边缘检测器来识别图像中的边缘。边缘检测是许多图像处理任务(如图像分割、物体检测等)的重要步骤。
  1. 图像变换
  1. 仿射变换:了解如何使用仿射变换来进行图像的平移、缩放、旋转以及倾斜校正。
  2. 透视变换:学习透视变换的原理和应用,如何利用透视变换进行图像的矫正和视角变换,这在进行图像分析和增强现实应用中非常重要。

图像基础

像素

像素,或称图像元素,是构成数字图像的基本单位。每个像素包含了该点的颜色信息,对于彩色图像来说,通常使用RGB色彩模型,其中R、G、B分别代表红色、绿色和蓝色通道的强度值。在计算机中,这些值通常范围从0到255。

访问和修改像素值

代码

import cv2

image = cv2.imread('../image.jpg')
# 访问坐标为(0, 0)的像素值
pixel_value = image[0, 0]
print(pixel_value)  # 对于彩色图像,这将打印出[B, G, R]值

# 修改坐标为(0, 0)的像素值
image[0, 0] = [255, 255, 255]  # 将此像素修改为白色
print(image[0, 0])

结果
在这里插入图片描述

色彩空间转换

色彩空间是一种用来表示、组织和创建颜色的方法。除了常见的RGB色彩空间外,还有很多其他色彩空间,如HSV(Hue, Saturation, Value/色调、饱和度、亮度)、LAB等。不同的色彩空间对于某些图像处理任务更为适合。

RGB到灰度的转换

代码

import cv2

image = cv2.imread('../image.jpg')

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

cv2.imshow('Original Image', image)
cv2.imshow('Grayscale Image', gray_image)
cv2.waitKey(0)  # 等待按键
cv2.destroyAllWindows()  # 关闭窗口

结果
在这里插入图片描述

RGB到HSV的转换

代码

import cv2

image = cv2.imread('../image.jpg')

hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

cv2.imshow('Original Image', image)
cv2.imshow('Hsv Image', hsv_image)
cv2.waitKey(0)  # 等待按键
cv2.destroyAllWindows()  # 关闭窗口

结果
在这里插入图片描述

图像操作

裁剪

是指从原图中选择一个感兴趣的区域(ROI,Region of Interest)并提取出来。
通过数组切片的方式来裁剪图像。

代码

import cv2

# 加载图像
image = cv2.imread('../image.jpg')

# 裁剪图像
# 假设我们想裁剪坐标在 x1:x2 和 y1:y2 的区域
x1, y1, x2, y2 = 100, 100, 300, 300
cropped_image = image[y1:y2, x1:x2]
cv2.imshow('Original Image', image)
# 显示裁剪后的图像
cv2.imshow('Cropped Image', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果
在这里插入图片描述

缩放

是改变图像尺寸的过程。

代码

import cv2

# 加载图像
image = cv2.imread('../image.jpg')
cv2.imshow('Original Image', image)

# 将图像缩放到指定的新尺寸
new_width, new_height = 200, 200
INTER_LINEAR_image = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_LINEAR)
INTER_NEAREST_image = cv2.resize(image, (new_width * 2, new_height * 2), interpolation=cv2.INTER_NEAREST)
INTER_AREA_image = cv2.resize(image, (new_width // 2, new_height // 2), interpolation=cv2.INTER_AREA)
INTER_CUBIC_image = cv2.resize(image, (new_width * 3, new_height * 3), interpolation=cv2.INTER_CUBIC)

# 显示缩放后的图像
cv2.imshow('INTER_LINEAR', INTER_LINEAR_image)
cv2.imshow('INTER_NEAREST', INTER_NEAREST_image)
cv2.imshow('INTER_AREA', INTER_AREA_image)
cv2.imshow('INTER_CUBIC', INTER_CUBIC_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果
在这里插入图片描述

其中:

常用的插值方法包括:

  1. cv2.INTER_LINEAR:线性插值,适合缩放
  2. cv2.INTER_NEAREST:最近邻插值,速度最快
  3. cv2.INTER_AREA:使用像素区域关系,适合缩小图像
  4. cv2.INTER_CUBIC:三次样条插值,适合放大图像

旋转和翻转

旋转是将图像围绕其中心点旋转给定角度的过程.
翻转是沿水平或垂直轴反转图像。

代码

import cv2

# 加载图像
image = cv2.imread('../image.jpg')
cv2.imshow('Original Image', image)
# 旋转图像
center = (image.shape[1] // 2, image.shape[0] // 2)  # 图像中心点
angle = 90  # 旋转角度
scale = 1.0  # 缩放比例
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
rotated_image = cv2.warpAffine(image, rotation_matrix, (image.shape[1], image.shape[0]))

# 翻转图像
flipped_image = cv2.flip(image, 1)  # 1表示水平翻转,0表示垂直翻转

# 显示旋转和翻转后的图像
cv2.imshow('Rotated Image', rotated_image)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

cv2.imshow('Flipped Image', flipped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果
在这里插入图片描述

图像滤波

平滑和模糊图像

图像的平滑和模糊处理通常用于去除噪声或降低图像的细节。
可以通过各种低通滤波器(LPF)来实现,低通滤波器有助于去除图像中的高频内容(如边缘、噪声等)

代码

import cv2

# 加载图像
image = cv2.imread('../image.jpg')
cv2.imshow('Original Image', image)
blur = cv2.blur(image, (5, 5))  # 使用5x5的核进行均值滤波
gaussian_blur = cv2.GaussianBlur(image, (5, 5), 0)  # 5x5高斯核,标准差由函数自动计算
median_blur = cv2.medianBlur(image, 5)  # 核大小为5

cv2.imshow('blur', blur)
cv2.imshow('gaussian_blur', gaussian_blur)
cv2.imshow('median_blur', median_blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果
在这里插入图片描述

边缘检测

边缘检测是图像处理中用于识别图像中对象边界的技术。它主要依赖于检测图像亮度的突变,这些突变通常对应于图像中的边缘。

代码

import cv2

# 加载图像
image = cv2.imread('../image.jpg')
cv2.imshow('Original Image', image)
# Sobel算子:在水平和垂直方向上检测边缘
sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5)  # 水平方向
sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5)  # 垂直方向
sobel_combined = cv2.addWeighted(cv2.convertScaleAbs(sobelx), 0.5, cv2.convertScaleAbs(sobely), 0.5, 0)  # 合并
# Canny边缘检测:Canny算法是一种流行的边缘检测算法,因为它是自适应的,且效果较好。
edges = cv2.Canny(image, 100, 200)  # 最小阈值100,最大阈值200

cv2.imshow('Sobelx', sobelx)
cv2.imshow('Sobely', sobely)
cv2.imshow('sobel_combined', sobel_combined)
cv2.imshow('edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果

在这里插入图片描述

图像变换

仿射变换

仿射变换(Affine Transformation)是一种二维图像变换,它包括旋转、缩放、平移和倾斜等变换。仿射变换的特点是直线在变换后仍然是直线,平行线仍然保持平行,但圆形可能变为椭圆。

代码

import cv2
import numpy as np

# 加载图像
image = cv2.imread('../image.jpg')
cv2.imshow('Original Image', image)
rows, cols, ch = image.shape

# 原图中的三个点及其在输出图像中的目标位置
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])

# 生成仿射变换矩阵并应用它
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(image, M, (cols, rows))

cv2.imshow('Affine Transformation', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果
在这里插入图片描述

透视变换

透视变换(Perspective Transformation)允许图像进行更复杂的变形,比如从一个视角到另一个视角的变换,可以用来模拟相机视角的改变,例如实现全景图的拼接。在透视变换中,需要指定图像上的四个点及其对应在输出图像中的位置。

代码

import cv2
import numpy as np

# 加载图像
image = cv2.imread('../image.jpg')
cv2.imshow('Original Image', image)
rows, cols, ch = image.shape

# 假设pts1是图像上的四个点,pts2是变换后的目标位置
pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])

# 生成透视变换矩阵并应用它
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(image, M, (300, 300))

cv2.imshow('Perspective Transformation', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果
在这里插入图片描述

总结

在本次图像处理基础学习阶段,深入了解像素和色彩空间转换的概念,包括如何在RGB、灰度和HSV等色彩空间之间转换图像。图像的基本操作技巧,如裁剪、缩放、旋转和翻转,这些操作是图像处理中不可或缺的部分。此外,我通过均值滤波、高斯滤波和中值滤波等方法对图像进行平滑和模糊处理,以及利用Sobel算子和Canny算法进行边缘检测,这些滤波和边缘检测技术对于去除噪声和提取图像特征极为重要。最后,仿射变换和透视变换,这两种图像变换技术能够进行更复杂的图像形变和视角变换。

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

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

相关文章

【原创】java+swing+mysql二手车交易管理系统

前言: 本文主要介绍了二手车交易管理设计与实现。首先,通过市场需求,我们确定了二手车的功能,通常的二手车交易系统都是B/S架构,然而我们今天要用javaswing去开发一个C/S架构的二手车交易管理系统,主要功能…

从政府工作报告中的IT热词统计探计算机行业发展(一)数字+:21次

政府工作报告作为政府工作的全面总结和未来规划,不仅反映了国家整体的发展态势,也为各行各业提供了发展的指引和参考。随着信息技术的快速发展,计算机行业已经成为推动经济社会发展的重要引擎之一。因此,从政府工作报告中探寻计算…

Tomcat内存马

Tomcat内存马 前言 描述Servlet3.0后允许动态注册组件 这一技术的实现有赖于官方对Servlet3.0的升级,Servlet在3.0版本之后能够支持动态注册组件。 而Tomcat直到7.x才支持Servlet3.0,因此通过动态添加恶意组件注入内存马的方式适合Tomcat7.x及以上。…

蓝桥杯小白赛第 7 场 3.奇偶排序(sort排序 + 双数组)

思路:在第一次看到这道题的时候我第一想法是用冒泡,但好像我的水平还不允许我写出来。我又读了遍题目发现它的数据很小,我就寻思着把它分成奇偶两部分。应该怎么分呢? 当然在读入的时候把这个问题解决就最好了。正好它的数据范围…

MySQL-JDBC初识

文章目录 前言一、数据库编程的必备条件二、 Java的数据库编程:JDBC三、JDBC工作原理四、JDBC使用4.1 JDBC开发案例4.2 JDBC使用步骤总结 五、JDBC常用接口和类5.1 JDBC API5.2 数据库连接Connection5.3 Statement对象5.4 ResultSet对象 前言 为最近学习的JDBC知识…

Github: Github actions 自动化工作原理与多workflow创建

Github actions 1 )概述 Github Actions 是Github官方推出的 CI/CD 解决方案 https://docs.githu.com/en/actions 优点 自动发布流程可减少发布过程中手动操作成本,大幅提升ci/cd效率,快速实现项目发布上线 缺点 存在较高的技术门槛需要利用…

/usr/local/bin/docker-compose: line 1: Not: command not found

安装docker-compose 检查是否安装成功 docker-compose --version 出错 /usr/local/bin/docker-compose: line 1: Not: command not found 检查下载连接是否正确 官网 https://dockerdocs.cn/compose/install/ 根据官网上连接下载 发现下载不了 在版本前加个V 就可以解决 版…

【C++】类和对象终章

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 一、初始化列表1.1 初始化列表的形式1.2 初始化列表的注意事项 二、explicit关键…

一个页面请求从在浏览器中输入网址到页面最终呈现

前言-与正文无关 生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入工作的漩涡,忘记了停下脚步,感受周围的世界。让我们一起提醒自己,要适时放慢脚步…

校园闲置物品租售系统|基于springboot框架+ Mysql+Java+B/S架构的校园闲置物品租售系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 ​编辑 用户功能模块 商品购买管理 卖家功能模块 商品…

QML 布局管理器之GridLayout

一.QML GridLayout介绍 在QML中,GridLayout是一种用于布局元素的容器。它允许您以网格形式组织和排列元素。要使用rowspan、columnspan、layoutFillWidth和rowSpacing属性,您可以将一个元素跨越多行和多列,并填充整个宽度,同时设置…

【正则表达式】正则表达式里使用变量

码 const shuai No My Name Is ShuaiGe.match(new RegExp(shuai, gi)); //↑↑↑↑↑↑↑↑ //等同于 //↓↓↓↓↓↓↓↓ /No/gi.test(My Name Is ShuaiGe)用作领域 搜索的字符动态改变,例如↓模糊搜索例: 一个文本宽,输入文本模糊搜索用…

面试常问:为什么 Vite 速度比 Webpack 快?

前言 最近作者在学习 webpack 相关的知识,之前一直对这个问题不是特别了解,甚至讲不出个123....,这个问题在面试中也是常见的,作者在学习的过程当中总结了以下几点,在这里分享给大家看一下,当然最重要的是…

实现一个横向的picker

Picker 选择器显示一个或多个选项集合的可滚动列表,相比于原生 picker,实现了 iOS 与 Android 端体验的一致性。 要实现横向 picker,其实跟纵向 picker差不多,都支持滚动时停留在指定位置,并且支持滚动到边界支持反弹…

C语言中,基本数据类型介绍

C语言当中各种数据类型的大小,首先要了解有哪些数据类型。 一 字符型: 整数(字符)类型存储大小值范围char1 字节-128 到 127 或 0 到 255(2的8次方)unsigned char1 字节0 到 255()s…

C/C++火柴棍等式

有n根(n<24)火柴棍&#xff0c;你可以拼出多少个形如“ABC"的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零&#xff0c;则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示: 依次需要用到的火柴棍数目为6 2 5 5 4 5 6 3 7 6 。 如果是初学者可能会这么写。 …

shallowReactive浅层式响应对象

一、 reactive 和ref 都是深层响应式对象: 就是不管对象有多少层&#xff0c;修改此对象任一属性都会响应式处理 shallowReactive 和shallowRef 浅层响应式对象: 只会修改第一层对象&#xff0c;修改此对象第一层属性&#xff0c;视图会有同步变化&#xff0c;非第一层&#xf…

JVM学习-底层字节码的执行过程

目录 1.一个简单的程序分析 2. a&#xff0c;a&#xff0c;a--在JVM中的执行过程 3. 一个好玩的xx 4.方法调用的字节码分析、多态的实现、对象头 5. try-catch-finally的字节码分析 5.1 try-catch 5.2 try-catch-finally 5.3特殊情况 5.3.1 try和finally块中都出现了re…

面向对象技术(第二周)

目录 前言 ⚽回顾 &#x1f3d0;类的层次 定义 层次关系的实现 &#x1f3c0;继承 &#x1f94e;编程方法 非面向对象编程 根本思想 特点 例子&#xff08;设计一个画板系统Panel&#xff09; 第一步&#xff1a;整体设计 第二步&#xff1a;模块具体设计 缺点分…

Linux 常用命令100+

Linux 运维/开发/测试 常用命令100(v1.1) 帮助命令(2个) 命令功能说明示例man 命令查看普通命令帮助&#xff0c;命令的词典&#xff0c;更复杂的还有info&#xff0c;但不常用。rootbrLinux ~]#man lshelp 命令查看Linux内置命令的帮助&#xff0c;比如cd命令。[rootbrLinux…