opencv的图像基本操作_2

news2024/9/20 20:38:24

import cv2 #图像BGR

import numpy as np

import matplotlib.pyplot as plt #Matplotlib是RGB

腐蚀操作

kernel = np.ones((3,3), np.uint8) #选择3*3卷积核,3*3括起来,(3,3)

erosion = cv2.erode(img, kernel, iterations = 1) #erode腐蚀函数, iterations迭代次数

膨胀操作

dige_dilate = cv2.dilate(dig_erosion, kernel, iterations = 1) #dilate膨胀函数

开运算,先腐蚀后膨胀 ,调用函数morphologyEx,使用参数cv2.MORPH_OPEN

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

闭运算,先膨胀后腐蚀,调用函数morphologyEx,使用参数cv2.MORPH_CLOSE

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

梯度运算:膨胀-腐蚀,调用函数morphologyEx,使用参数MORPH_GRADIENT

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

礼帽 = 原始输入-开运算 #开运算是先腐蚀后膨胀,去掉了毛刺,原始输入有毛刺减去开运算,结果为毛刺。使用MORPH_TOPHAT参数

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

黑帽 = 闭运算 - 原始输入 #闭运算是先膨胀后腐蚀,毛刺加大加粗了,减去原始输入,结果为加大加粗的毛刺轮廓。使用MORPH_BLACKHAT参数

blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

Sobel算子,读入灰度图进行计算,计算法则:右-左,下-上

读入灰度图img = cv2.imread('pie.png', cv2.IMREAD_GRAYSCALE)

dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

ddepth:图像的深度;dx和dy分别表示水平和竖直方向;ksize是Sobel算子的大小

sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) # 水平方向,Ssobel算子为3

#sobelx是右减左,原图形内部是白色,外部是黑色,右减左法则,左半圆白色减黑色数值为正显示白色,右半圆黑色减白色数值为负,保留为0显示黑色

白到黑数值为正,显示白色,黑到白数值为负,截为0,所以需要取绝对值

sobelx = cv2.convertScaleAbs(sobelx)

分别计算x和y再求和

sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)

不建议一起计算sobelxy,会颜色变浅有重影,效果不好

sobelxy = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3)

梯度计算-scharr算子

scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)

梯度计算-Laplacian算子

laplacian = cv2.Laplacian(img, cv2.CV_64F)

图像平滑(均值滤波,高斯滤波,中值滤波)

#均值滤波,简单的平均卷积操作,3*3的核

blur = cv2.blur(img, (3,3))

#高斯滤波,更注重中间的。

#遵从高斯分布,靠近x的点数值大,重要程度高,权重高,离x远的点重要程度低,权重低

aussian = cv2.GaussianBlur(img, (5,5), 1)

#中值滤波。

#用中值代替,从小到大或从大到小排列,用中间值代替当前点亮度值

median = cv2.medianBlur(img, 5)

读入图像转为灰度图,调用cvtColor函数,使用 cv2.COLOR_BGR2GRAY参数

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Canny边缘检测

- 1)使用高斯滤波器,平滑图像,滤除噪音

- 2)计算图像中每个像素点的梯度强度和方向

- 3)应用非极大值抑制(None-Maximum Suppression),以消除边缘检测带来的杂散响应

- 4)应用双阈值检测(Double-Threshold),确定真实地和潜在的边缘

- 5)通过抑制孤立的弱边缘最终完成边缘检测

调用Canny函数,cv2.Canny(src, threshold_bottom, threshold_top)

src:源图像

threshold_bottom: 阈值下限

threshold_top: 阈值上限

阈值下限越低,包含信息越丰富,边界值越丰富;阈值上限越高,符合要求的信息越少,边界值越严格。

v1 = cv2.Canny(img, 80, 150)

v2 = cv2.Canny(img, 50, 100)

左图为V1,右图为V2,可以看出右图边界值更加清晰丰富

图像轮廓分三步,

第一步预处理,对图像转换成灰度图,进行二值化操作,生成thresh文件算出轮廓,

第二步找到轮廓,cv2.findContours (img, mode, method)

第三步画出轮廓, cv2.drawContours(img, contours, index,mode, width)

1、预处理

img = cv2.imread('contours.png') # opencv读入图片'contours.png',格式为BGR

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 将读入的图片BGR格式转换为灰度图gray

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) #对图片进行二值化操作,超过127置为255,低于127置为0

cv_show('thresh', thresh)

2、找到轮廓

cv2.findContours (img, mode, method)

img: 源图像

mode: 轮廓检索模式,常用RETR_TREE

- RETR_EXTERNAL:只检测最外面的轮廓;

- RETR_LIST: 检测所以轮廓,并将其保存在一条链表当中

- RETR_CCOMP:检测所有的轮廓,并将它们组织为两层;顶层是各部分的外部边界,第二层是空洞的边界;

- RETR_TREE: 检测所有轮廓,并重新嵌套轮廓的整个层次

