Python-OpenCV教程丨从零开始学计算机视觉

文章目录

  • 写在前面
  • 入门篇
    • 1.生成图片
    • 2.转换色彩空间
    • 3.拆分颜色通道
    • 4.绘制线条
    • 5.阈值自适应处理
  • 写在后面

写在前面

探索新大陆:Python&OpenCV,本文主要记录入门计算机视觉的一些简单程序。

入门篇

安装opencv库:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python

1.生成图片

"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import cv2
import numpy as np
width = 200
height = 100
img = np.ones((height, width), np.uint8) * 255
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

这段代码使用OpenCV库创建了一个宽度为200,高度为100的空白图像,并将图像中所有像素点的值设为255(白色)。然后展示了该图像。

具体的执行过程如下:

  1. 导入cv2和numpy库。
    import cv2
    import numpy as np

  2. 定义图像的宽度和高度。在这里,宽度为200,高度为100。
    width = 200
    height = 100

  3. 使用numpy库的ones函数创建一个指定大小的全为1的数组,并将数组中的元素类型转换为8位无符号整数。
    img = np.ones((height, width), np.uint8) * 255

    • 参数(height, width)指定数组的维度,即图像的高度和宽度。
    • 参数np.uint8表示数组中元素的数据类型为8位无符号整数。
    • * 255 表示将所有元素的值乘以255,即将所有像素点的值设为255。
  4. 使用cv2.imshow函数显示创建的图像。该函数的参数为展示图像的窗口名称和图像数据。
    cv2.imshow("img", img)

  5. 等待按下任意键后关闭窗口。使用cv2.waitKey函数,该函数返回按键的ASCII码。当按下任意键后,cv2.waitKey函数将返回一个非负数,通过与0xFF进行按位与操作,将返回值转换为一个8位整数。
    cv2.waitKey()

  6. 关闭所有窗口。使用cv2.destroyAllWindows函数,该函数用于销毁已创建的所有窗口。
    cv2.destroyAllWindows()

这段代码的作用是创建一个指定大小的空白图像,并将图像中所有像素点的值设为255,即将图像填充为白色。然后展示该图像,以便可以看到所创建图像的效果。

2.转换色彩空间

1

"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import cv2
image = cv2.imread("Pikachu.jpg")
cv2.imshow("RGB", image)
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow("HSV", hsv_image)
cv2.waitKey()
cv2.destroyAllWindows()

这段代码使用OpenCV库读取了一张名为"Pikachu.jpg"的彩色图片,并展示了该图片的原始版本以及转换为HSV颜色空间的版本。

具体的执行过程如下:

  1. 使用cv2.imread函数读取图片。该函数的参数是要读取的图片路径。读取的图片会被存储为一个numpy数组。
    image = cv2.imread("Pikachu.jpg")

  2. 使用cv2.imshow函数显示图片的原始版本。该函数的参数为展示图片的窗口名称和图像数据。
    cv2.imshow("RGB", image)

  3. 使用cv2.cvtColor函数将图片转换为HSV颜色空间。该函数的参数为要转换的图像数据和转换的颜色空间标识。在这里,使用cv2.COLOR_BGR2HSV将图片从BGR颜色空间转换为HSV颜色空间。
    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

  4. 使用cv2.imshow函数显示转换后的图片。该函数的参数为展示图片的窗口名称和图像数据。
    cv2.imshow("HSV", hsv_image)

  5. 等待按下任意键后关闭窗口。使用cv2.waitKey函数,该函数返回按键的ASCII码。当按下任意键后,cv2.waitKey函数将返回一个非负数,通过与0xFF进行按位与操作,将返回值转换为一个8位整数。
    cv2.waitKey()

  6. 关闭所有窗口。使用cv2.destroyAllWindows函数,该函数用于销毁已创建的所有窗口。
    cv2.destroyAllWindows()

这段代码的作用是展示一张彩色图片的原始版本以及转换为HSV颜色空间的版本,以便更好地理解图片的颜色信息。

3.拆分颜色通道

"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import cv2
image = cv2.imread("Pikachu.jpg")
cv2.imshow("img", image)
b,g,r = cv2.split(image)
cv2.imshow("b", b)
cv2.imshow("g", g)
cv2.imshow("r",r)
cv2.waitKey()
cv2.destroyAllWindows()

