OPENCV(0-1之0.2)

news2024/11/19 14:23:49

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算法进行边缘检测,这些滤波和边缘检测技术对于去除噪声和提取图像特征极为重要。最后,仿射变换和透视变换,这两种图像变换技术能够进行更复杂的图像形变和视角变换。

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

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

相关文章

Filebeat(Beats)详细介绍与使用

1. 什么是 Beats? Beats 是开源数据传送器,将其作为代理安装在服务器上,以将操作数据发送到 Elasticsearch。 Elastic提供Beats用于捕获: 审核数据:Auditbeat 日志文件和日志:Filebeat 云数据:Functio…

【物联网学习笔记】CubeMx6.10+STM32F407ZGT6+LWIP最最最基础配置

使用正点原子探索者开发板 板载芯片:STM32F407ZGT6 PHY芯片:LAN8720 LWIP版本:2.1.2 本次目标:先ping通开发板再说! 文章目录 一、CubeMX配置1、时钟配置2、ETH配置3、LWIP配置4、添加LAN8720的复位引脚 二、Keil工…

单链表——增删查改

本节复习链表的增删查改 首先, 链表不是连续的, 而是通过指针联系起来的。 如图: 这四个节点不是连续的内存空间, 但是彼此之间使用了一个指针来连接。 这就是链表。 现在我们来实现链表的增删查改。 目录 单链表的全部接口…

JVM之调优(一)

背景:生产环境由于堆内存较大,fullgc 垃圾回收导致程序卡顿问题(假死) 目录 一、程序卡顿导致的影响 前端页面空白后端数据重复 二、解决方法 降低堆内存大小使用合适的垃圾回收器(可以尝试,还未进行测试…

【毕设级项目】基于嵌入式的智能家居控制板(完整工程资料源码)

基于嵌入式的智能家居控制板演示效果 基于嵌入式的智能家居控制板 前言: 随着科技的不断进步,物联网技术得到了突飞猛进的发展。智能家居是物联网技术的典型应用领域之一。智能家居系统将独立家用电器、安防设备连接成一个具有思想的整体,实现…

Android Studio入门——页面跳转

1.工程目录 2.MainActivity package com.example.demo01;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCo…

数据集成工具 ---- datax 3.0

1、datax: 是一个异构数据源离线同步工具,致力于实现关系型数据库(mysql、oracle等)hdfs、hive、hbase等各种异构数据源之间的数据同步 2、参考网址文献: https://github.com/alibaba/DataX/blob/master/introduction.mdhttps:/…

pycharm配置解释器

pycharm配置解释器 1.mac配置解释器 1.mac配置解释器

【C++庖丁解牛】STL简介 | string容器初次见面

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1. 什么是STL2. STL的版本…

扫描全能王发布2023“绿色数据”:减碳超12万吨,相当于多种700万棵树

近年来,“绿色转型”“低碳生活”成为全民热议话题。从全国覆盖率越来越高的“垃圾分类”,到蓬勃发展的“无纸化办公”,低碳生活、绿色消费的环保风尚不断兴起。植树节将至,合合信息旗下扫描全能王发布了年度用户文档扫描数据&…

详细分析Mysql中的LOCATE函数(附Demo)

目录 1. 基本概念2. Demo3. 实战 1. 基本概念 LOCATE()函数在SQL中用于在字符串中查找子字符串的位置 它的一般语法如下: LOCATE(substring, string, start)LOCATE()函数返回子字符串在主字符串中第一次出现的位置 如果未找到子字符串,则返回0 具体的…

如何在群晖用Docker本地搭建Vocechat聊天服务并无公网ip远程交流协作

文章目录 1. 拉取Vocechat2. 运行Vocechat3. 本地局域网访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问小结 7. 固定公网地址 如何拥有自己的一个聊天软件服务? 本例介绍一个自己本地即可搭建的聊天工具,不仅轻量,占用小,且功能也停强大,它就是Vocechat. Vocechat是一套支持…

【BFS二叉树】113路径总和II

113路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 思路: 题目最终输出的是路径,因此用BFS遍历的时候,需要记录走到每个节点的路径&#xff1…

ISIS单区域实验简述

ISIS 中间系统到中间系统,也是链路状态协议,工作在数据链路层,不依赖IP地址;与OSPF一样采用最短路径SPF算法,收敛速度快。 实验基础配置: r1: sys sysname r1 undo info enable int g0/0/0 ip add 12.1.1.1…

基于XMind的E-R图制作【笔记】

基于XMind的E-R图制作【笔记】 前言版权基于XMind的E-R图制作1.打开XMind2.选择模板3.插入一个自由主题4.为它插入子主题5.快速插入子主题6. 统一设置子主题样式 最后 前言 2024-3-11 10:36:33 以下内容源自《【创作模板】》 仅供学习交流使用 版权 禁止其他平台发布时删除…

js【详解】ajax (含XMLHttpRequest、 同源策略、跨域)

ajax 的核心API – XMLHttpRequest get 请求 // 新建 XMLHttpRequest 对象的实例 const xhr new XMLHttpRequest(); // 发起 get 请求,open 的三个参数为:请求类型,请求地址,是否异步请求( true 为异步,f…

程序语言设计

一、程序设计语言及其构成 1.程序设计语言 2.高级程序设计语言划分 3.常见的高级程序语言 4.标记语言 5.程序设计语言的构成 二、表达式 表达式的类型及转换规则 三、传值和传址调用 1.数据类型 2.传值和传址调用 四、语言处理程序 1.语言处理程序 语言处理程序&#xff1…

kangle一键安装脚本

Kangle一键脚本,是一款可以一键安装KangleEasypanelMySQLPHP集合的Linux脚本。 脚本本身集成:PHP5.38.2、MYSQL5.68.0,支持极速安装和编译安装2种模式,支持CDN专属安装模式。同时也对Easypanel面板进行了大量优化。 脚本特点 ◎…

FreeRTOS 的任务挂起和恢复

1. 任务挂起和恢复的 API 函数 API函数描述vTaskSuspend()挂起任务vTaskResume()恢复被挂起的任务xTaskResumeFromISR()在中断中恢复被挂起的任务 挂起:挂起任务类似暂停,可恢复; 删除任务,堆栈都给释放掉了,无法恢复…

某电信公司组织结构优化咨询项目成功案例纪实

——构建前后端组织结构,提升组织运营效率 随着企业的不断发展,行业的竞争也越来越激烈,企业只能不断调整自身的战略才能更好的适应这样的大环境。在战略调整的过程中,企业往往会面临这样的问题:管理层的经营理念各不…