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 cv2image = 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 cv2image = 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 cv2image = 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)  # 核大小为5cv2.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,最大阈值200cv2.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.rhkb.cn/news/279887.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大厂面试--是否熟悉Node, 主要做过哪些业务,平时用过什么包?

什么是Node ​ Node是一个让Javascript运行在服务端的开发平台,它让Javascript成为了与PHP、Python、Perl、Ruby等服务器语言平起平坐的脚本语言。目前Nodejs已发展成一个成熟的开发平台,吸引了许多开发者。有许多大型高流量网站都采用Nodejs进行开发&a…

Linux——程序地址空间

我们先来看这样一段代码&#xff1a; #include <stdio.h> #include <unistd.h> #include <stdlib.h>int g_val 0;int main() {pid_t id fork();if(id < 0){perror("fork");return 0;}else if(id 0){ //child,子进程肯定先跑完&#xff0c;也…

牛客网-SQL大厂面试题-2.平均播放进度大于60%的视频类别

题目&#xff1a;平均播放进度大于60%的视频类别 DROP TABLE IF EXISTS tb_user_video_log, tb_video_info; CREATE TABLE tb_user_video_log (id INT PRIMARY KEY AUTO_INCREMENT COMMENT 自增ID,uid INT NOT NULL COMMENT 用户ID,video_id INT NOT NULL COMMENT 视频ID,start…

单片机LED灯闪烁

延时函数计算&#xff08;相关代码生成&#xff09;&#xff1a; #include "reg52.h" #include <INTRINS.H> void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();_nop_();i 22;j 3;k 227;do{do{while (--k);} while (--j);} while (--i); }vo…

Elasticsearch实战:索引阻塞 —— 数据保护的终极武器

文章目录 1、索引阻塞的种类2、什么时候使用阻塞&#xff1f;场景1&#xff1a;进行系统维护场景。场景2&#xff1a;保护数据不被随意更改场景。场景3&#xff1a;优化资源使用的场景。场景4&#xff1a;遵守安全规则场景。 3、添加索引阻塞API4、解除设置 API5、小结6、参考 …

网络编程:包头分析

一、以太网头 以太网中封装了源mac地址以及目的mac地址&#xff0c;还有ip类型&#xff0c;以太网又称为mac头 0X0800 只接收发往本机的mac的ipv4类型的数据帧 0X0806 只接收发往本机的ARP类型的数据帧 0x8035 只接受发往本机的RARP类型的数据帧 0X0003 接收发往本机的MAC所…

Android分区存储到底该怎么做

文章目录 一、Android存储结构二、什么是分区存储&#xff1f;三、私有目录和公有目录三、存储权限和分区存储有什么关系&#xff1f;四、我们应该该怎么做适配&#xff1f;4.1、利用File进行操作4.2、使用MediaStore操作数据库 一、Android存储结构 Android存储分为内部存储和…

好就业三种专业#信息安全#云计算#网络工程

一、信息安全专业 根据2021年网络安全宣传周白皮书的观察结果&#xff0c;网络安全产业对于人才的需求正以高速增长的趋势呈现&#xff0c;当前网络安全行业存在着巨大的人才缺口&#xff0c;平均供求比例约为1:2。这一现象导致了资深人才的储备不足&#xff0c;并且新人才的培…

Python通过Ctypes调用C++类,实测有效

文章目录 前言创建vs dll工程添加外部库编辑代码编译测试参考 前言 在软件开发中&#xff0c;有时候需要Python与C相结合&#xff0c;以充分发挥两者的优势 。Python作为一种高级编程语言&#xff0c;具有简洁易读的特点&#xff0c;适用于快速开发和原型设计。而C则是一种性能…

活动图高阶讲解-03

1 00:00:00,000 --> 00:00:06,260 刚才我们讲了活动图的历史 2 00:00:06,260 --> 00:00:11,460 那我们来看这个活动图 3 00:00:11,460 --> 00:00:15,260 如果用来建模的话怎么用 4 00:00:15,260 --> 00:00:20,100 按照我们前面讲的软件方法的工作流 5 00:00:20…

