OpenCV||超详细的图像处理模块

news2024/9/22 21:24:26

一、颜色变换cvtColor

dst = cv2.cvtColor(src, code[, dstCn[, dst]])
  • src: 输入图像,即要进行颜色空间转换的原始图像。
  • code: 转换代码,指定要执行的颜色空间转换类型。这是一个必需的参数,决定了源颜色空间到目标颜色空间的转换方式。
  • dstCn (可选): 目标图像的通道数;如果参数是0,则从srccode自动推导。
  • dst (可选): 输出图像,与src具有相同的大小和深度。

转换代码(code)

  • cv2.COLOR_BGR2GRAY: 将图像从BGR颜色空间转换到灰度空间。这是最常用的转换之一,因为灰度图像处理起来通常比彩色图像要快,而且在某些情况下(如边缘检测)效果也很好。
  • cv2.COLOR_BGR2HSV: 将图像从BGR颜色空间转换到HSV颜色空间。HSV(色调、饱和度、亮度)颜色空间对于处理与颜色相关的任务(如颜色跟踪)非常有用。
  • cv2.COLOR_BGR2RGB: 将图像从BGR颜色空间转换到RGB颜色空间。这在需要将图像用于某些只接受RGB图像的库或框架时很有用。
  • cv2.COLOR_HSV2BGR: 将图像从HSV颜色空间转换回BGR颜色空间。
  • cv2.COLOR_GRAY2BGR: 将灰度图像转换为BGR图像。虽然这通常不是一个实用的转换(因为结果图像将是单色的),但在某些情况下可能有用。

 注意事项:

1、cvtColor不能直接将RGB图像转换为二值图像,需要借助threshold函数。

2、如果对8bit图像使用cvtColor函数进行转换将会丢失一些信息。

二、画基本图形

 画点:直接使用Numpy中的arr[x,y] = number即可

画矩形:cv2.rectangle()

import cv2  
  
# 读取图像  
image = cv2.imread('your_image.jpg')  
  
# 绘制矩形的参数  
# (左上角x坐标, 左上角y坐标, 右下角x坐标, 右下角y坐标), (B, G, R), 线条粗细  
# 注意:OpenCV中图像坐标系的原点在左上角,x向右增加,y向下增加  
# BGR颜色格式,与常见的RGB相反  
rect_coords = (50, 50, 200, 200)  
color = (0, 255, 0)  # 绿色  
thickness = 2  # 线条粗细  
  
# 在图像上画矩形  
cv2.rectangle(image, rect_coords[0:2], rect_coords[2:4], color, thickness)  
  
# 显示图像  
cv2.imshow('Rectangle', image)  
  
# 等待按键事件  
cv2.waitKey(0)  
  
# 销毁所有OpenCV创建的窗口  
cv2.destroyAllWindows()
  • img: 输入的图像矩阵。
  • pt1: 矩形的左上角顶点坐标,格式为(x,y)。
  • pt2: 矩形的右下角顶点坐标,格式为(x,y)。注意,这两个点的次序可以互换,但绘制时会自动调整为左上角和右下角。
  • color: 矩形的颜色,可以是RGB元组或灰度值。
  • thickness: 矩形边框的宽度,默认为1。若设为-1,则表示绘制的是填充的矩形。
  • lineType: 线条的类型,默认为cv2.LINE_8
  • shift: 指定坐标点小数位数,默认为0。

画圆:cv2.circle()

  • img: 输入的图像矩阵。
  • center: 圆心的坐标,格式为(x,y)。
  • radius: 圆的半径。
  • color: 圆的颜色,可以是RGB元组或灰度值。
  • thickness: 圆的边框宽度,默认为1。若设为-1,则表示绘制的是填充的圆。
  • lineType: 线条的类型,默认为cv2.LINE_8
  • shift: 指定坐标点小数位数,默认为0。

