图像梯度直观反应其实就是图像当中各物体的轮廓,而在像素点上的体现其实就是相邻像素点之间的差值,差值越大,轮廓就会越清晰(可用于图像增强),而Opencv提供了以下三种算子来进行图像的梯度处理,跟在之前的博客中提到的cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)函数其实很类似,都能够得到图像的轮廓。而Opencv也提供了以下三种算子来进行图像的梯度处理。

sobel算子

先看到Gx,这里的算子其实很像是卷积核,而靠近中间的像素乘以+2和-2,稍远的四个角则乘以+1和-1是为了实现类似加权的效果,这一点跟上篇博客的高斯滤波很像,都是进行加权,而如果这个范围内的像素点值都是一样的,那么两边相加完之后其实就是0,中间的像素点会是一个黑点,而一片像素点值接近甚至相等的区域,经过计算之后会是一片黑色的区域,则表示图像在这个位置没有梯度,这也符合我们宏观上说的没有轮廓。相反如果图像在该位置像素值大小差异明显,则经过计算所得到的中间点会是一个接近于白色的点,如果有一整行的话,那么它就是一条l轮廓线。而Gx这个卷积核的设定只能够计算水平横轴上的差值,而竖直方向上因为都是0,所以竖直方向上的梯度会被忽略,我们还需要Gy来计算竖直方向上的梯度。

注意:由于在进行梯度计算的过程中会出现负值,而Opencv没有读取负值像素这一说,因此如果出现负数,Opencv会直接进行截断操作,将它们默认为0,因此我们还需要将处理之后的图像像素值转化为绝对值。函数如下

sobely = cv2.convertScaleAbs(sobely):在括号内写入要进行绝对值转化的图片即可。

相关函数

sobelx = cv2.Sobel(test1,cv2.CV_64F,0,1,ksize = 3):test是传入的要进行处理的图像,cv2.CV_64F是一种保存数值的类型,能够保存负数,0表示先不计算水平方向的梯度,1表示计算竖直方向的梯度,当然,我们也可以将参数改为1,1以同时计算竖直方向和水平方向的梯度,但是分开计算再融合图片所得到的效果要更好一些,这里的ksize表示卷积核的范围大小。

代码实例

import cv2
import numpy as np
import matplotlib.pyplot as plt
def cv2_imshow(name,img):#定义展示图像的函数cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()
pie = cv2.imread("pie.png")#读入pie图像
cv2.imshow("pie",pie)#展示读入的图像
cv2.waitKey(0)
cv2.destroyAllWindows()
sobelx = cv2.Sobel(pie,cv2.CV_64F,1,0,ksize = 3)#只计算横轴
cv2_imshow("sobelx",sobelx)
sobelx = cv2.convertScaleAbs(sobelx)#取绝对值
cv2_imshow("sobelx",sobelx)#展示图像
sobely = cv2.Sobel(pie,cv2.CV_64F,0,1,ksize = 3)#只计算竖轴
sobely = cv2.convertScaleAbs(sobely)#取绝对值
cv2_imshow("sobely",sobely)#展示图像
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)#融合两张图像
cv2_imshow("sobelxy",sobelxy)#展示融合后的图像
sobelxy = cv2.Sobel(pie,cv2.CV_64F,1,1,ksize = 3)#同时计算横轴和竖轴
sobelxy = cv2.convertScaleAbs(sobelxy)#转化为绝对值
cv2_imshow("sobelxy",sobelxy)#展示图像
test1 = cv2.imread("test1.png")#读入彩色图像
cv2_imshow("test1",test1)#展示原图
sobelx = cv2.Sobel(test1,cv2.CV_64F,0,1,ksize = 3)#梯度处理彩色图像,只处理水平方向
sobelx = cv2.convertScaleAbs(sobelx)#转化为绝对值
cv2_imshow("sobelx",sobelx)#显示图像
sobely = cv2.Sobel(test1,cv2.CV_64F,1,0,ksize = 3)#梯度处理彩色图像,只处理竖直方向
sobely = cv2.convertScaleAbs(sobely)#转化为绝对值
cv2_imshow("sobely",sobely)#显示图像
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)#将两者图片融合
cv2_imshow("sobelxy",sobelxy)#显示融合后的图像
All = np.hstack((sobelx,sobely,sobelxy))#拼接三幅彩色图像进行对比