这段代码使用OpenCV库读取了一张名为"Pikachu.jpg"的图片,并展示了该图片的原始版本以及分离出的蓝色通道、绿色通道和红色通道。

具体的执行过程如下:

  1. 使用cv2.imread函数读取图片。该函数的参数是要读取的图片路径。读取的图片会被存储为一个numpy数组。
    image = cv2.imread("Pikachu.jpg")

  2. 使用cv2.imshow函数显示原始图片。该函数的参数为展示图片的窗口名称和图像数据。
    cv2.imshow("img", image)

  3. 使用cv2.split函数分离出图片的蓝色通道、绿色通道和红色通道。该函数的参数为要分离的图像数据。
    b,g,r = cv2.split(image)

  4. 使用cv2.imshow函数分别显示蓝色通道、绿色通道和红色通道的图像。
    cv2.imshow("b", b)
    cv2.imshow("g", g)
    cv2.imshow("r",r)

  5. 等待按下任意键后关闭窗口。使用cv2.waitKey函数,该函数返回按键的ASCII码。当按下任意键后,cv2.waitKey函数将返回一个非负数,通过与0xFF进行按位与操作,将返回值转换为一个8位整数。
    cv2.waitKey()

  6. 关闭所有窗口。使用cv2.destroyAllWindows函数,该函数用于销毁已创建的所有窗口。
    cv2.destroyAllWindows()

这段代码的作用是将一张彩色图片分离成RGB三个通道的图片,并分别展示出来。

4.绘制线条

"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import numpy as np
import cv2canvas = np.zeros((300, 300, 3), np.uint8)
cv2.line(canvas, (50, 50), (250, 50), (255, 0, 0), 5)
cv2.line(canvas, (50, 150), (250, 150), (0, 255, 0), 10)
cv2.line(canvas, (50, 250), (250, 250), (0, 0, 255), 15)
cv2.line(canvas, (150, 50), (150, 250), (0, 255, 255), 20)
cv2.imshow("Lines", canvas)
cv2.waitKey()
cv2.destroyAllWindows()

这段代码使用OpenCV库绘制了一张300x300像素的画布,并在画布上绘制了四条直线。具体的绘制过程如下:

  1. 创建了一个300x300x3的空白画布,像素值都为0。其中300x300表示画布的宽高,3表示每个像素点的通道数(RGB)。
    canvas = np.zeros((300, 300, 3), np.uint8)

  2. 使用cv2.line函数绘制直线。该函数的参数依次为:画布,起点坐标,终点坐标,颜色,线条粗细。

    • 绘制一条从(50, 50)到(250, 50)的红色直线,线条粗细为5。
    • 绘制一条从(50, 150)到(250, 150)的绿色直线,线条粗细为10。
    • 绘制一条从(50, 250)到(250, 250)的蓝色直线,线条粗细为15。
    • 绘制一条从(150, 50)到(150, 250)的青色直线,线条粗细为20。
      cv2.line(canvas, (50, 50), (250, 50), (255, 0, 0), 5)
      cv2.line(canvas, (50, 150), (250, 150), (0, 255, 0), 10)
      cv2.line(canvas, (50, 250), (250, 250), (0, 0, 255), 15)
      cv2.line(canvas, (150, 50), (150, 250), (0, 255, 255), 20)
  3. 显示绘制好的画布。使用cv2.imshow函数显示图像。参数为窗口名称和图像数据。
    cv2.imshow("Lines", canvas)

  4. 等待按下任意键后关闭窗口。使用cv2.waitKey函数,该函数返回按键的ASCII码。当按下任意键后,cv2.waitKey函数将返回一个非负数,通过与0xFF进行按位与操作,将返回值转换为一个8位整数。
    cv2.waitKey()

  5. 关闭所有窗口。使用cv2.destroyAllWindows函数,该函数用于销毁已创建的所有窗口。
    cv2.destroyAllWindows()

5.阈值自适应处理

