位置: IT常识 - 正文

OpenCV图像处理入门(opencv图像处理入门与实践pdf)

编辑:rootadmin
OpenCV图像处理入门

推荐整理分享OpenCV图像处理入门(opencv图像处理入门与实践pdf),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opencv图像识别思路,opencv图像处理入门与实践,opencv图像库,opencv图像处理入门与实践pdf,opencv图像处理入门与实践,opencv图像处理入门与实践,opencv图像处理入门,opencv图像处理入门与实践,内容如对您有帮助,希望把文章链接给更多的朋友!

😊😊😊欢迎来到本博客😊😊😊 本次博客内容将继续讲解关于OpenCV的相关知识 🎉作者简介:⭐️⭐️⭐️目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉python网页爬虫、机器学习、计算机视觉(OpenCV)、群智能算法。然后正在学习深度学习的相关内容。以后可能会涉及到网络安全相关领域,毕竟这是每一个学习计算机的梦想嘛! 📝目前更新:🌟🌟🌟目前已经更新了关于网络爬虫的相关知识、机器学习的相关知识、目前正在更新计算机视觉-OpenCV。 💛💛💛本文摘要💛💛💛

本文我们将继续讲解OpenCV的相关操作。

文章目录⭐️1.OpenCV礼帽操作和黑帽操作🎩⭐️2.Sobel算子理论基础及实际操作⭐️3.Scharr算子简介及相关操作⭐️4.Sobel算子和Scharr算子的比较⭐️5.laplacian算子简介及相关操作⭐️6.Canny边缘检测的原理⭐️7.Canny边缘检测的函数及使用

⭐️1.OpenCV礼帽操作和黑帽操作🎩

图像顶帽操作也叫图像礼帽操作,实际上就是: 结果图像=原图像-图像开运算 那么我们知道图像的开运算就是对图像先腐蚀操作,然后在进行膨胀操作,得到的图像其实就是进行了取噪的一个处理,然后我们所说的礼帽图像操作就是使用原图像-图像的开运算操作。 函数依旧是:

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

其中img表示原始图像,cv2.MORPH_TOPHAT表示进行礼帽操作,然后kernel表示卷积核,这里我们之前已经讲过。 核心函数是:

k=np.ones((5,5),np.uint8)r=cv2.morphologyEx(o,cv2.MORPH_TOPHAT,k)

这样我们显示以下我们处理的图像就可以知道: 处理之后我们得到了相应的噪声结果。

图像黑帽操作就是图像的闭运算-原图像 黑帽结果图像=图像闭运算-原图像 我们之前也介绍过这个闭运算操作就是先对图像进行膨胀操作,然后进行腐蚀操作。 函数是:

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

其中cv2.MORPH_BLACKHAT表示的就是黑帽操作的意思,kernel表示卷积核。 然后我们看一下图像处理的核心函数:

k=np.ones((5,5),np.uint8)r=cv2.morphologyEx(o,cv2.MORPH_BLACKHAT,k)

得到的结果是: 可以看到我们把图像中的小气泡都取出来了。

⭐️2.Sobel算子理论基础及实际操作

首先我们来了解一个边界的定义,看一个图来理解更加的明白。 对于如图中的水平梯度,我们看A、B两个地方,右侧像素值减去左侧像素值不为0,那么我们就说在此图中A列和B列是边界,否则不是边界。同样对于垂直梯度我们也是这样定义。 对于Sobel算子,我们先来看x方向他进行了什么操作: P5x=(p3-p1)+2*(p6-p4)+(p9-p7) 右侧像素值减去左侧像素值,中间行参数稍大为2。 同样对于y轴方向也做了一个同样的操作, P5y=(p7-p1)+2*(p8-p2)+(p9-p3) 下一行像素值减去上一行像素值,中间列参数稍大为2 然后我们计算了一个近似梯度值: G= 根号(𝐺𝑥2 + 𝐺𝑦2) 简化版本就是: G=|𝐺𝑥|+| 𝐺𝑦| 这中心点的P5的Sobel算子就是按照这个方式进行计算。 对于P5点完成的Sobel算子计算就是这样: 那么好,我们来看一下在python中对于Sobel是一个什么样的函数:

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

