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.hqwc.cn/news/545128.html

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

相关文章

2025武忠祥考研数学,视频百度网盘+基础全程课程PDF

“得数学者的天下”,25考研首先要开始的就是数学复习,而数学复习首先要开始的必然是高数! 很多同学选择了跟着武忠祥老师学习高数,但是具体要怎么学?用什么书?怎么刷题?快来看看以 下的武忠祥…

[自研开源] MyData 数据集成之数据过滤 v0.7.2

开源地址:gitee | github 详细介绍:MyData 基于 Web API 的数据集成平台 部署文档:用 Docker 部署 MyData 使用手册:MyData 使用手册 试用体验:https://demo.mydata.work 交流Q群:430089673 概述 本篇基于…

操作系统镜像文件(win,centos)

下载镜像 下载地址 MSDN, 我告诉你 - 做一个安静的工具站 如果想要在vm中全屏的建议下载待spl的镜像文件,不然会搞不起来全屏 找到自己写想要的镜像文件,这边我选了win7 复制圈起来的路径,到迅雷中新建下载即可 安装window可能需要密钥 …

线程是如何在 6 种状态之间转换的

线程是如何在 6 种状态之间转换的 线程的 6 种状态New 新创建Runnable 可运行阻塞状态Blocked 被阻塞Waiting 等待Timed Waiting 限期等待 注意点 主要学习线程是如何在 6 种状态之间转换。 线程的 6 种状态 就像生物从出生到长大、最终死亡的过程一样,线程也有自己…

4.1_1 初识文件管理

文章目录 4.1_1 初识文件管理(一)文件的属性(二)文件内部的数据应该怎样组织起来(三)文件之间应该怎样组织起来(四)操作系统应该向上提供哪些功能(五)从上往下…

android studio 连接mumu模拟器调试

1、打开mumu模拟器 2、在Android Studio 中 控制台 cd 到 sdk 目录下 platform-tools 文件夹,有一个adb.exe 可运行程序 一般指令: adb connect 127.0.0.1:7555 但是这个执行在window环境下可能会报错 解决方法是在 adb 之前加 ".\", 问题…

JavaWeb一些开发问题

一、Restful package com.example.crudtest1.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data NoArgsConstructor AllArgsConstructor public class Result {private Integer code;//响应码,1 代表成功; 0 代表失…

【现代C++】移动语义和右值引用

现代C++中的移动语义和右值引用是C++11引入的重要特性,旨在优化资源管理和提升性能。这些特性允许资源的转移而非复制,特别是对于临时对象和大型对象。 1. 右值引用 右值引用是对临时对象的引用,它允许你修改临时对象。使用&&来声明右值引用。 #include <iost…

【NTN 卫星通信】 TN和多NTN配合的应用场景

1 场景描述 此场景描述了农村环境&#xff0c;其中MNO (运营商TerrA)仅在城市附近提供本地地面覆盖&#xff0c;而MNO (SatA)提供广泛的NTN覆盖。SatA使用GSO轨道和NGSO轨道上的卫星。SatA与TerrA有漫游协议&#xff0c;允许:   所有TerrA用户的连接&#xff0c;当这些用户不…

论文浅尝 | GPT-RE:基于大语言模型针对关系抽取的上下文学习

笔记整理&#xff1a;张廉臣&#xff0c;东南大学硕士&#xff0c;研究方向为自然语言处理、信息抽取 链接&#xff1a;https://arxiv.org/pdf/2305.02105.pdf 1、动机 在很多自然语言处理任务中&#xff0c;上下文学习的性能已经媲美甚至超过了全资源微调的方法。但是&#xf…

第二十五天-Seaborn数据可视化库

目录 1.介绍 2.使用 1.seaborn官网&#xff1a; 2.安装 3.基础用法 4.导入数据 5.分析基金数据 1.绘制每个月收盘价的趋势线 2.计算涨跌幅 3.设置统计基点 4.分布图&#xff1a;分析涨跌幅数量 5.箱型图 6.回归图 7.热力图 1.介绍 1.与matplotlib区别 2.基于matp…

矩阵中移动的最大次数

文章目录 所属专栏:BFS算法 题目链接 思路如下&#xff1a; 1.首先我们需要从第一列开始遍历&#xff0c;寻找每一个都能够满足条件的位置&#xff0c;将它插入到数组里面 2.第一列遍历完了后我们先判断第一列的数是否都满足条件插入到数组里面&#xff0c;如果数组为空&#…