opencv图片处理基础

news2024/9/24 23:26:17

文章目录

  • 计算机中图片构成红绿蓝
    • 边界填充
    • 色彩图片转二值图
    • 腐蚀操作
    • sobel算子
    • 滤波
    • 图像阈值函数
  • 边缘检测
  • 轮廓检测
    • 轮廓特征与轮廓近似
      • 轮廓特征
      • 轮廓近似

计算机中图片构成红绿蓝

图片由像素点构成,每个像素点有三个通道,分别是RGB,对应红绿蓝颜色,映射到计算机可以处理的数值是:每个通道取值0~255,0表示最暗、255最亮。通过调节每个通道占比,可以实现不同颜色的控制。
颜色对应RGB数值

但是需要注意的是cv中通道顺序是BGR,要与其他包的区分开

边界填充

    img = cv2.imread(img_address)
    top_,bottom_,left_,right_ = (50,50,50,50)
    # 其实就是一个函数,最后面选择的模式不一样
    # BORDER_REPLICATE:复制法,也就是复制最边缘像素。
    # ·BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制 fedcba | abcdefgh | hgfedcb
    # BORDER_REFLECT101,上一种方法的优化版,去掉了边界 cdefgh|abcdefgh|abcdefg
    # BORDER_WRAP: 外包装法cdefgh|abcdefgh|abcdefg
    # BORDER_CONSTANT:常量法,常数值填充
    replicate = cv2.copyMakeBorder(img,top_,bottom_,left_,right_,cv2.BORDER_REPLICATE)
    reflect = cv2.copyMakeBorder(img,top_,bottom_,left_,right_,cv2.BORDER_REFLECT)
    reflect101 = cv2.copyMakeBorder(img,top_,bottom_,left_,right_,cv2.BORDER_REFLECT101)
    wrap = cv2.copyMakeBorder(img,top_,bottom_,left_,right_,cv2.BORDER_WRAP)
    const = cv2.copyMakeBorder(img,top_,bottom_,left_,right_,cv2.BORDER_CONSTANT,value=0)
    cv2.imshow('1',replicate)

    cv2.imshow('2',reflect)

    cv2.imshow('3',reflect101)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

色彩图片转二值图

彩色图片转二值图步骤是 : 色彩 ——> 灰度 ——> 二值
彩色图片通常有多个通道,灰度、二值仅有一个。
灰度图像是单通道图像,该通道叫啥名不知道,而彩色图片的通道叫R、G、B,该通道内灰度图像取值为0到255,而二值图像是非0即255,很明显具有一层一层的关系,所以是这个步骤
另外一般是先将彩色图化为灰度,再二值,当然也可以直接彩色图二值,但是这样的跳跃会造成颜色信息的损失,所以最好按照这个步骤。
实现代码:
在这里插入图片描述
效果:
在这里插入图片描述

腐蚀操作

对于二值图像,取一个一定体积的卷积盒(n*n像素区域),把图像中每个区域框起来,如果框起来的里面即有黑又有白,则此区域被腐蚀,以此达到细化图片、文字,除去细小杂点
在这里插入图片描述
具体函数cv2.erode,参数: 读取后的图片(数组),卷积盒大小,迭代次数:腐蚀多少次
但是以我的了解腐蚀操作好像只能腐蚀黑底白字,如果是另一种颜色就会导致相反的结果,所以想到了二值反转
在这里插入图片描述
效果大概这样,又白底黑字转黑底白字
在这里插入图片描述

sobel算子

该算子功能是计算某点梯度,可以看到算子矩阵中元素有数值差距,其实就是用这种方法表示离取的这个点的距离,然后与像素矩阵做内积就得到一个标量,这个标量就作为这么一点的像素,所以图片又被处理了。

在这里插入图片描述
实际上我们想象矩阵是p1~p9,然后内积就是对应元素做乘积,所以就变成了右边像素-左边像素(如下图),但是不一定是正值,所以要绝对值处理,要不然变成负号就截断为0了
在这里插入图片描述
实操:
ksize:很明显这里的算子是3x3的
在这里插入图片描述

滤波

高斯
在这里插入图片描述
中值

图像阈值函数