method: 轮廓逼近方法

- CHAIN_APPROX_NONE: 以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)

- CHAIN_APPROX_SIMPLE: 压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分

# 将二值化处理的图像thresh传入findContours参数,生成轮廓contours

binary, contours, hierarch = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

3、绘制轮廓

cv2.drawContours(img, contours, index,mode, width)

- img: 要绘制轮廓的源图像,默认在原图上绘制轮廓,一般先对原图进行copy操作生成副本,在副本上绘制轮廓

- contours: 轮廓信息

- index: 轮廓索引,‘-1’代表绘制所有轮廓,‘2’代表绘制第二个轮廓,‘3’代表绘制第三个轮廓

- mode: 颜色模式,(0, 0, 255)是红色,(0, 255, 0)是绿色,(255, 0, 0)是蓝色

- width: 轮廓线条宽度,一般为2,太宽了内外轮廓不好分辨,太细了不容易看到轮廓

# 默认在原图上绘制轮廓,将原图img进行copy,生成一个副本draw_img,将图像draw_img和轮廓contours传入drawContours,显示所有轮廓,使用B通道蓝色绘制,线宽为2

draw_img = img.copy()

res = cv2.drawContours(draw_img, contours, -1, (255, 0, 0), 2)

cv_show('res', res)

轮廓特征

cnt = contours[0]

cv2.contoursArea(cnt) # 面积

cv2.arcLength(cnt, True) # 周长

轮廓近似

cv2.approxPolyDP(contours, epsilon, bool)

contours: 输入轮廓

epsilon: 阈值,进行轮廓近似的阈值,原始曲线与近似曲线之间的最大距离。

bool: 如果为True近似轮廓闭合,False近似轮廓断开

epsilon = 0.01*cv2.arcLength(cnt, True) # 精度为周长的0.01倍

approx = cv2.approxPolyDP(cnt, epsilon, True) # 生成封闭近似轮廓epsilon

外接矩形

x,y,w,h = cv2.boundingRect(cnt) #求出外接矩形坐标

img = cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0),2) #做出外界矩形

外接圆

(x,y), radius = cv2.minEnclosingCircle(cnt) #求出外接圆中心点坐标和半径

python语法:

range()创建左闭右开的区间,range(6)创建一个长度为6的空间,内部数字是0,1,2,3,4,5.

xticks()返回了两个对象,一个是刻标(locs),另外一个是刻度标签

locs, labels = xticks()

xticks([]),yticks([]),传入空的参数,不显示坐标和坐标标签

plt.title()设置图像标题,plt.title(‘img’),设置图像标题为img

plt.imshow()负责接受和对图像进行处理,并显示其格式,但是不正常展示图像.

plt.show()负责展示图像,展示imshow接受处理的图像。两个要结合一起使用。

np.hstack横着合成多张图

np.vstack竖着合成多张图

强制类型转换:类型( 变量),int(x),x转换为int类型

Markdown语法

“#”个数代表标题等级,等级越高字体越大,“#”是一级标题,“##”是二级标题,“#”要和字体空一格

“ - 1)”代表1)序号排列

“- ”代表一行,“-空格”

通过Markdown格式插入图片

插入图片的格式为:![图片标签](图片源 src)

英文输入法输入,![title](sobel_1.png),插入sobel_png图片

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

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

相关文章

【LeetCode】生命游戏 [M](矩阵)

289. 生命游戏 - 力扣(LeetCode) 一、题目 根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板,每一个格子都可以看成是一个…

2023年mybatis常见面试题10道

1. MyBatis是什么?Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生…

Hyper-V三种虚拟网络类型的理解

Windows 10除家庭版之外都内置了Hyper-V,但是Win10系统上Hyper-V虚拟网络的设置方法却与之前版本的Hyper-V有些不同,最近在折腾了无数遍之后,总算有些心得:先说说虚拟网络的三种类型。Hyper-v支持外部、内部、专用三种网络&#x…

蓝桥杯STM32G431RBT6学习——定时器中断

蓝桥杯STM32G431RBT6学习——定时器中断 前言 从网络上的资料来看,蓝桥杯嵌入式好像并不考外部中断(毕竟通常只是个按键应用),因此跳过进行定时器的学习。 STM32单片机的定时器通常分为高级定时器、通用定时器、基本定时器三种&…

111、【树与二叉树】leetcode ——669. 修剪二叉搜索树:递归法(C++版本)

题目描述 解题思路 本题的关键是用好递归这个结构,用好每次他向下的遍历和返回的值。每一次递归时,相当于解决与之前相同的问题,因此先按某一种类子问题进行讨论(仅有三个结点的满二叉树),当递归的方式向下…

二本学历5年经验的程序员,出去面试被碾压~

目录 1、从一个求职案例引入2 、学历差距:面试官的第一印象3、公司背景差距:你的人生名片4、技术差距:硬核能力的欠缺5、架构能力的差距6、面试结果的分析 这篇文章,聊一个很多人感兴趣的话题,小公司的Java工程师和大…