其中src表示原始图像,ddeph表示图像的深度,那么我们一般设定为-1,用来表示和原图像保持一致。dx,dy表示x轴的方向或者y轴的方向,ksize表示核大小。 其中我们在已经知道的256色位图中,白色点像素值255,黑色点像素值0。 这里对于dx,dy方向为什么我们取绝对值进行一下解答,因为加入一块黑块在一个白色背景下,那么我们在水平方向上,左侧那么得到的数值就是一个负数,对于右侧那么我们得到的是就是一个正常的正数,那么对于OpenCV来说,当我们没有加绝对值得时候如果出现了负数,统一处理成0。 根据图我们就可以知道,左侧的线被OpenCV处理成了0。所以我们这里要加上一个绝对的运算。无论对于水平方向还是垂直方向都是如此。 然后我们要将原始图像处理成256为的色位图。其函数是:

dst = cv2.convertScaleAbs( src [, alpha[, beta]] )

目标图像=调整(原始图像*alpha+beta) 其中alpha和beta可以理解为权重的意思。 当我们想要计算水平方向上的Sobel算子的时候,那么我们就设定函数中的参数dx=1,dy=0.对于垂直方向也是如此。那么这里我们就会想:如果我们两个方向都一起设置这样是不是比计算完x的方向然后计算y方向,然后进行结合这样是不是更加的方便一些呢?也就是说下图中的方式一比方式二更加的简介方便呢? 事实上不是这样的,而且两个图像有很大的差异,这个我们后续会看到结果。 那么当我们完成了这一步操作之后,我们还要做两个图像的权重和,其函数是:

dst=cv2.addWeighted( src1 , alpha , src2 , beta , gamma )

这里我们说的通俗一点就是,src1表示计算的x轴方向的图像,alpha表示x轴方向上的图像所占的比重,src2表示计算的y轴方向的图像,beta表示y轴方向上的图像所占的比重是多少,最后gamma表示一个修正数值。

OpenCV图像处理入门(opencv图像处理入门与实践pdf)

dst(I)=saturate(src1(I)*alpha+src2(I)*beta+gamma)

接下来我们来验证一下各个结果:

import cv2import numpy as npo = cv2.imread('image\\sobel4.bmp',cv2.IMREAD_GRAYSCALE)sobelx = cv2.Sobel(o,-1,1,0)cv2.imshow("original",o)cv2.imshow("x",sobelx)cv2.waitKey()cv2.destroyAllWindows()

这里我们没有加上绝对值计算x轴方向上的Sobel算子,得到的结果是: 很明显左侧的没有计算出来。

import cv2import numpy as npo = cv2.imread('image\\sobel4.bmp',cv2.IMREAD_GRAYSCALE)sobelx = cv2.Sobel(o,cv2.CV_64F,1,0)sobelx = cv2.convertScaleAbs(sobelx) # 转回uint8 cv2.imshow("original",o)cv2.imshow("x",sobelx)cv2.waitKey()cv2.destroyAllWindows()

当我们加上绝对值后的结果是: 对于垂直方向的结果也是如此。最后我们计算出x,y的方向。进行融合并且和直接将x,y表示成1的结果进行一下对比,我们来看结果: 核心代码:

sobelx = cv2.Sobel(o,cv2.CV_64F,1,0)sobely = cv2.Sobel(o,cv2.CV_64F,0,1)sobelx = cv2.convertScaleAbs(sobelx) # 转回uint8 sobely = cv2.convertScaleAbs(sobely) sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) sobelxy11=cv2.Sobel(o,cv2.CV_64F,1,1)sobelxy11=cv2.convertScaleAbs(sobelxy11)

根据结果我们可以得到:使用了dx,dy的情况下无法检测到边。然后我们用lena来测试一下结果。 在我们相加表示的情况下,边缘检测的线条十分清晰,将分割的地带表达的特别清楚。

⭐️3.Scharr算子简介及相关操作

经过大量的科学家验证,发现3*3的Sobel算子可能并不是特别的精确,于是又提出了相应的Scharr算子,其实就是改变了运算的尺度而已。 Sobel算子由原来的121变为了3 10 3,这样的一个组合。其余的操作都是和Sobel算子一致我们来简要的说明一下: dst=Scharr(src, ddpeth, dx, dy) 这里面少了核的大小,但是和Sobel算子依然一直,参数这里就不解释了,唯一不同的就是我们使用Sobel算子可以设置成dx=1,dy=1。那么对于Scharr算子如果这样设置就会报错。这里需要注意一下。满足条件: dx >= 0 && dy >= 0 && dx+dy == 1

import cv2import numpy as npo = cv2.imread('image\\scharr.bmp',cv2.IMREAD_GRAYSCALE)scharrx = cv2.Scharr(o,cv2.CV_64F,1,0)scharry = cv2.Scharr(o,cv2.CV_64F,0,1)scharrx = cv2.convertScaleAbs(scharrx) # 转回uint8 scharry = cv2.convertScaleAbs(scharry) scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0) cv2.imshow("original",o)cv2.imshow("x",scharrx)cv2.imshow("y",scharry)cv2.imshow("xy",scharrxy)cv2.waitKey()cv2.destroyAllWindows()