"""
作者:Want595
微信号:Want_595
公众号:Want595
"""
import cv2image = cv2.imread("Pikachu.jpg")
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
t1, dst1 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY)
t2, dst2 = cv2.threshold(image_Gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.putText(dst2, "best threshold:" + str(t2), (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 2)
cv2.imshow("BINARY", dst1)
cv2.imshow("OTSU", dst2)
cv2.waitKey()
cv2.destroyAllWindows()

这段代码使用OpenCV库加载一张名为"Pikachu.jpg"的图像,并进行灰度化处理。然后使用两种不同的阈值方法对灰度图像进行二值化处理,分别为全局固定阈值和Otsu自适应阈值。

具体的执行过程如下:

  1. 导入cv2库。
    import cv2

  2. 使用cv2.imread函数加载一张名为"Pikachu.jpg"的图像,并将图像数据存储在image变量中。
    image = cv2.imread("Pikachu.jpg")

  3. 使用cv2.cvtColor函数将图像从BGR颜色空间转换为灰度图像。
    image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

  4. 使用cv2.threshold函数进行全局固定阈值的二值化处理。该函数的参数包括待处理的灰度图像、设定的阈值、结果图像的最大像素值、阈值类型等。
    t1, dst1 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY)

    • 参数image_Gray为待处理的灰度图像。
    • 参数127为设定的阈值,小于等于该阈值的像素值被设为0,大于该阈值的像素值被设为最大像素值。
    • 参数255为结果图像的最大像素值。
    • 参数cv2.THRESH_BINARY表示使用固定阈值法进行二值化处理。

    函数的返回值t1为实际选取的阈值,dst1为处理后的二值图像。

  5. 使用cv2.threshold函数进行Otsu自适应阈值的二值化处理。与步骤4相似,只是阈值类型为cv2.THRESH_BINARY + cv2.THRESH_OTSU
    t2, dst2 = cv2.threshold(image_Gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

    • 参数0表示使用Otsu算法计算的阈值。
    • 参数cv2.THRESH_BINARY + cv2.THRESH_OTSU表示使用Otsu自适应阈值法进行二值化处理。

    函数的返回值t2为实际选取的阈值,dst2为处理后的二值图像。

  6. 使用cv2.putText函数在dst2图像上打印出实际选取的阈值。该函数的参数包括待处理的图像、要绘制的文本内容、文本的起始位置、字体、字体大小、字体颜色、文本的线宽等。
    cv2.putText(dst2, "best threshold:" + str(t2), (0, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 2)

    • 参数"best threshold:" + str(t2)为要绘制的文本内容。
    • 参数(0, 30)为文本的起始位置。
    • 参数cv2.FONT_HERSHEY_SIMPLEX为字体类型。
    • 参数1为字体大小。
    • 参数(0,0,0)为字体颜色,即黑色。
    • 参数2为文本的线宽。
  7. 使用cv2.imshow函数显示处理后的二值图像。参数为展示图像的窗口名称和图像数据。
    cv2.imshow("BINARY", dst1)
    cv2.imshow("OTSU", dst2)

  8. 使用cv2.waitKey函数等待按键操作,直到按下任意键后关闭窗口。
    cv2.waitKey()

  9. 关闭所有窗口。使用cv2.destroyAllWindows函数销毁所有已创建的窗口。
    cv2.destroyAllWindows()

该代码的作用是对灰度图像进行阈值分割,分别使用全局固定阈值和Otsu自适应阈值方法进行二值化处理,并展示处理后的结果图像。在Otsu自适应阈值处理后,还在结果图像上添加了实际选取的阈值的文本信息。

写在后面

我是一只有趣的兔子,感谢你的喜欢!

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

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

相关文章

48 分布式id的生成策略

1.UUID 1.UUID (Universally Unique Identifier),通用唯一识别码。UUID是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的。UUID由以下几部分的组合: 1.当前日期和时…

RabbitMQ脑裂处理

脑裂现象: Network partition detected Mnesia reports that this RabbitMQ cluster has experienced a network partition. There is a risk of losing data. Please read RabbitMQ documentation about network partitions and the possible solutions. 转载请在文…

zotero使用gpt

zotero使用gpt 下载 zotero下载:https://www.zotero.org/download/ 插件下载:https://github.com/MuiseDestiny/zotero-gpt?tabreadme-ov-file 插件安装 zotero中选择 工具->添加组件 选择右上角的齿轮,选择Install add-on from fil…

NeRF算法原理总结概述

简介 本文旨在对NeRF算法进行总结。论文翻译见博客:《NeRF算法论文解析与翻译》 参考链接: 神经网络辐射场NeRF、实时NeRF Baking、有向距离场SDF、占用网络Occupancy、NeRF 自动驾驶 NeRF详解 NeRF入门之体渲染 (Volume Rendering) NeRF中的位置编码 …

C++力扣题目501--二叉搜索树中的众数

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 任意顺序 返回。 假定 BST 满足如下定义&#xf…

项目中Ant Design Pro业务问题解决方案

ProTable实现多选反显筛选项多级关联选择 import {forwardRef,useImperativeHandle,useEffect,useRef,useReducer, } from "react"; import { Drawer, Space, Button, message } from "antd"; import * as PC from "ant-design/pro-components";…

PHP项目添加分布式锁,这里是ThinkPHP8框架实现分布式锁

背景:公司旧项目,最初访问量不多,单机部署的。后来,访问量上来了,有阵子很卡,公司决定横向扩展,后端代码部署了三台服务器。部署调整后,有用户反馈,一个订单支付了三次。…

网络原理--http

目录 一、 DNS(应用层协议) 1、域名概念 2、维护ip地址和域名之间的映射(域名解析系统) 3、DNS系统(服务器) 4、如何解决DNS服务器高并发问题 二、HTTP(应用层协议) 1、htt…

win10安装ssh服务

前置条件: 远程虚拟机,防火墙关闭,本地主机与虚拟机互相可以ping通 虚拟机是win10专业版本 操作步骤: 1、搜索框搜索“Windows PowerShell”并以管理员身份运行 2、输入如下代码,检查本地是否有ssh服务&#xff0c…

【Docker】网络模式➕自定义网络

🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 一.Docker网络模式的介绍 二. 网桥模…

Linux内核架构和工作原理详解(二)

Linux内核体系结构简析简析 图1 Linux系统层次结构 最上面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下是内核空间,Linux 内核正是位于这里。GNU C Library (glibc)也在这里。它提供了连接内核…

【JVM】类的生命周期

目录 类的生命周期 加载阶段 连接阶段 初始化阶段 类的使用阶段 类的加载阶段 类的生命周期 加载阶段 在加载阶段,类加载器首先会通过一个类的全限定名来获取定义此类的二进制字节流。这个步骤主要是将整个Class 文件解析成二进制流。 (全限定名是…

海外代理IP怎么用?常见使用问题及解决方案

海外代理IP是指提供全球范围内的代理服务器,代理服务器充当IP与目标网站之间的中介,可以起到安全匿名、提高网速、突破网络壁垒的作用。在使用代理IP的过程中,用户可能会遇到各种挑战,如连接问题、速度慢等。理解这些问题的原因并…

HCIP第一次练习 -- RIP复习实验

要求: 需求:R1-R2-R3-R4-R5运行RIPV2 R6-R7运行RIPV1 1.使用合理地址规划网络,各自创建环回接口 2.R1创建环回172.16.1.1/24172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条自数量,增加路由传递安全性 5.R5创建一个环回模拟运营商,不…

申泰勇教练的独家人物化身系列即将登陆 The Sandbox

申泰勇(Shin Tae-yong)教练是足球界的传奇人物,他来到 The Sandbox,推出了自己的专属人物化身系列。作为前 K 联赛中场球员和印尼队取得历史性成就的幕后教练,他的传奇经历现在已经影响到了虚拟世界。 向过去、现在和未…

基于ArcGIS的晕线制作

在借助ArcGIS进行制图时,我们有时需要为矢量边界添加晕线,今天就来探索一下基于ArcGIS的晕线制作操作。 软件版本:ArcMap10.4.1 方法一:制作多环缓冲区 工具路径:Analysis Tools-Proximity-Mutiple Ring Buffer 思…

前后端跨域问题

告别烦恼,彻底解决跨域问题的终极指南-chrome的安全进阶之路_chrom 强制跨域-CSDN博客

在linux安装LAStools

LAStools下载: https://github.com/LAStools/LAStools/releases 编译安装: # 设置安装路径 cmake -DCMAKE_INSTALL_PREFIX/home/vis/work/SourceCode/LAStools-2.0.2/build cmake . cmake --build . make install编译后的库:

【昕宝爸爸小模块】深入浅出之JDK21 中的虚拟线程到底是怎么回事(二)

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…

node版本过高与node-sass不兼容问题

第一步:安装yarn 安装cnpm 第二步:yarn install 这一步可能会出现node版本过高报错 yarn config set ignore-engines true 执行 自动补充兼容命令 然后重新yarn install 出现报错: 第三步:使用cnpm 单独安装 cnpm install node-…