11-图像梯度-Sobel算子

在这里插入图片描述
图像梯度是指图像某像素在x和y两个方向上的变化率(与相邻像素比较),是一个二维向量,由2个分量组成,X轴的变化、Y轴的变化 。
其中X轴的变化是指当前像素右侧(X加1)的像素值减去当前像素左侧(X减1)的像素值。
同理,Y轴的变化是当前像素下方(Y加1)的像素值减去当前像素上方(Y减1)的像素值。

其实Sobel算子求梯度也是分为x轴方向和y轴方向,说白了就是将一个卷积核进行上下左右划分,x轴方向上就是右➖左,y轴方向上就是下➖上

cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)
第一个参数:当前的图像对象名称
第二个参数:当前图像的深度,通常情况下指定为-1,表示输出和输入的深度是一样的;cv2.CV_64F可以存6字节的大小,为了方便后面的取绝对值操作
第三个参数:是否算X轴的水平方向,若为1表示计算X轴方向,若为0表示不计算X轴方向
第四个参数:是否算Y轴的竖直方向,若为1表示计算Y轴方向,若为0表示不计算Y轴方向
第五个参数:ksize指定的卷积核是多大的,通常情况下都是奇数大小,例如:3×3的卷积核

import cv2
import numpy as npdef show_photo(name,picture):cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()#原图:
img = cv2.imread('E:\Jupyter_workspace\study\data/pie.png',cv2.IMREAD_GRAYSCALE)
show_photo('img',img)#x轴方向
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)#这里的CV_64F可以存储的位数很多,以便于后续的取绝对值操作
show_photo('sobelx',sobelx)
#由于右减左,下减上原则
#原图左部分,右为圈内白色左为圈外黑色,白-黑结果为正,显示
#原图右部分,右为圈外黑色左为圈内白色,黑-白结果为负,不显示#y轴方向
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize = 3)#这里的CV_64F可以存储的位数很多,以便于后续的取绝对值操作
show_photo('sobely',sobely)
#由于右减左,下减上原则
#原图下部分,下为圈内白色上为圈外黑色,白-黑结果为正,显示
#原图上部分,下为圈外黑色上为圈内白色,黑-白结果为负,不显示

原图:
在这里插入图片描述

白到黑是正数,黑到白是负数,所有的负数都被截断为0(显示黑色),也就是只显示一半的轮廓

x轴方向取梯度:
在这里插入图片描述
y轴方向取梯度:
在这里插入图片描述

故此时需要进行绝对值操作,为了将两边的轮廓都显示出来
import cv2
import numpy as npdef show_photo(name,picture):#显示图像函数cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()#原图:
img = cv2.imread('E:\Jupyter_workspace\study\data/pie.png',cv2.IMREAD_GRAYSCALE)
show_photo('img',img)#x轴方向,取绝对值
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)
sobelx = cv2.convertScaleAbs(sobelx)#取绝对值
show_photo('sobelx',sobelx)#y轴方向,取绝对值
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize = 3)
sobely = cv2.convertScaleAbs(sobely)#取绝对值
show_photo('sobely',sobely)#分别计算x和y,再求和
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)#进行加权后相加,最好一个参数表示偏移量,一般默认为0
show_photo('sobelxy',sobelxy)#### 不建议直接计算,最后的效果并不是特别好
#### 需要求梯度的时候分别计算然后求和效果会好些
sobelxy = cv2.Sobel(img,cv2.CV_64F,1,1,ksize = 3)
sobelxy = cv2.convertScaleAbs(sobelxy)
show_photo('sobelxy',sobelxy)

原图:
在这里插入图片描述
x轴方向,取绝对值:
在这里插入图片描述
y轴方向,取绝对值:
在这里插入图片描述
分别计算x和y,再求和:
在这里插入图片描述
直接计算:
不建议直接计算,最后的效果并不是特别好
需要求梯度的时候分别计算然后求和效果会好些
在这里插入图片描述

换一张照片来进行梯度操作效果更明显