网络工程师之路由交换技术篇

网络工程师之路由交换技术篇 路由交换之技术篇ARPICMPBPDUIPv6IP编址MAC其他技术点参考 以下均为个人笔记&#xff0c;摘录到csdn做备份 路由交换之技术篇 ARP Operation Code指定了ARP报文的类型&#xff0c; 包括ARP request 和ARP reply&#xff1b;取值为1或者2 &#x…

1.3抽象数据类型的表现和实现

1、实例 &#xff1a; #include<stdio.h> #include<stdio.h> #include<string.h> #pragma warning(disable:4996) ADT Complex{D {r1,r2 | r1,r2 都是实数}S {<r1&#xff0c;r2> | r1是实部&#xff0c;r2是虚部}assign(&C, v1, v2)初始条件:空…

解决谷歌浏览器最新chrome94版本CORS跨域问题

项目场景&#xff1a; 谷歌浏览器升级到chrome94版本出现CORS跨域问题 问题描述 解决谷歌浏览器最新chrome94版本CORS跨域问题。 CORS跨域问题&#xff1a; 升级谷歌浏览器最新chrome94版本后&#xff0c;提示Access to XMLHttpRequest at ‘http://localhost:xxxx/api’ fro…

MISC:常见编码

一、字符编码 1.ASCII码 使用指定7位或8位二进制数组合表示128-256种可能。 常⻅考点&#xff1a;解题过程中给出十进制或十六进制的连续数值。 进制转换工具&#xff1a; ASCII text,Hex,Binary,Decimal,Base64 converter (rapidtables.com) 2.Base64编码 ASCII编码以8个比特…

【Datawhale组队学习:Sora原理与技术实战】使用KAN-TTS合成女生沪语音频

Sambert-Hifigan模型介绍 拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用&#xff0c;故此处仅涉及参数法。 参数TTS系统可分为两大模块&#xff1a;前端和后端。 前端包含文本正则、分词、多音字预测、文本转音素和韵律预测等模块&am…

Vue组件中引入jQuery

两种在vue中引入jQuery的方式 1、普通html中使用jQuery 将jQuer的文件导入到项目中&#xff0c;然后直接使用<script src"jQuery.js"></script>即可。 <script src"jQuery.js"></script> 2、vue组件中使用jQuery 安装依赖 c…

unity报错出现Asset database transaction committed twice!

错误描述&#xff1a; 运行时报错 Assertion failed on expression: ‘m_ErrorCode MDB_MAP_RESIZED || !HasAbortingErrors()’Asset database transaction committed twice!Assertion failed on expression: ‘errors MDB_SUCCESS || errors MDB_NOTFOUND’ 解决办法&…

数据库字段类似 longblob,Navicat里看不到数据,看到的是BLOB。如何看到?

SELECT cast(库对应的字段 as char) FROM sys_notice; 例如&#xff0c;我的直接这样写 SELECT cast(notice_content as char) FROM sys_notice; 最后就能看到信息了

免费开源的 Vue 拖拽组件 VueDraggablePlus (兼容移动端)

VueDraggablePlus 支持 Vue2 / Vue3&#xff0c;是被尤雨溪推荐了的拖拽组件。我自己试用过了&#xff0c;还挺好用的&#xff0c;兼容移动端。 官网&#xff1a;https://alfred-skyblue.github.io/vue-draggable-plus/ 官网文档里面很详细了&#xff0c;我就不再介绍安装和用…

国内超好用且免费的 AI 写作工具有哪些?

目前&#xff0c;市面上这类AI工具实在是太多了&#xff0c;比如依托于清华大学开发的智谱清言&#xff0c;或亦是百度的文心一言&#xff0c;还是阿里云的通义千问&#xff0c;这些AI工具在功能是类似的&#xff0c;但是依托于大模型的不同&#xff0c;可能回答的结果迥然不同…