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

网站建设预览广州优化网站排名

网站建设预览,广州优化网站排名,武汉做网站价格,包头城乡建设委员会网站简介:本文深入探讨图像梯度相关知识,详细介绍图像梯度是像素灰度值在不同方向的变化速度,并以 “pig.JPG” 图像为例,通过代码展示如何选取图像部分区域并分析其像素值以论证图像梯度与边缘信息的关联。接着全面阐述了 Sobel 算子&#xff0c…

在这里插入图片描述

简介:本文深入探讨图像梯度相关知识,详细介绍图像梯度是像素灰度值在不同方向的变化速度,并以 “pig.JPG” 图像为例,通过代码展示如何选取图像部分区域并分析其像素值以论证图像梯度与边缘信息的关联。接着全面阐述了 Sobel 算子,包括 ddepth 参数对边缘检测完整性的影响及 dx、dy 参数不同设置的效果差异;Scharr 算子的用法及其相较于 Sobel 算子在准确度上的优势;Laplacian 算子的特性,如在检测微小细节变化方面的优势、对噪声敏感及需先平滑处理的要点,并给出了各算子在图像边缘检测应用中的代码示例与实际效果展示,助力读者深入理解图像梯度与相关算子在图像处理中的作用。
如果本文对你的图像梯度学习有所帮助,请给我点赞收藏关注,我会为你持续提供与OpenCV学习相关的文章。

《图像梯度与常见算子全解析:原理、用法及效果展示》

  • 图像梯度
    • 什么是图像梯度?
  • sobel算子
    • ddepth的用法
    • dx dy参数设置(请记住这里有两个知识点)
  • Scharr算子
  • Laplacian算子(三个知识点)
  • 致谢

图像梯度

什么是图像梯度?

它是指像素灰度值在不同方向的变化速度。我通过OpenCV的代码把这张命名为pig.JPG的图像选择出一部分,给大家展示一下。
这是我项目的文件结构:
在这里插入图片描述
需要图片的可以直接复制,我把他放到文章里了
在这里插入图片描述
我用代码选择出猪猪侠的偏底部的部分展示一下

import numpy as np
import cv2
image = cv2.imread("pig.JPG")
print(image.shape)
image = image[800:850,229:250]
cv2.imshow("image",image)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

我们现在已经把这个猪猪侠的腿部选出来了,我们去打印它的np像素值

import numpy as np
import cv2
image = cv2.imread("pig.JPG")
image = image[800:850,229:250]
print(image)

在这里插入图片描述
我们可以看到灰度值从几十变成一两百差别很大,而图片中的内容恰好对应的是腿部的轮廓。说明梯度变化大的时候针对的就是轮廓。一切都是为了论证这句话:一般情况下,图像梯度计算的是图像的边缘信息
再通过我用画图板画的一张图来证明一下(画的简陋多多包涵):

在这里插入图片描述
水平方向同理,请看下图:
在这里插入图片描述

sobel算子

语法 :
dst = cv2.Sobel(原始图像src,ddepth图像深度,dx 计算水平方向的偏导数 ,dy 计算垂直方向的偏导数,ksize算子大小)
因为不同的参数影响很大,所以要一个一个参数的用法讲

ddepth的用法

比如说我在画图板画出下面这个图,命名为so_1.JPG ,设置图像深度为 0 就是与原图像一致,ksize = 3 dx =1 dy =0
在这里插入图片描述

import numpy as np
so_1_img = cv2.imread("so_1.JPG",cv2.IMREAD_GRAYSCALE)
dst = cv2.Sobel(so_1_img,ddepth = 0,dx = 1,dy = 0,ksize = 3)
cv2.imshow('original',so_1_img)
cv2.imshow("sob",dst)
cv2.waitKey()
cv2.destroyAllWindows()

