当前位置: 首页 > news >正文

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

一、颜色变换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

相关文章:

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

一、颜色变换cvtColor dst cv2.cvtColor(src, code[, dstCn[, dst]]) src: 输入图像,即要进行颜色空间转换的原始图像。code: 转换代码,指定要执行的颜色空间转换类型。这是一个必需的参数,决定了源颜色空间到目标颜色空间的转换方式。dst…...

java面向对象期末总结

子类父类方法执行顺序?多态中和子类打印不一样; 子类在实现父类方法的时候没有用super关键字进行调用也会先执行父类的构造方法吗? 是的,当子类实例化时,先执行父类的构造方法,再执行子类的构造方法。即使在…...

文件搜索 36

删除文件 文件搜索 package File;import java.io.File;public class file3 {public static void main(String[] args) {search(new File("D :/"), "qq");}/*** 去目录搜索文件* param dir 目录* param filename 要搜索的文件名称*/public static void sear…...

IO多路转接

文章目录 五种IO模型fcntl多路转接selectpollepollepoll的工作模式 五种IO模型 阻塞IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方式.阻塞IO是最常见的IO模型。非阻塞IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULD…...

基于深度学习的面部表情分类识别系统

:温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 面部表情识别是计算机视觉领域的一个重要研究方向, 它在人机交互、心理健康评估、安全监控等领域具有广泛的应用。近年来,随着深度学习技术的快速发展&#xf…...

日志远程同步实验

目录 一.实验环境 二.实验配置 1.node1发送方配置 (1)node1写udp协议 (2)重启服务并清空日志 2.node2接收方配置 (1)node2打开接受日志的插件,指定插件用的端口 (2&#xff…...

数据结构之《二叉树》(中)

在数据结构之《二叉树》(上)中学习了树的相关概念,还了解的树中的二叉树的顺序结构和链式结构,在本篇中我们将重点学习二叉树中的堆的相关概念与性质,同时试着实现堆中的相关方法,一起加油吧! 1.实现顺序结构二叉树 在…...

php json_encode 参数 JSON_PRETTY_PRINT

https://andi.cn/page/621642.html...

【UE 网络】Gameplay框架在DS架构中的扮演的角色

目录 0 引言1 核心内容1.1 Gameplay各部分创建的流程1.2 Gameplay框架在DS和客户端的存在情况1.3 数据是独立存在于DS和客户端的 2 Gameplay框架各自负责的功能2.1 GameMode2.2 GameState2.3 PlayerController2.4 PlayerState2.5 Pawn2.6 AIController2.7 Actor2.8 HUD2.9 UI &…...

【云原生】StatefulSet控制器详解

StatefulSet 文章目录 StatefulSet一、介绍与特点1.1、介绍1.2、特点1.3、组成部分1.4、为什么需要无头服务1.5、为什么需要volumeClaimTemplate 二、教程2.1、创建StatefulSet2.2、查看部署资源 三、StatefulSet中的Pod3.1、检查Pod的顺序索引3.2、使用稳定的网络身份标识3.3、…...

使用 Python 制作一个属于自己的 AI 搜索引擎

1. 使用到技术 OpenAI KEYSerper KEYBing Search 2. 原理解析 使用Google和Bing的搜搜结果交由OpenAI处理并给出回答。 3. 代码实现 import requests from lxml import etree import os from openai import OpenAI# 从环境变量中加载 API 密钥 os.environ["OPENAI_AP…...

rust读取csv文件,匹配搜索字符

1.代码 use std::fs::File; use std::io::{BufRead, BufReader}; use regex::{Regex};fn main() {let f File::open("F:\\0-X-RUST\\1-systematic\\ch2-fileRead\\data\\test.csv").unwrap();let mut reader BufReader::new(f);let re Regex::new("45asd&qu…...

隐藏采购订单类型

文章目录 1 Introduction2 code 1 Introduction The passage is that how to hiden purchase type . 2 code DATA: ls_shlp_selopt TYPE ddshselopt. IF ( sy-tcode ME21N OR sy-tcode ME22N OR sy-tcode ME23N or sy-tcode ME51N OR sy-tcode ME52N OR sy-tcode ME5…...

ESP32人脸识别开发- 基础介绍(一)

一、ESP32人脸识别的方案介绍 目前ESP32和ESP32S3都是支持的,官方推的开发板有两种,一种 ESP-EYE ,没有LCD 另一种是ESP32S3-EYE,有带LCD屏 二、ESP32人脸识别选用ESP32的优势 ESP32S3带AI 加速功能,在人脸识别的速度是比ESP32快了不少 | S…...

编程学习指南:语言选择、资源推荐与高效学习策略

目录 一、编程语言选择 1. Java:广泛应用的基石 2. C/C:深入底层的钥匙 3. Python:AI与大数据的宠儿 4. Web前端技术:构建交互界面的艺术 二、学习资源推荐 1. 国内外在线课程平台 2. 官方文档与教程 3. 书籍与电子书 4…...

AWS开发人工智能:如何基于云进行开发人工智能AI

随着人工智能技术的飞速发展,企业对高效、易用的AI服务需求日益增长。Amazon Bedrock是AWS推出的一项创新服务,旨在为企业提供一个简单、安全的平台,以访问和集成先进的基础模型。本文中九河云将详细介绍Amazon Bedrock的功能特点以及其收费方…...

CentOS 8 的 YUM 源替换为国内的镜像源

CentOS 8 的 YUM 源替换为国内的镜像源 1.修改 DNS 为 114.114.114.1141.编辑 /etc/resolv.conf 文件:2.在文件中添加或修改如下内容:3.保存并退出编辑器。 2.修改 YUM 源为国内镜像1.备份原有的 YUM 源配置:2.下载新的 YUM 源配置3.清理缓存…...

网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程

前言 1.入行网络安全这是一条坚持的道路,三分钟的热情可以放弃往下看了。2.多练多想,不要离开了教程什么都不会了,最好看完教程自己独立完成技术方面的开发。3.有时多百度,我们往往都遇不到好心的大神,谁会无聊天天给…...

浅学爬虫-爬虫维护与优化

在实际项目中,爬虫的稳定性和效率至关重要。通过错误处理与重试机制、定时任务以及性能优化,可以确保爬虫的高效稳定运行。下面我们详细介绍这些方面的技巧和方法。 错误处理与重试机制 在爬虫运行过程中,网络不稳定、目标网站变化等因素可…...

STM32G070系列芯片擦除、写入Flash错误解决

在用G070KBT6芯片调用HAL_FLASHEx_Erase(&EraseInitStruct, &PageError)时,调试发现该函数返回HAL_ERROR,最后定位到FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE)函数出现错误,pFlash.ErrorCode为0xA0,即FLASH错误标…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...