运行结果

原图

只处理横轴得到的图像,可以看到在圆的顶部和底部出现了缺口,这是由于只计算了水平方向的梯度,因此对于竖直方向上的梯度将会被 抵消忽略掉。

只处理竖轴得到的图像,跟上图相反,这是左右两边出现了缺口,这是由于值处理了竖轴方向上的梯度造成的。

将两张图像融合后即可得到圆的完整轮廓(即完整梯度)如下图

 但如果同时处理横轴和竖轴后展示图像,效果会比单独处理要差,如下图

 当然,我们也可以处理彩色的图像,读入的原图如下(上面有一些噪音点,后面有用)

进行水平方向的梯度处理后得到下图,我们可以清楚的看到她的轮廓,但是我们对比原图可以看到,她竖轴方向上的梯度并没有被体现出来,比如图片右边的竖直的头发就不见了,还有鼻子也不明显(对比下一张图可能会更清楚一些)。

进行竖直方向的梯度计算后得到下图(可以跟上图对比,看看都有啥区别)

融合得到最终轮廓

三张图像的横向对比 

 scharr算子

scharr算子sobel算子 原理相同,用法也相同,只是scharr算子对梯度更为敏感,原因是在卷积核中,它将乘数扩大到了10和3,相当于将梯度扩大了10被和3倍,这样所得到的梯度图像将会更加的细致。

相关函数

scharrx = cv2.Scharr(test1_gray,cv2.CV_64F,0,1):只改变了函数名,函数用法和参数作用与sobel算子一样

代码示例

import cv2
import numpy as np
import matplotlib.pyplot as plt
test1_gray = cv2.imread("test1.png",cv2.IMREAD_GRAYSCALE)#读入灰度图像
scharrx = cv2.Scharr(test1_gray,cv2.CV_64F,0,1)#scharr算子梯度处理灰度图像,只处理水平方向
scharry = cv2.Scharr(test1_gray,cv2.CV_64F,1,0)#scharr算子梯度处理灰度图像,只处理竖直方向
scharrx= cv2.convertScaleAbs(scharrx)#将像素值转化为绝对值
scharry = cv2.convertScaleAbs(scharry)#将像素值转化为绝对值
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)#融合图像

运行效果

可以看到,使用scharr算子得到深度图像明显比使用sobel算子得到的要更加细致。

laplacian算子

laplacian算子是一个二阶算子,它可以直接计算出图像的边界,但缺点是对噪音点敏感,一般不会单独使用,需要配合其他函数处理图像。

相关函数

laplacian = cv2.Laplacian(test1_gray,cv2.CV_64F):传如要进行处理的图像和数据保存类型即可。

代码示例

import cv2
import numpy as np
import matplotlib.pyplot as plt
def cv2_imshow(name,img):#定义展示图像的函数cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()
test1_gray = cv2.imread("test1.png",cv2.IMREAD_GRAYSCALE)#读入灰度图像
#laplacian算子处理梯度图像,对梯度变化速率更敏感,类似于二阶导
laplacian = cv2.Laplacian(test1_gray,cv2.CV_64F)#laplacian算子梯度处理灰度图像
laplacian = cv2.convertScaleAbs(laplacian)#将像素值转化为绝对值
cv2_imshow("laplacian",laplacian)#显示处理后的图像

运行效果

可以看到,用laplacian算子得到的图像受噪音点影响更大 

以下是三种算子处理的对比图

从左至右依次为:sobel算子,scharr算子,laplacian算子