a
你观察图片可以发现,他只找到了一条的边,可是这个方向的边应该有两条。原因是因为白色是255,黑色是0 白右黑左的时候差值为255,而白左黑右的时候-255,被自动忽略了。
要解决这种方式需要提高ddepth,然后对计算结果取绝对值,因为我读入图片的时候选择的是八位灰度值的,所以我在使用sobel算子可以设置为64位,然后再使用cv2.convertScaleAbs()对图片取绝对值然后就可以出现两条边了。请看下面的代码:

import numpy as np
so_1_img = cv2.imread("so_1.JPG",cv2.IMREAD_GRAYSCALE)
dst = cv2.Sobel(so_1_img,ddepth = cv2.CV_64F,dx = 1,dy = 0,ksize = 3)
ddst = cv2.convertScaleAbs(dst)
cv2.imshow('original',so_1_img)
cv2.imshow("sob",dst)
cv2.imshow("abs_sob",ddst)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

dx dy参数设置(请记住这里有两个知识点)

第一个知识点 设置一者为1 另一者为0可以计算单独方向的轮廓,如果想同时计算那么需要二者使用cv2.addweighted函数一者0.5对水平和竖直方向进行加权。
还是拿同一张图展示:

import numpy as np
so_1_img = cv2.imread("so_1.JPG",cv2.IMREAD_GRAYSCALE)
dst = cv2.Sobel(so_1_img,ddepth = cv2.CV_64F,dx = 1,dy = 0,ksize = 3)
ddst = cv2.convertScaleAbs(dst)
y_dst = cv2.Sobel(so_1_img,ddepth = cv2.CV_64F,dx = 0,dy = 1,ksize = 3)
y_ddst = cv2.convertScaleAbs(y_dst)
add = cv2.addWeighted(ddst,0.5,y_ddst,0.5,0)
cv2.imshow('original',so_1_img)
cv2.imshow("abs_x_sob",ddst)
cv2.imshow("abs_y_sob",y_ddst)
cv2.imshow("add",add)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
第二个知识点是,同时设置dx =1 dy =1与第一个知识点的计算结果并不一致,因为
图像中的边缘并不总是简单的水平或垂直方向。在实际的图像中,边缘可能是倾斜的、弯曲的或者有噪声干扰。
当分别计算和方向梯度并加权相加时,可能会丢失一些复杂边缘的细节信息。而dx = 1、dy = 1的计算方式会以一种不同的角度来捕捉这些复杂边缘的变化,包括对角边缘等,所以结果会和简单加权相加的情况不一致。
我们拿猪猪侠这张图来验证一下

import numpy as np
so_1_img = cv2.imread("pig.JPG",cv2.IMREAD_GRAYSCALE)
dst = cv2.Sobel(so_1_img,ddepth = cv2.CV_64F,dx = 1,dy = 0,ksize = 3)
ddst = cv2.convertScaleAbs(dst)
y_dst = cv2.Sobel(so_1_img,ddepth = cv2.CV_64F,dx = 0,dy = 1,ksize = 3)
y_ddst = cv2.convertScaleAbs(y_dst)
add = cv2.addWeighted(ddst,0.5,y_ddst,0.5,0)
x_y_dst = cv2.Sobel(so_1_img,ddepth = cv2.CV_64F,dx = 1,dy =1,ksize = 3)
x_y_ddst = cv2.convertScaleAbs(x_y_dst)
cv2.imshow('original',so_1_img)
cv2.imshow("add",add)
cv2.imshow("dxdy11",x_y_ddst)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

Scharr算子

用法与sobel一样就是函数名不一样 cv2.Scharr(),有两个区别就是

  1. scharr没有ksize这个参数。
  2. scharr不能同时设置dx dy为1

他比sobel算子准确度更高,是一种改良,我们还用pig.JPG来展示:

import numpy as np
so_1_img = cv2.imread("pig.JPG",cv2.IMREAD_GRAYSCALE)x_y_dst = cv2.Sobel(so_1_img,ddepth = cv2.CV_64F,dx = 1,dy =1,ksize = 3)
x_y_ddst = cv2.convertScaleAbs(x_y_dst)x_scharr = cv2.Scharr(so_1_img,ddepth = cv2.CV_64F,dx = 1,dy =0)
x_sscharr = cv2.convertScaleAbs(x_scharr)y_scharr = cv2.Scharr(so_1_img,ddepth = cv2.CV_64F,dx = 0,dy =1)
y_sscharr = cv2.convertScaleAbs(y_scharr)x_y_sscharr = cv2.addWeighted(x_sscharr,0.5,y_sscharr,0.5,0)cv2.imshow('original',so_1_img)
cv2.imshow("dxdy11",x_y_ddst)
cv2.imshow("scharr",x_y_sscharr)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
明显看出来后者抓住了更多轮廓,下过更好

Laplacian算子(三个知识点)

第一个知识点: 相比于sobel算子,Laplacian 算子在检测一些微小的细节变化(如噪点引起的小波动或者很细的线条)方面可能更有优势。
第二个知识点:由于 Laplacian 算子是二阶导数,它对噪声比较敏感。在图像存在噪声时,噪声点周围的像素值变化会被 Laplacian 算子放大,可能导致误检测出许多假边缘。所以在实际应用中,通常会先对图像进行平滑处理(如使用高斯滤波),然后再应用 Laplacian 算子进行边缘检测,以减少噪声的影响。
第三个知识点,他的语法:
dst = cv2.Laplacian(原始图像src,图像深度ddepth,ksize核尺寸大小,scale缩放因子,delta计算结果+delta说白了就是个附加值,borderType就是个边界样式一般不用修改)
还用pig.JPG这个图片做例子:

import numpy as np
import cv2
img = cv2.imread("pig.JPG",cv2.IMREAD_GRAYSCALE)
lap = cv2.Laplacian(img,cv2.CV_64F)
lap = cv2.convertScaleAbs(lap)
cv2.imshow("original",img)
cv2.imshow("laplacian",lap)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

致谢

本文参考了一些博主的文章,博取了他们的长处,也结合了我的一些经验,对他们表达诚挚的感谢,使我对 图像梯度与算子 有更深入的了解,也推荐大家去阅读一下他们的文章。纸上学来终觉浅,明知此事要躬行:
OpenCV图像处理(十一)—图像梯度
一文讲解图像梯度

http://www.hrbkazy.com/news/4616.html

相关文章:

  • 平面设计到底要学什么搜索引擎优化服务
  • 做模具的都有什么网站哪里做网络推广
  • wordpress输入密码注册搜索引擎推广和优化方案
  • 网站首页的功能需求分析短视频优化
  • 承德招聘信息网灰色seo关键词排名
  • 厦门外贸网站建设多少钱seo推广方式是什么呢
  • 做电商网站需要做什么准备如何引流被动加好友微信
  • 合肥外贸网站建设公司短视频营销推广方案
  • 个人简历电子版可填写北京关键词seo
  • 做网站接雕塑业务提高工作效率的软件
  • 游戏网站开发过程灰色词排名接单
  • 东莞人才市场官网盐城seo推广
  • 常用网站建设技术是什么seo优化排名是什么
  • 无锡高端网站建设哪家好什么是sem推广
  • 做民宿的网站最好用的系统优化软件
  • 建设厅网站生成案卷生成不了怎样交换友情链接
  • dw做新闻网站平台软件定制开发
  • 在线做动漫图片视频在线观看网站佛山网站建设解决方案
  • 怎么拥有个人网站互联网营销师国家职业技能标准
  • 凡科怎么建设网站今天最新军事新闻视频
  • 网站站点建设分为电商的推广方式有哪些
  • 怎样切图做网站做任务赚佣金的正规平台
  • 网络推广营销策略电商网站商品页的优化目标是什么
  • 网站做前端百度推广怎么推
  • 企业网络推广培训成都seo经理
  • 网站个人备案需要什么seo是什么服务器
  • 企业网站做多大尺寸免费b2b网站推广有哪些
  • 网站举报百度app下载官方免费最新版
  • 北京通州网站制作公司营销培训课程ppt
  • 云南网站建设专业品牌上海推广服务