可用于生成二值图片
在这里插入图片描述
在这里插入图片描述

边缘检测

这一次边缘检测把前面知识融合起来了,一套组合拳处理出一个很完美的边界
在这里插入图片描述

1)高斯滤波器:其实也就和sobel有点像,一个算子内积于像素矩阵,得到的值就是该点的滤波结果,可以很好消除噪音点
在这里插入图片描述
2)计算梯度这个可以用到sobel算子,方向计算只要x、y的梯度值得到,方向就直接反三角函数就行
在这里插入图片描述
在这里插入图片描述
3)非极大值抑制
由梯度计算出来的图像边缘很模糊(或者说比较混杂),在其边缘有很多梯度点,我们力求用一条清晰苗条的边缘线来画出这个边缘,我们引出一个方法叫非极大值抑制
4)双阈值检测
在这里插入图片描述
这个算法是先计算每一点的梯度,然后设置两个阈值,小于舍弃,大于保留且处理为边界,在之间如果有点(梯度不为0点,这时候已经经过前面很多步的处理,这时梯度不为0点不多)连接边界像素点,则保留视为边缘点

轮廓检测

边缘检测并不是轮廓检测,这个要区分开,边缘检测关注的是图像中亮度或颜色的变化,轮廓检测的关注的是物体的形状信息。

在这里插入图片描述

在这里插入图片描述
源码及解释:得到轮廓信息不要在灰度或二值图像上画出,因为不明显,可以copy一下在原img中显示
在这里插入图片描述

轮廓特征与轮廓近似

轮廓特征

轮廓特征是指用findcontours函数得到的返回值轮廓信息(contours)具有的一些特征,因为画出的轮廓不止一个,可以用取下标的方式访问每个轮廓,并进行操作
注意:要操作返回的轮廓信息,只能访问一个轮廓,不要一股脑把返回的轮廓信息全部传进去
特征1:轮廓面积值
特征2:轮廓周长
在这里插入图片描述

轮廓近似

轮廓近似(Contour Approximation)是指将连续曲线或轮廓抽象为一系列更简单的曲线或线段的过程,可用于轮廓提取
轮廓近似可以用在这里插入图片描述这个函数直接自动绘制适应的轮廓,也可以直接画自己想要的框。

在这里插入图片描述

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

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

相关文章

DFS深度优先搜索刷题(一)

一.P2089 烤鸡 算法思想: 指数型枚举,可以通过dfs深度优先搜索暴力枚举出所有可能的情况,在通过剪枝去除错误的方案来减少时间开销。主要用一个循环枚举每个调料放几克(每个位置的分支情况都相同),注意回溯…

分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测