import cv2
import numpy as npdef show_photo(name,picture):#显示图像函数cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/test1.png',cv2.IMREAD_GRAYSCALE)
show_photo('img',img)#显示原图sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)#求X轴方向梯度
sobelx = cv2.convertScaleAbs(sobelx)#取绝对值
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize = 3)#求Y轴方向梯度
sobely = cv2.convertScaleAbs(sobely)#取绝对值
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)#加权相加
show_photo('sobelxy',sobelxy)#显示整体梯度后的效果img = cv2.imread('E:\Jupyter_workspace\study\data/test1.png',cv2.IMREAD_GRAYSCALE)
sobelxy = cv2.Sobel(img,cv2.CV_64F,1,1,ksize = 3)#X轴和Y轴同时求方向梯度
sobelxy = cv2.convertScaleAbs(sobelxy)
show_photo('sobelxy',sobelxy)

原图:
在这里插入图片描述
分别对X轴方向求梯度和Y轴方向求梯度,然后加权求和:
在这里插入图片描述
对X轴方向和Y轴方向同时求梯度:
在这里插入图片描述

总结:对X轴和Y轴分别计算其梯度,然后加权求和效果会好些

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

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

相关文章

给IE有效指定编码

<title>下一站</title> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> IE每次打开&#xff0c;均是一片空白&#xff0c;查看右键&#xff0d;编码&#xff0c;显示是GB2312。要手功改为UTF-8后才能正常显示页面…

形态学操作——击中击不中变换

操作目的 HitMiss变换是形态检测的一个工具&#xff0c;通过定义形状模板可以在图像中获取同一形状物体的位置坐标。 算法讲解 1、用击中结构去腐蚀原始图像得到击中结果X&#xff08;这个过程可以理解为在原始图像中寻找和击中结构完全匹配的模块&#xff0c;匹配上了之后&…

stack.pop()方法_C.示例中的Stack.Pop()方法

stack.pop()方法C&#xff03;Stack.Pop()方法 (C# Stack.Pop() method) Stack.Pop() method is used to remove an object from the top of the stack. The method removes and returns the object from the top. Stack.Pop()方法用于从堆栈顶部删除对象。 该方法从顶部删除并…

java list的作用_集合框架(List集合的特有功能概述和测试)