基于Python的Opencv图像梯度处理相关推荐

  1. 基于python的opencv图像形态学处理(图像腐蚀与膨胀操作以及礼帽与黑帽)

    腐蚀与膨胀 图像的腐蚀与膨胀互为逆向操作,通常用于处理二值图像(黑白图,以黑色为底面背景),因此需要先进行二值化处理,腐蚀和膨胀通俗的理解就是,在指定大小的卷积核内,如果该卷积核内全为黑色或全为白色, ...

  2. OpenCV——图像梯度与边缘检测(python实现)

    OpenCV--图像梯度与边缘检测 6.1 简介 严格的说,梯度计算需要求导数.但是图像梯度的计算,是通过计算像素值的差得到梯度的近似值.图像梯度表示的是图像变化的速度,反映了图像的边缘信息. 边缘是 ...

  3. 基于Python的OpenCV+TensorFlow+Keras人脸识别实现

    前言:本节要讲的人脸识别主要是借鉴了 一位研究生前辈的文章 我只是在他的基础上进行了改动,让代码能在现在的TensorFlow2.X 等的环境下运行 先看一下效果图 完整工程及源代码请点击链接下载:人 ...

  4. 基于python的图像处理的毕业论文_个人毕业设计基于python开发的图像论文34646.doc...

    word文档可自由复制编辑 本科生毕业论文(设计) 题目:基于python开发的图像 采集器之Airppt 学 部 学科门类 专 业 基于python开发的图像采集器之Airppt 摘 要 装订 装 ...

  5. 基于Python通过OpenCV实现的口罩识别系统理论篇

    基于Python通过OpenCV实现的口罩识别系统理论设计篇 一.项目实现环境 基于Python 3.8.1版本 opencv-python 4.2.0.34版本 需要自己下载OpenCV的库文件,添 ...

  6. cv2 python 获取斑马线_基于python的opencv图像处理实现对斑马线的检测示例

    基本思路 斑马线检测通过opencv图像处理来进行灰度值转换.高斯滤波去噪.阈值处理.腐蚀和膨胀后对图像进行轮廓检测,通过判断车辆和行人的位置,以及他们之间的距离信息,当车速到超过一定阈值时并且与行人 ...

  7. OpenCV图像梯度(Sobel和Scharr)

    OpenCV图像梯度(Sobel和Scharr) 1 图像梯度是什么? 2 图像梯度的用途 3 图像梯度的使用 参考 这篇博客将介绍图像渐变以及如何使用OpenCV的cv2.Sobel计算Sobel渐 ...

  8. Python,OpenCV图像金字塔cv2.pyrUp(), cv2.pyrDown()

    Python,OpenCV图像金字塔cv2.pyrUp, cv2.pyrDown 1. 效果图 2. 原理 2.1 什么是图像金字塔 2.2 金字塔分类 2.3 应用 3. 源码 参考 这篇博客将介绍 ...

  9. python使用openCV图像加载(转化为灰度图像)、Canny边缘检测器检测图像的边缘(Detect Edges)

    python使用openCV图像加载(转化为灰度图像).Canny边缘检测器检测图像的边缘(Detect Edges) 目录

最新文章

  1. java 小对话框_创建Java对话框
  2. spring_通过Spring Boot了解H2 InMemory数据库
  3. vs2010下使用dmp文件和pdb文件调试时dump、exe和pdb三个文件要保持版本一致的原因
  4. zabbix_appliace 3.4安装部署
  5. (CF#257)B. Jzzhu and Sequences
  6. 2015蓝桥杯C++A:手链样式(圆排列和环排列)
  7. 【渝粤教育】电大中专成本会计作业 题库
  8. JS中时间格式化常用方法
  9. Python部分输出
  10. 西门子S7-300 PLC视频教程(百度网盘)收集于网络-供参考学习
  11. 工商银行计算机社招笔试题,2019中国工商银行招聘面试试题及答案(一)
  12. matlab导入数据后画图_利用三维坐标matlab创建三维曲面
  13. 【Redis学习笔记】redis-trib.rb命令详解
  14. 手把手 VM虚拟机安装deepin系统
  15. effective python pdf下载-《Effective Python》电子书pdf下载百度网盘
  16. 连接MyBatis内部SqlSession与业务接口的代理类MapperProxy
  17. Java中巧算年龄的代码,巧算年龄 - 寂寞暴走伤的个人空间 - OSCHINA - 中文开源技术交流社区...
  18. cisco配置和ios备份
  19. java crm 进销存 websocket即时聊天发图片文字 好友群组 SSM源码
  20. Linux第二课 文件系统目录结构

热门文章

  1. 无盘工作站的日常维护
  2. 船模、富斯遥控器、电调联调心得记录
  3. 服务器放在机柜_服务器机柜安装步骤 服务器机柜安装注意事项
  4. 2023 号码归属地查询API接口PHP源码
  5. 2008中国软件技术英雄会上海站流水帐
  6. php 生成 rtf,php 实现html转为rtf格式_PHP教程
  7. PPTV去广告(XP测试通过)
  8. glade工具安装及入门
  9. Mac上编译Linux内核时找不到ncurses
  10. Java Web笔记-by戏言