tnblog
首页
视频
资源
登录

OpenCV 图像梯度计算(学习笔记)

2196人阅读 2024/1/9 14:25 总访问:3511544 评论:0 收藏:0 手机
分类: opencv

OpenCV 图像梯度计算(学习笔记)

Sobel算子简介


Sobel算子是一个图像边缘检测的算法。
其基本原理是通过计算像素点梯度值来确定图像中的边缘信息。

什么情况下会产生梯度?


举例:在一个白心圆黑心背景图中,纯白或纯黑部分都不会产生,只有的边缘部分将会产生梯度的情况。

定义Sobel算子模板


Sobel算子模板是一个3*3的矩阵卷积核。
3*3的模板矩阵与图像中的某个像素点对应位置进行对齐。
如下图所示:


当我们要求出模板矩阵与该像素点周围8个像素点的加权平均值,水平x方向为:

含义:当目标(P5点)左右两列差别特别大的时候,目标点的值会很大,说明该点为边界。


y方向的权值公式如下:

Sobel算子的梯度问题


1.目标像素点求得的值小于0或者大于255怎么办?
通常Opencv默认的是是截断操作,即小于0就按0算,大于255按255算。
2.截断操作合适吗?
不合适,因为呈现的程度不一样。举例:-200或-1它都是按照0来算
3.应该如何操作?
对于小于0的值取出绝对值,大于255的可按255算(因为255是最大的值了)

总梯度计算

示例代码

  1. import cv2 #opencv读取的格式是BGR
  2. import numpy as np
  3. import matplotlib.pyplot as plt#Matplotlib是RGB
  4. %matplotlib inline


展示原图。

  1. img = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE)
  2. cv2.imshow("img",img)
  3. cv2.waitKey()
  4. cv2.destroyAllWindows()


可通过cv2.Sobel来进行计算,举例:dst = cv2.Sobel(src, ddepth, dx, dy, ksize)参数如下:
ddepth:图像的深度
dxdy分别表示水平和竖直方向
ksize是Sobel算子的大小

  1. def cv_show(img,name):
  2. cv2.imshow(name,img)
  3. cv2.waitKey()
  4. cv2.destroyAllWindows()
  1. sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
  2. cv_show(sobelx,'sobelx')


白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值。

  1. sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
  2. # 进行取绝对值操作
  3. sobelx = cv2.convertScaleAbs(sobelx)
  4. cv_show(sobelx,'sobelx')


再求y的Sobel算子。


分别计算x和y,再求和.

  1. sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
  2. cv_show(sobelxy,'sobelxy')


不建议直接计算.

  1. sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
  2. sobelxy = cv2.convertScaleAbs(sobelxy)
  3. cv_show(sobelxy,'sobelxy')


再举个例子。

  1. img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
  2. cv_show(img,'img')

  1. img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
  2. sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
  3. sobelx = cv2.convertScaleAbs(sobelx)
  4. sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
  5. sobely = cv2.convertScaleAbs(sobely)
  6. sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
  7. cv_show(sobelxy,'sobelxy')


但是如果直接计算就会效果不佳。

  1. img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
  2. sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
  3. sobelxy = cv2.convertScaleAbs(sobelxy)
  4. cv_show(sobelxy,'sobelxy')

Scharr算子


与Sobel算子一样的原理,只是数值比它大一些,对于细节刻画得更明显一些。

laplacian算子


这个很不一样,不会进行梯度。
Laplacian是利用二阶导数来检测边缘,因为图像是二维的,我们需要在两个方向上求导,如下式所示:


计算P5的梯度公式如下:

\large P5{_n}ew=(P2+P4+P6+P8)-4*P5

代码实验对比


通过进行Sobel、Scharr和laplacian的代码如下所示:

  1. #不同算子的差异
  2. img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
  3. sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
  4. sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
  5. sobelx = cv2.convertScaleAbs(sobelx)
  6. sobely = cv2.convertScaleAbs(sobely)
  7. sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
  8. scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
  9. scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
  10. scharrx = cv2.convertScaleAbs(scharrx)
  11. scharry = cv2.convertScaleAbs(scharry)
  12. scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
  13. laplacian = cv2.Laplacian(img,cv2.CV_64F)
  14. laplacian = cv2.convertScaleAbs(laplacian)
  15. res = np.hstack((sobelxy,scharrxy,laplacian))
  16. cv_show(res,'res')


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

OpenCV 简介与安装

OpenCV 简介与安装[TOC] OpenCV 简介OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库。安...

OpenCV 图像基本操作(学习笔记)

OpenCV 图像基本操作(学习笔记)[TOC] 在一张图像中,每取出一个像素块会分成红绿蓝三种颜色通道,每一种颜色通道都是一...

OpenCV 图像处理(学习笔记)

OpenCV 图像处理(学习笔记)[TOC] 灰度图import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pypl...

OpenCV Canny边缘检测(学习笔记)

OpenCV Canny边缘检测(学习笔记)[TOC] Canny边缘检测Canny边缘检测主要是按照如下步骤来进行的边缘检测:1.使用高斯滤波器...

OpenCV 图像金字塔、轮廓与模板匹配(学习笔记)

OpenCV 图像金字塔、轮廓与模板匹配(学习笔记)[TOC] 图像金字塔初始化代码。import cv2 #opencv读取的格式是BGR import n...

OpenCV 直方图与傅里叶变换(学习笔记)

OpenCV 直方图与傅里叶变换(学习笔记)[TOC] 直方图直方图是一种统计图表,用于展示数据的分布情况。这里将展示图片中直方...
这一世以无限游戏为使命!
排名
2
文章
642
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术