package cn.itcast_03;import java.util.ArrayList;import java.util.List;/** List集合的特有功能&#xff1a;* A:添加功能* void add(int index,Object element):在指定位置添加元素* B:获取功能* Object get(int index):获取指定位置的元素* C:列表迭代器* ListIterator li…

12-图像梯度-Scharr算子和laplacian算子

Scharr算子 cv2.Scharr(img,cv2.CV_64F,1,0) 第一个参数&#xff1a;当前的图像对象名称 第二个参数&#xff1a;当前图像的深度&#xff0c;通常情况下指定为-1&#xff0c;表示输出和输入的深度是一样的&#xff1b;cv2.CV_64F可以存6字节的大小&#xff0c;为了方便后面的取…

新的一年新希望,百忙中继续学习

公司来了一批新同事&#xff0c;我又忙于购买设备&#xff0c;布置办公桌了。 小林建议我找一份更合适的工作&#xff0c;目前的我其实是在混日子&#xff0c;因为我并不擅长沟通与销售。 暂时还是保持这样吧&#xff0c;我还需要一定时间来积蓄力量。 转载于:https://www.cnbl…

Oracle Internal Event:10200 Consistent Read诊断事件

10200(consistent read buffer status)内部诊断事件可以用于探测一致性读CR(consistent read)块的访问情况&#xff0c;虽然cr读的统计信息可以从v$sysstat或AWR/statspack中获取&#xff0c;但是10200 event还是我们研究Consistent Read一致性读的有力工具。该事件可以通过在会…

多线程循环输出abcc++_C ++循环| 查找输出程序| 套装4

多线程循环输出abccProgram 1: 程序1&#xff1a; #include <iostream>using namespace std;int A 5;int fun(){return A--;}int main(){int A 5;while (fun()) {cout << A ::A << " ";}return 0;}Output: 输出&#xff1a; 9 8 7 6 5Explana…

Opencv——图像金字塔与图像尺寸缩放

主要讲解 1、resize()函数调用 函数定义&#xff1a; 调用方式&#xff1a; resize(srcImage, dstImage, Size(64, 128)); //对图片进行修改 resize(srcImage, dstImage, Size(), 0.5, 0.5);第6个参数的含义&#xff1a; INTER_NEAREST:最邻近插值 (放大好用) INTER_ARE…

java nature_Java中BufferedReader和scanner的对比 - nature

原地址&#xff1a;http://blog.sina.com.cn/s/blog_5fd837410100rtwk.html Scanner 和BufferedReader同样能实现将键盘输入的数据送入程序&#xff0c; import java.io.*; import java.util.Scanner; public class C { public static void main(String []args) throws IOExcep…

13-Canny边缘检测

Canny边缘检测主要思路步骤如下&#xff1a; 1&#xff0c;使用高斯滤波器&#xff0c;以平滑图像&#xff0c;滤除噪声 2&#xff0c;计算图像中每个像素点的梯度强度和方向 3&#xff0c;应用非极大值抑制&#xff0c;以消除边缘检测带来的杂散响应 4&#xff0c;应用双阈值检…

c# uri.host_C#| Uri.IsHexEncoding()方法与示例

c# uri.hostUri.IsHexEncoding()方法 (Uri.IsHexEncoding() Method) Uri.IsHexEncoding() method is a static method or Uri class. Which is used to return that given string is hex-encoded or not? If the given string is hex coded then it returns true otherwise it…

一位老鸟对 23 种设计模式的有趣见解(转)

在网络上流畅很广的一篇旧文&#xff0c;暂时没找到原作者&#xff0c;目前所看到的最早转载时间是 2005 年 2 月 28 日。作者用轻松的语言&#xff0c;形象解释了 23 种模式&#xff0c;有很好的启发作用。创建型模式 1、FACTORY—追MM少不了请吃饭了&#xff0c;麦当劳的鸡翅…

微机原理——移位指令

例题 思路 选择移位语句&#xff0c;右移&#xff0c;将AL移出的送入DX左端&#xff0c;将BL移出的送入DX左端。循环八次 MOV AL,01100101B; MOV BL,11011010B; XOR DX,DX;两个值相同&#xff0c;异或结果为0。等效&#xff1a;MOV DX,0 MOV CX,8;count L1: SHR AL,1;逻辑右…

14-图像金字塔

由第一个图可知&#xff0c;图像金字塔这无非就是对图像进行放大和缩小罢了 1&#xff0c;高斯金字塔 向下采样方法(缩小)&#xff0c;越采样越小&#xff0c;即从金字塔底部向上采样 cv2.pyrDown(img) 向上采样方法(放大)&#xff0c;越采样越大&#xff0c;即从金字塔顶…

JAVA和javascrito_JAVA 和JavaScript的split方法异同

Split的方法很常用&#xff0c;除了str.split("regex")&#xff0c;其实还可以多传一个参数&#xff1a;str.split("regex", limit)。但是要注意&#xff0c;JavaScript和java的split中limit参数作用是不同的。简单说&#xff0c;JavaScript中&#xff0c;…

如果__name__ =='__main__':在Python中怎么办?

In order to understand the details of __name__ variable and the if condition, let us go through a simple exercise. Run a simple python file with just the following lines and run the file as python3 code, 为了了解__name__变量和if条件的详细信息&#xff0c;让…

Eclipse C/C++开发环境搭建

1 Eclipse的安装 到http://java.sun.com/j2se/1.5.0/download.jsp 下载JRE安装&#xff1b; 到http://eclipse.org下载Eclipse安装。&#xff08;这儿可以下载Java版本的&#xff0c;也可以下载C/C 版本的&#xff09; 2 对于下载的Java版本或着只下载Eclipse IDE的&#xff0c…

微机原理——寻址方式总结

一、操作数的寻址方式 立即寻址方式 格式: 操作码 数字表达式&#xff08;将数据送入寄存器中&#xff09; 源操作数可以是8位也可以是16位。 MOV AH, F5H &#xff08;字节操作&#xff09; F5H称为立即数(8位操作数) MOV AL, 8AH &#xff08;字节操作&#xff09; 8AH称为…

15-轮廓检测

边缘是零零散散的&#xff0c;而轮廓是一个整体 cv2.findContours(img,mode,method) img&#xff1a;输入图像对象名称 mode&#xff1a;轮廓检索模式 RETR_EXTERNAL&#xff1a;只检索最外面的轮廓 RETR_LIST&#xff1a;检索所有的轮廓&#xff0c;并将其保存到一条链表当中…