画直线:cv2.line()

  • img: 输入的图像矩阵。
  • pt1: 直线的起点坐标,格式为(x,y)。
  • pt2: 直线的终点坐标,格式为(x,y)。
  • color: 直线的颜色,可以是RGB元组或灰度值。
  • thickness: 线条的粗细,默认为1。若设为-1,则表示绘制的是填充的矩形。
  • lineType: 线条的类型,默认为cv2.LINE_8。可选的线条类型还包括cv2.LINE_4cv2.LINE_AA,后者为抗锯齿线型,使线条看起来更平滑。
  • shift: 指定坐标点小数位数,默认为0。

画椭圆:cv2.ellipse()

  • img: 输入的图像矩阵。
  • center: 椭圆中心的坐标,格式为(x,y)。
  • axes: 椭圆横轴和纵轴的一半长度,格式为(major_axis_radius, minor_axis_radius)。
  • angle: 椭圆旋转的角度,以度为单位。
  • startAngle: 椭圆弧绘制的起始角度,以度为单位。
  • endAngle: 椭圆弧绘制的结束角度,以度为单位。若startAngle和endAngle为0和360,则绘制整个椭圆。
  • color: 椭圆的颜色,可以是RGB元组或灰度值。
  • thickness: 椭圆边框的宽度,默认为1。若设为-1,则表示绘制的是填充的椭圆。
  • lineType: 线条的类型,默认为cv2.LINE_8
  • shift: 指定坐标点小数位数,默认为0。

画多边形:cv2.polylines()

  • img: 要绘制多边形的图像。
  • pts: 多边形的顶点坐标,类型为numpy.ndarray,其形状应为(n,1,2),其中n为多边形的边数,2表示每个点有x和y两个坐标。
  • isClosed: 表示多边形是否封闭,如果为True,则表示多边形是封闭的,会从最后一个点连线到第一个点。
  • color: 多边形的颜色,为(B,G,R)格式的元组或一个标量。
  • thickness: 线条的粗细,默认值为1。
  • lineType: 线条的类型,默认值为cv2.LINE_8
  • shift: 坐标点小数位数的位数,默认为0。

画文本:cv2.putText()

  • img: 要在其上绘制文本的图像。该图像应该是一个numpy数组,通常是通过cv2.imread()函数读取的。
  • text: 要绘制的文本字符串。这是你想要在图像上显示的实际文本内容。
  • org: 文本字符串左下角的坐标,格式为(x, y)。这是文本在图像上的起始位置。
  • fontFace: 字体类型。OpenCV提供了一些内置的字体类型,如cv2.FONT_HERSHEY_SIMPLEXcv2.FONT_HERSHEY_PLAIN等。你可以使用这些字体类型之一,但请注意OpenCV默认不支持中文字符的显示,因此如果需要显示中文,可能需要额外设置或使用Pillow等库。
  • fontScale: 字体缩放比例。这个参数控制字体的大小,它是一个浮点数,表示字体大小与字体特定基本大小的倍数。
  • color: 文本的颜色。颜色参数是一个BGR元组,即(B, G, R)格式,每个颜色分量的取值范围是0到255。
  • thickness: 字体线条的粗细程度。这是一个整数,表示线条的宽度。如果设置为负数(如cv2.FILLED),则表示使用填充模式绘制文本。
  • lineType: 线条类型。这个参数控制线条的绘制方式,但在cv2.putText()函数中通常不直接使用,因为它默认为cv2.LINE_8。对于文本绘制,这个参数的影响可能不如在其他绘图函数中那么明显。
  • bottomLeftOrigin: 如果为True,则文本起始点为左下角;如果为False(默认值),则文本起始点为左上角。这个参数用于控制文本绘制的基准点。
import cv2  
  
# 读取图像  
img = cv2.imread('image.jpg')  
  
# 设置文本参数  
text = 'Hello, OpenCV!'  
org = (50, 50)  
fontFace = cv2.FONT_HERSHEY_SIMPLEX  
fontScale = 1  
color = (255, 0, 0)  # 蓝色  
thickness = 2  
  