计网必会:HTPP详解、cookie、缓存

文章目录应用层协议Web和HTTPHTTP 概述采用非持续连接的HTTPRTT 往返时间的定义**三次握手过程**采用持续连接的HTTPHTTP到底采用哪个?HTTP 的报文格式请求报文功效格式响应报文状态码格式Cookie什么是cookieWeb缓存在学习的过程很多人都遇到了HTTP和Cookie&#xf…

【matplotlib】19.基本用法

#【matplotlib】19.基本用法 2021.1.19 画figure图基本方法。参考: https://m.runoob.com/matplotlib/matplotlib-pyplot.html https://mofanpy.com/tutorials/data-manipulation/plt/figure matplotlib 是python的画图包 19.1 基础使用 plot图,就是以…

JavaEE2-Spring核心与设计思想

目录 1.Spring是什么? 2.容器是什么? 3.IoC是什么? 3.1.传统程序开发 3.2.控制反转式程序开发 3.3.对比总结规律 4.理解Spring IoC 4.1.将对象(Bean)存入到容器(Spring); 4.2.从容器中取出对象。 5.DI概念说明 1.Spring…

LINUX---进程

目录相关概念1.什么是程序,什么是进程,有什么区别2.如何查看系统中有哪些进程3.进程标识符4.父进程,子进程5.C程序的存储空间是如何分配的创建进程函数forkvforkfork创建进程:vfork创建进程:进程退出正常退出:异常退出…

在XXX中找到了XXX的副本,但是当前代码与XXX中内置的版本不同【几种解决方案】

Microsoft VS警告类似如图所示: 然后发现编译编写好的代码无法打断点。定义的变量无法获取。 方案一: 把提示的该文件备份在其他文件夹一份,然后在项目中删除该文件。再把备份的文件放到该项目中。然后再编译。 方案二(参考该博客…

Udev设备管理器

udev 引入 在2.4内核中 引入了 devfs,他支持设备节点的动态创建。devfs提供了在内存中的文件系统中创建设备节点的能力。设备驱动程序能够自主的管理自己的设备文件。而命名节点的任务还是落到了设备驱动程序头上。但是,设备命名策略是可管理的&#xf…

【设计模式】结构型模式·适配器模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易,如果您觉得写的不错,欢迎给博主来一波点赞、收藏~让博主更有动力吧! 一. 概述 将一个类的接口转换成客户希望的另外一个接口,使得原本接口不兼容而不能一…

分布式搜索引擎--Elasticsearch

1.1 相关术语 和mysql类比 索引:数据库,database,6.0以后变化,对应表 类型:table,6.0以后变化,废弃 文档:一张表里的一行 字段:一个属性就是一个字段 和分布式相关 集群…

NLP学习笔记(六) Transformer简明介绍

大家好,我是半虹,这篇文章来讲 Transformer\text{Transformer}Transformer,想要获取更多相关文章,欢迎关注 自然语言处理 专栏 在之前的两篇文章中,我们介绍过序列到序列模型以及注意力机制在序列到序列模型中的应用 …

Linux开启Docker远程访问并设置安全访问(证书密钥),附一份小白一键设置脚本哦!

前言 喜欢折腾慢慢看,不喜欢折腾直接跳到小简下文的一键脚本那里,两分钟搞好。 我的博客:https://blog.ideaopen.cn 我的公众号:小简聊开发 开启远程访问 编辑docker.service文件 vi /usr/lib/systemd/system/docker.service # …

Python FastAPI 框架 操作Mysql数据库 增删改查

2 比 1 更容易理解,可以先看2(单文件级别) 1、FastAPI 框架 操作Mysql数据库(项目多文件级别) FastAPI 可以使用任何您想要的关系型数据库。 在这里,让我们看一个使用着SQLAlchemy的示例。 您可以很容易地将SQLAlchemy支持任何…

每天进步一点点,今天来学结构体

什么是结构体? C 语言允许用户自己指定这样一种数据结构,它由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的,这样的数据结构称为结构体,它相当于其它高级语言中记录。 …

01、数据结构——数组

一、数据结构与算法 数据结构是一门研究组织数据方式的学科,有了编程语言也就有了数据结构。学好数据结构可以编写出更加漂亮、更加有效率的代码。程序数据结构算法数据结构是算法的基础 二、稀疏数组: 1、基本介绍: 当一个数组中大部分元…

【Javascript】文本转语音SpeechSynthesisUtterance

SpeechSynthesisUtterance基本介绍 SpeechSynthesisUtterance是HTML5中新增的API,用于将指定文字合成为对应的语音.也包含一些配置项,指定如何去阅读(语言,音量,音调)等 SpeechSynthesisUtterance基本属性 SpeechSynthesisUtterance.lang 获取并设置话语的语言 SpeechSynthesis…