分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测 目录 分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现PSO-KELM粒子群优化算法优化核极限学习机分类预测(完整源…

【c++初阶】C++入门(下)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿&#x1…

lvgl 窗口 windows lv_port_win_visual_studio 版本 已解决

不知道的东西,不知道lvgl窗口。一切从未知开始 lv_port_win_visual_studio 主分支 对应的分支 v7版本更新git submodule update --init --recursive同步 lvgl代码随后打开 visualSudio 打开.sln 文件 编译 release模式 允许 一切正常代码部分

iOS应用审核问题解决方案及优化方法 ✨

摘要 本文将针对iOS应用提交审核时可能遇到的问题,如“你必须在Xcode中添加com.apple.developer.game-center密钥”,以及突然间提交送审报错情况进行探讨。通过大量查询资料和尝试,结合案例分析,提供了解决方案和优化方法&#x…

Linux进程地址空间详解

文章目录 前言一、程序地址空间二、感受虚拟地址的存在三、进程地址空间四、程序从磁盘加载到内存的过程4.1 物理地址和虚拟地址的区别 五、写时拷贝5.1 解释fork()函数有两个返回值 前言 我们在学习C/C的时候用到的地址是什么地址呢?虚拟地址?物理地址&…

抗疫医疗用品销售平台|基于JSP技术+ Mysql+Java+ Tomcat的抗疫医疗用品销售平台设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,ssm,springboot的平台设计与实现项目系统开发资源(可…

mysql 如何设计分库分表

在MySQL中设计分库分表的方法通常涉及到水平拆分与垂直拆分两种主要方式。 水平拆分: 按照某一列进行水平拆分: 可以根据某一列(如用户ID、时间等)的取值范围将数据拆分到不同的数据库或表中。基于哈希值的水平拆分:…

贪吃蛇(C语言超详细版)

目录 前言: 总览: API: 控制台程序(Console): 设置坐标: COORD: GetStdHandle: STD_OUTPUT_HANDLE参数: SetConsoleCursorPosition: …

python--循环(作业)

作业一: 判断一个数是否为质数(素数) flag True prime int(input("请输入一个整数:")) for num in range(2, prime):if prime % num 0:flag Falsebreak if flag:print("它是质数") else:print("它…

2024年阿里云服务器地域和可用区所在地区城市分布表

阿里云服务器地域和可用区有哪些?阿里云服务器地域节点遍布全球29个地域、88个可用区,包括中国大陆、中国香港、日本、美国、新加坡、孟买、泰国、首尔、迪拜等地域,同一个地域下有多个可用区可以选择,阿里云服务器网aliyunfuwuqi…

RabbitMQ问题

如何实现顺序消费? 消息放入到同一个队列中消费 如何解决消息不丢失? 方案: 如上图:消息丢失有三种情况,解决了以上三种情况就解决了丢失的问题 1、丢失1--->消息在到达交换机的时候;解决&#xff1…

unity学习(68)——相机/模型的旋转/位置计算

这个比想象中要难,而且需要自己写。 1.相机可以转xy两个位置,可以点头和转圈。注意这里有一个if判断(后面返回来发现了这些问题) 2.角色不能点头,只能转圈。 难得是移动方向,因为移动方向(位置)和转向是相…

Spark与flink计算引擎工作原理

Spark是大批量分布式计算引擎框架,scale语言开发的,核心技术是弹性分布式数据集(RDD)可以快速在内存中对数据集进行多次迭代,支持复杂的数据挖掘算法及图形计算算法,spark与Hadoop区别主要是spark多个作业之…

Mac 搜索工具比对 ProEverything ProFind DFind 等

对比 Windows的everything用习惯了,其他的搜索追之不及啊。Mac上对比了一圈,简单总结一下。 比较项ProEverythingProFindDFindEasyFindScherlokk是否索引方式索引遍历遍历遍历待试用费用收费 推荐88元终身版收费收费免费待试用是否可全盘全盘无法查找影…

pytest简介以及命令行执行

pytest简介以及安装 pytest简介导入第三方库修改工具类 pytest命令方式执行函数执行pytest中的参数详解 pytest简介 pytest有很多强大的插件 pytest-html (生成html格式的自动化测试报告) pytest-xdist (测试用例分布式执行,多cpu…

利用MSF生成php,windows,Linux三类木马

一、什么是msfvenom? msfvenom是msf中的一个独立的负载生成器,它可以利用msf中的payloads和encoders来生成各种格式的木马文件,并在目标机上执行,配合meterpreter在本地监听上线。msfvenom是msfpayload和msfencode的结合体&#x…

基础:TCP四次挥手做了什么,为什么要挥手?

1. TCP 四次挥手在做些什么 1. 第一次挥手 : 1)挥手作用:主机1发送指令告诉主机2,我没有数据发送给你了。 2)数据处理:主机1(可以是客户端,也可以是服务端)&#xff0c…

SOPHON算能服务器SDK环境配置和相关库安装

目录 1 SDK大包下载 2 安装libsophon 2.1 安装依赖 1.2 安装libsophon 2 安装 sophon-mw 参考文献: 1 SDK大包下载 首先需要根据之前的博客,下载SDK大包:SOPHON算能科技新版SDK环境配置以及C demo使用过程_sophon sdk yolo-CSDN博客 …

Mysql之索引存储原理

在介绍索引实现之前,我们先来了解下几种树的数据结构: 一、二叉搜索树 二叉搜索树有以下性质: 1.每个节点有一个关键字 2.左右孩子至多有一个。 3.关键字大于左孩子,小于右孩子。 正因为二叉搜索树的特性,所以这种数…