# 在图像上添加文本  
cv2.putText(img, text, org, fontFace, fontScale, color, thickness)  
  
# 显示图像  
cv2.imshow('Image with Text', img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

具体可参考这篇文章:@弹了个球

python opencv 常用图形绘制方法(线段、矩形、圆形、椭圆、文本)_plt绘制矩形与线段-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/fujian87232/article/details/115556078

 三、图像添加边框

dst = cv2.copyMakeBorder(src, top, bottom, left, right, borderType, [, value])
  1. src:
    • 类型: 输入图像(numpy数组)。
    • 描述: 需要添加边框的原始图像。
  2. top, bottom, left, right:
    • 类型: 整数。
    • 描述: 分别指定图像上、下、左、右四个方向需要添加的边框宽度(以像素为单位)。
  3. borderType:
    • 类型: 整数,OpenCV中定义的边框类型常量。
    • 描述: 指定要添加的边框类型。常见的边框类型包括:
      • cv2.BORDER_CONSTANT: 添加常数值边框。此时需要指定value参数来确定边框的颜色。
      • cv2.BORDER_REPLICATE: 复制图像边界的像素值。
      • cv2.BORDER_REFLECT: 镜像反射,边框会反射图像的边缘。
      • cv2.BORDER_REFLECT_101 或 cv2.BORDER_DEFAULT: 类似于cv2.BORDER_REFLECT,但最外层像素值不会被重复。
      • cv2.BORDER_WRAP: 环绕边框,类似于将图像水平或垂直方向上的像素值进行循环。
  4. value (可选):
    • 类型: 当borderTypecv2.BORDER_CONSTANT时,value是一个BGR颜色值(对于彩色图像)或一个灰度值(对于灰度图像),用于填充边框。
    • 描述: 边框的颜色或灰度值。如果borderType不是cv2.BORDER_CONSTANT,则不需要此参数。

示例: 

cb_image = cv2.copyMakeBorder(image_cut1, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=(0, 0, 255))

结果如下:

 四、图像查找轮廓

contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
  • image: 输入图像,必须是二值图像(通常使用 cv2.threshold() 或 cv2.Canny() 进行二值化处理)。注意,cv2.findContours() 会修改输入图像(在 OpenCV 3.x 中返回修改后的图像,但在 4.x 中不返回)。

  • mode: 轮廓检索模式,指定了轮廓的检索方式。常用的模式包括:

    • cv2.RETR_EXTERNAL:只检测外部轮廓。
    • cv2.RETR_LIST:检测所有轮廓,并将它们放入列表中,但不创建轮廓间的层级关系。
    • cv2.RETR_CCOMP:检测所有轮廓并将它们组织成两级层次结构:顶层是外部边界,二级是空洞的边界。
    • cv2.RETR_TREE:检测所有轮廓并重构嵌套轮廓的完整层级。
  • method: 轮廓近似方法,指定了轮廓的表示方式。常用的方法包括:

    • cv2.CHAIN_APPROX_NONE:存储所有轮廓点,相邻两个点的像素位置差不超过1。
    • cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角方向的元素,只保留端点,这样可以节省内存。
    • cv2.CHAIN_APPROX_TC89_L1 和 cv2.CHAIN_APPROX_TC89_KCOS:应用 Teh-Chin 链逼近算法。
  • contours(可选输出参数): 轮廓的点集列表。每个轮廓本身又是一个点集(NumPy数组),表示轮廓上点的坐标。

  • hierarchy(可选输出参数): 轮廓的层级结构信息,是一个 NumPy 数组。对于每个轮廓,hierarchy 包含四个元素:[next, previous, first_child, parent],分别表示轮廓中的下一个轮廓、上一个轮廓、第一个子轮廓和父轮廓的索引。如果某个元素不存在,则对应位置为负值。

  • offset(可选参数): 每个轮廓点移动的可选偏移量。通常设置为默认值 Point()

示例:

import cv2
import numpy as np


# 绘图展示
def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


image = cv2.imread('img\\1.png')
image_copy_cut = image[0:500, 0:500]
cv_show("image_copy_cut", image_copy_cut)
gray_img = cv2.cvtColor(image_copy_cut, cv2.COLOR_BGR2GRAY)
cv_show("gray_img", gray_img)
_, binary_image = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)
cv_show("binary_image", binary_image)
# 查找轮廓
contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 在原图上绘制轮廓
cv2.drawContours(image_copy_cut, contours, -1, (0, 255, 0), 2)
cv_show("image_copy_cut", image_copy_cut)