⭐️4.Sobel算子和Scharr算子的比较

对于上述我们的测试图,其实看不出来Sobel算子和Scharr算子到底有什么区别,看起来是一致的,那么我们这里使用大美女lena进行一次Sobel和Scharr,得到结果进行对比一下可以知道:

sobelx = cv2.Sobel(o,cv2.CV_64F,1,0,ksize=3)sobely = cv2.Sobel(o,cv2.CV_64F,0,1,ksize=3)sobelx = cv2.convertScaleAbs(sobelx) # 转回uint8 sobely = cv2.convertScaleAbs(sobely) sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) scharrx = cv2.Scharr(o,cv2.CV_64F,1,0)scharry = cv2.Scharr(o,cv2.CV_64F,0,1)scharrx = cv2.convertScaleAbs(scharrx) # 转回uint8 scharry = cv2.convertScaleAbs(scharry) scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)

很明显,这里我们看一下了lena的肩膀部分,可以看到使用Shcarr算子进行计算的时候,刻画的更加细致。

⭐️5.laplacian算子简介及相关操作

拉普拉斯算子类似于二阶sobel导数。实际上,在OpenCV中通过调用sobel算子来计算拉普拉斯算子。使用的公式为: ∆𝑠𝑟𝑐 = 𝜕2𝑠𝑟𝑐/𝜕𝑥2 + 𝜕2𝑠𝑟𝑐/𝜕𝑦2 使用的卷积核也和Sobel和Shcarr算子的不一致:

看起来有点像高斯的,哈哈哈。 这里我们进行一下讲解, P5new=(p2+p4+p6+p8)-4*p5 当没有处于边界的时候呢,我们可以得到P5的数值是变化不大的,当处于边界的时候,P5的数值是变化非常大的,这是因为什么呢? 对于拉普拉斯算子的函数估计我们也可以猜到: dst = cv2.Laplacian( src, ddepth ) 自然是没有水平方向和垂直方向的。 实际操作中,计算梯度值可能会出现负数。通常处理的图像是np.uint8类型,如果结果也是该类型,所有负数会自动截断为0,发生信息丢失。所以,通常计算时,使用更高的数据类型cv2.CV_64F,取绝对值后,再转换为np.uint(cv2.CV_8U)类型。 所以我们还是要取一次绝对值的运算: dst = cv2.convertScaleAbs( src )

import cv2import numpy as npo = cv2.imread('image\\laplacian.bmp',cv2.IMREAD_GRAYSCALE)laplacian = cv2.Laplacian(o,cv2.CV_64F)laplacian = cv2.convertScaleAbs(laplacian) # 转回uint8 cv2.imshow("original",o)cv2.imshow("laplacian",laplacian)cv2.waitKey()cv2.destroyAllWindows()

我们对lena进行一次拉普拉斯算子操作,得到的结果是:

⭐️6.Canny边缘检测的原理

Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory of edge detection)解释这项技术如何工作。 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 1.最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小; 2.最优定位准则:检测到的边缘点的位置距离实际边缘点的位置最近,或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小; 3.检测点与边缘点一一对应:算子检测的边缘点与实际边缘点应该是一一对应。 Canny边缘检测的一般步骤:1.去噪 2.梯度运算 3.非极大值抑制 4.滞后阈值。下面我们就分别讲解一下这些操作: 🌞1.去噪 边缘检测容易受到噪声的影响。因此,在进行边缘检测前,通常需要先进行去噪。我们一般使用高斯滤波进行图像去噪处理。也就是让临近的像素具有更高的重要度。对周围像素计算加权平均值,较近的像素具有较大的权重值。 比较像我们之间讲到的k近邻算法的意思哈。进行去噪处理之后呢,我们对于平滑图像进行一次Sobel算子梯度运算。 🌞2.梯度运算 𝐸𝑑𝑔𝑒𝐺𝑟𝑎𝑑𝑖𝑒𝑛𝑡 𝐺 = 根号下(𝐺𝑥2 + 𝐺𝑦2) 对于方向:𝐴𝑛𝑔𝑙𝑒 𝜃 = 𝑡𝑎𝑛−1(𝐺𝑦/𝐺𝑥) 对于每一个点计算之后的方向就是这样。大小和方向在图中都已经进行了标记。梯度的方向一般总是与边界垂直。梯度方向被归为四类:垂直,水平,和两个对角线。 🌞3.非极大值抑制 在获得了梯度和方向后,遍历图像,去除所有不是边界的点。实现方法:逐个遍历像素点,判断当前像素点是否是周围像素点中具有相同方向梯度的最大值。 点A、点B、点C三点具有相同的方向,梯度方向垂直于边缘。判断点A是否为点A、点B、点C的局部最大值 :如果是,保留该点;否则,它被抑制(归零)。 这里就表示在垂直方向上进行了抑制,取出最大值。 🌞4.滞后阈值 这里对非极大值抑制之后,我们进行了一次滞后阈值操作,分别取一个最小阈值和一个最大阈值,然后图像像素点的曲线与最大最小阈值相连则保留,如果不相连则抛弃。 我们来看一下边缘检测的结果图:

⭐️7.Canny边缘检测的函数及使用

Canny边缘检测的函数是: edges = cv2.Canny( image, threshold1, threshold2 ) threshold1表示阈值1,threshold2表示阈值2。也就是我们刚刚介绍到的最大最小阈值。

import cv2import numpy as npo=cv2.imread("image\\canny.bmp",cv2.IMREAD_GRAYSCALE)r=cv2.Canny(o,100,200)cv2.imshow("original",o)cv2.imshow("result",r)cv2.waitKey()cv2.destroyAllWindows()

然后我们在对lena做一次,结果是: 调整阈值,可以控制边缘细节。maxVal、minVal变小,有更多的细节信息。

🔎支持:🎁🎁🎁如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦!这就是给予我最大的支持!

本文链接地址:https://www.jiuchutong.com/zhishi/300859.html 转载请保留说明!

上一篇:【vue3】关于watch与computed的用法看这个就ok(vue watcher)

下一篇:解决CentOS 安装出现"-bash: wget: 未找到命令"解决方案(centos安装软件教程)

  • 小米手机怎么查看私密笔记(小米手机怎么查看wifi密码是多少)

    小米手机怎么查看私密笔记(小米手机怎么查看wifi密码是多少)

  • 抖音怎么变小时候(抖音怎么变小时候照片)

    抖音怎么变小时候(抖音怎么变小时候照片)

  • 网易云直播云朵怎么算收益的(网易云直播云朵能提现吗)

    网易云直播云朵怎么算收益的(网易云直播云朵能提现吗)

  • 快捷键退出word的最快方法(快捷键退出Word的最快的方)

    快捷键退出word的最快方法(快捷键退出Word的最快的方)

  • 小米手机怎么打开隐藏的应用(小米手机怎么打开开发者选项)

    小米手机怎么打开隐藏的应用(小米手机怎么打开开发者选项)

  • 钉钉群移除如何找回(钉钉群移除还能进去吗)

    钉钉群移除如何找回(钉钉群移除还能进去吗)

  • 淘宝评价无法晒视频(淘宝评价晒不了图片)

    淘宝评价无法晒视频(淘宝评价晒不了图片)

  • 移动应用授权失效(移动授权权限名词解释)

    移动应用授权失效(移动授权权限名词解释)

  • 哈罗顺风车一个行程能接几单(哈罗顺风车一个月能赚多少钱)

    哈罗顺风车一个行程能接几单(哈罗顺风车一个月能赚多少钱)

  • 小米8是不是无线充电(小米8是不是无线快充)

    小米8是不是无线充电(小米8是不是无线快充)

  • xr和11的钢化膜一样吗(苹果xr和苹果11的钢化膜)

    xr和11的钢化膜一样吗(苹果xr和苹果11的钢化膜)

  • 如何在电脑上用微信读书(如何在电脑上用剪映剪辑视频)

    如何在电脑上用微信读书(如何在电脑上用剪映剪辑视频)

  • win7是单用户还是多用户(win7是单用户还是多用户参考答案冲突)

    win7是单用户还是多用户(win7是单用户还是多用户参考答案冲突)

  • iphone7芯片是a几(iphone七是什么芯片)

    iphone7芯片是a几(iphone七是什么芯片)

  • 抖音移除粉丝后对方知道么(抖音移除粉丝后对方的关注列表里还有我吗)

    抖音移除粉丝后对方知道么(抖音移除粉丝后对方的关注列表里还有我吗)

  • 怎样隐藏微信的收藏(怎样隐藏微信的手机号)

    怎样隐藏微信的收藏(怎样隐藏微信的手机号)

  • 芒果TV会员怎么在电视上登录(芒果tv会员怎么换到另一个账号)

    芒果TV会员怎么在电视上登录(芒果tv会员怎么换到另一个账号)

  • token已过期怎么办(token过期怎么处理前端)

    token已过期怎么办(token过期怎么处理前端)

  • 华为mate30用的什么屏(华为mate30用的什么处理器)

    华为mate30用的什么屏(华为mate30用的什么处理器)

  • 快手显示你在她的通讯录里是什么意思(快手对方显示当前在线是什么意思)

    快手显示你在她的通讯录里是什么意思(快手对方显示当前在线是什么意思)

  • iphone怎么授权软件(苹果手机怎么授权应用软件)

    iphone怎么授权软件(苹果手机怎么授权应用软件)

  • 为什么手机有话费却打不出去电话(为什么手机有话费还是显示停机)

    为什么手机有话费却打不出去电话(为什么手机有话费还是显示停机)

  • 充电仓怎么看充满电(充电仓怎么看充满电一直是红的)

    充电仓怎么看充满电(充电仓怎么看充满电一直是红的)

  • 头歌-HTML基础(头歌HTML基础第一关初识HTML)

    头歌-HTML基础(头歌HTML基础第一关初识HTML)

  • 织梦购物商品页判断用户未登录及弹出信息修改(织梦官网倒闭了吗)

    织梦购物商品页判断用户未登录及弹出信息修改(织梦官网倒闭了吗)

  • 所得税汇算清缴账务处理
  • 建筑安装服务的发票
  • 发出商品的会计核算
  • 防伪税控系统中的设备包括哪些
  • 存货盘盈涉税问题
  • 红冲暂估原材料如何做会计分录
  • 机械租赁公司拿什么发票做成本账
  • 银行贷款利息从几点计算
  • 去年暂估的库存商品今年到了发票怎么做会计分录
  • 免税商品销售要缴税吗
  • 物业公司收入需要公示
  • 事业单位购入存货分录
  • 记账凭证是否要记账
  • 营改增后增值税专用发票抵扣规定
  • 营改增之前有增值税吗
  • 私车公用税务处理
  • 小规模纳税人贷款利息收入增值税税率
  • 多交的增税怎么做账
  • 进口应税消费品的组成计税价格公式
  • 代账代税与自行核算申报应从哪几个角度考虑
  • 开发票有时间限制吗?
  • 合伙企业收到投资款要缴纳印花税吗
  • 自建不动产领用原材料的进项税
  • 支付商业保险费属于什么现金流量项目
  • 建筑工地发生的典型意外情况有哪些
  • 员工出差时法律规定
  • 筹建期间的租赁费计入
  • 新会计规定工会会计制度
  • 王者荣耀中钟馗怎么出装
  • group policy client服务未能登录解决方法
  • 文竹叶子发黄怎么办
  • 为什么会产生应收账款
  • 任意公积金可以不提取吗
  • 企业返聘离退休怎么办
  • thinkphp console
  • node.js快速入门
  • 帝国cms自动采集插件
  • mongodb 数据文件
  • 电子税务局发票作废流程
  • 巧妙利用谐音的广告语
  • 现时社保缴费
  • 应收账款科目的期末余额
  • 跨年度少计摊销怎么做账
  • 预收账款指的是什么意思
  • 计提社保和工资一起怎么做账
  • 收到国税退款的分录
  • 投标保证金退还
  • 购买理财收入计入什么科目
  • 每月分红会计分录
  • 小规模纳税人应纳增值税额的计算
  • sql server建表时怎样选择数据类型
  • mysql主从复制原理详解
  • microsoft wlan
  • windowsxp锁屏密码怎么设置
  • iis设置mime
  • 装xp系统鼠标键盘没有驱动
  • 在windows xp的应用程序中,经常有一些
  • Mac通过AppleID登录窗口
  • win8怎么固定桌面
  • windows7触摸
  • Win10预览版镜像
  • NGUI字体图集导致Label文字破碎的BUG以及解决方案
  • 2014 ChinaJoy落下帷幕 十大年度热门事件盘点
  • opengl房子建模
  • json对象如何取值
  • python科学绘图
  • window.open()参数传递及获取
  • jquery.js插件
  • win安装nodejs
  • mongoose操作
  • 关于使用RequestWindowFeature为啥一定要在setContentView之前调用
  • js设置rem
  • jquery实现点击按钮
  • 广西税务局增值税发票查询平台
  • 税务稽查协查管理办法 国家税务总局
  • 江苏税务局开票在哪看的
  • 为什么医保卡显示无效
  • ca证书登录不了网厅怎么办
  • 开发商代收代缴电费能开发票吗
  • 国税局的标志
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设