结果如下:

 链接跳转:

章节一、OpenCV||超细节的基本操作

章节二、OpenCV||超简略的Numpy小tip

章节四、OpenCV||超详细的灰度变换和直方图修正

章节五、OpenCV||超详细的图像平滑

章节二、OpenCV||超简略的Numpy小tip

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

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

相关文章

实现元素定位:掌握Selenium八大定位方法

文章目录 0. 八大定位方法1. id2. name3. xpath4. css_selector 0. 八大定位方法 当实现测试自动化,编写测试用例时,首先需要在web界面找到对应元素位置,而Selenium提供了一套对应的API,被封装在WebDriver类中。如下图&#xff0…

JAVA字符串刷题(力扣经典算法及题解)

练习一: 输入字符串aba,依次输出各个字符 import java.util.Scanner;public class StringTomrs {public static void main(String[] args) {Scanner scnew Scanner(System.in);String numbersc.next();System.out.println("输入的字符串是"number);for(i…

使用FastChat快速部署LLM服务

原文:https://zhuanlan.zhihu.com/p/705915093 FastChat 是一个用于训练、服务和评估基于LLM的聊天机器人的开放平台,它的核心功能包括: 最先进模型(例如 Vicuna、MT-Bench)的训练和评估代码。具有 Web UI 和与 Open…

<Rust>使用rust实现crc16_modbus校验码生成?

前言 本文是使用rust代码来实现crc16 modbus校验码的输出。 概述 crc16 modbus算法简介: 代码实现: crc16 modbus是crc校验码的其中一种计算方式,通常用于modbus类通讯的数据校验上。 其计算步骤如上面的图片所示,通常此校验算法用在工控行业比较多,如一些支持串口通讯…

Linux驱动----总线

总线相关 总线注册和注销总线device对象----描述设备信息,包括地址,中断号和其他的一些自定义数据注册和注销device对象----指将device注册到mybus总线 driver对象----描述设备驱动的方法(操作地址和中断)注册和注销driver对象---…

38 器件移动、旋转、镜像、对齐、等间距操作介绍39 器件、网络、过孔锁定与解锁操作40 相同模块复用操作41 测量、查询功能介绍

38 器件移动、旋转、镜像、对齐、等间距操作介绍&&39 器件、网络、过孔锁定与解锁操作&&40 相同模块复用操作&& 41 测量、查询功能介绍 第一部分 38 器件移动、旋转、镜像、对齐、等间距操作介绍第二部分 39 器件、网络、过孔锁定与解锁操作第三部分 4…

明确工作目标学习稿:计算技术体系的发展方向

学习2022年《孙凝晖:建立高水平自立自强的计算技术新体系》 计算所新时期的目标就是要建立高水平自立自强的计算技术新体系,其中,针对处理器提出“C体系”、针对信息基础设施提出“信息高铁”体系。 计算技术体系的新结构 包含C体系、信息高…

自建数据库VS云数据库

自建数据库VS云数据库 什么是自建数据库?自建数据库方案自建数据库的优点自建数据库的缺点什么是云数据库?自建数据库的缺点什么是云数据库? 云数据库方案云数据库的优点云数据库的缺点适用场景比较总结 【纪录片】中国数据库前世今生 在数字…

日志采集格式指定实验

目录 一. 进入配置文件,有两种方式指定采集格式 (1)日志默认格式指定 (2)指定用liu的格式采集某一个日志 二.重启服务 三.测试 #WESTOS_FORMAT: 格式名称 #%FROMHOST-IP%: 日志来源主…

合作开发中的Simulink算法保护

项目越来越大,分工越来越细,合作开发已经成为常态。在几家公司或者几个团队合作开发同一个项目的时候,经常会出现互相之间技术上要做一些保密工作,一方做的模型或代码不能给另一方看到,但又要求可以让对方能够运行自己…

File类的用法

目录 File的常见方法 普通文件的创建 普通文件的删除 deleteOnExit 目录的创建 mkdir mkdirs 文件的重命名和剪切 剪切 重命名 InputStream read() OutputStream write() Reader Writer write(String str) 代码练习 扫描指定⽬录,并找到名称中包含…

git clone private repo

Create personal access token Clone repo $ git clone https://<user_name>:<personal_access_tokens>github.com/<user_name>/<repo_name>.git

【DOCKER】VNC可视化UBUNTU容器

1. 启动测试容器 # 启动容器 # -e USERu20 vncserver所需环境变量 # -p 15901:5901 vncserver所需端口 docker run -id --privilegedtrue --restart always --useru20 --workdir/home/u20 -p 15901:5901 -e USERu20 --name ui u20:dev# 进入容器 docker exec -it ui /bin/ba…

jupyter支持跨机器远程访问

1. 远程访问场景 本地往往缺少GPU设备&#xff0c;为了让我们的代码能在有GPU设备的机器上运行&#xff0c;就需要在远程机器上启动jupyter notebook, 这意味着我们要在本地机器的浏览器上访问远程机器上的jupyter notebook。但是直接按ip访问会报如下错误&#xff1a; 因为ju…

MATLAB优化模型(3)

一、前言 在MATLAB中处理各种优化问题&#xff0c;如背包问题、指派问题&#xff08;也称为分配问题&#xff09;、抽屉原理应用、旅行商问题&#xff08;TSP&#xff09;以及排队论模型&#xff0c;通常需要结合MATLAB的优化工具箱&#xff08;如Optimization Toolbox&#xf…

C++ | 动态内存管理 new、delete (用法、底层)详解

目录 简单回顾C语言动态内存管理 new、delete的用法 内置类型 new delete 自定义类型 new、delete底层讲解&#xff08;重要&#xff09; operator new 与 operator delete 定位 new 结语 简单回顾C语言动态内存管理 在C语言的学习阶段 我们接触到了三个能在堆上开辟…

vulhub靶场之wordpress关卡(保姆级教程)

一.打开wordpress关卡 1.选择简体中文 然后添加信息 点击安装wordpress 1.2 登陆后台 1.3 在后台修改模板 1.4 找一个php文件&#xff0c;在最开头加入一句话木马 点击更新 然后访问默认模板路径 下面的是默认的模板路径 /wp-content/themes/twentyfifteen/404.php 然后…

JAVA基础 - 数据库编程

目录 一. 简介 二. 数据持久化 三. 安装MySQL 四. JDBC API 五. 三个重要接口 一. 简介 数据库编程是指使用编程语言与数据库进行交互&#xff0c;以实现数据的存储、检索、更新、删除等操作。 在数据库编程中&#xff0c;常见的任务包括&#xff1a; 连接数据库&#x…

Spring统一返回类型中关于String的问题

文章目录 1. 问题铺垫2. 解决方法3. 问题分析4 解决方法解释 1. 问题铺垫 首先设置了以下代码统一处理返回类型 ControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice {Overridepublic boolean supports(MethodParameter returnType, Class converte…

GuLi商城-新增商品-获取分类下所有分组以及属性

/*** 根据分类id查询出所有的分组以及这些组里面的属性* @param catelogId* @return*/ @Override public List<AttrGroupWithAttrsVo> getAttrGroupWithAttrsByCatelogId(Long catelogId) {//1、查询分组信息List<AttrGroupEntity> attrGroupEntities = this.list(…