sobel

sobel算子原理与实现

拜拜、爱过 提交于 2019-11-29 18:37:59
一、原理: 首先介绍背景知识: 1)边缘:灰度或结构等信息的突变处,边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。 2)边缘点:图像中具有坐标[x,y],且处在强度显著变化的位置上的点。 3)边缘段:对应于边缘点坐标[x,y]及其方位 ,边缘的方位可能是梯度角。 索贝尔算子(Sobeloperator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。 为了节省时间,我就直接截图了,原理都这样。 套用公式就如下, Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。 如果求整体x和y方向的So被浏览梯度,只需要将Gx和Gy想家即可。 二、C++代码实现 我查过很多资料,都没有发现这个Sobel在C++上到底 是怎么实现的,以为就是没有代码,思索良久,在同学的提示下,终于写出来了,不过可能有不少瑕疵。 #include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main() { Mat m

openCV中sobel边缘检测

偶尔善良 提交于 2019-11-28 07:42:56
sobel算子是一个单边缘检测算子,具有方向性。将两个方向叠加后的检测代码如下 void SobelEnhance(const Mat src, Mat& dst) { Mat sobelx(src.size(), CV_16SC1);///边缘检测后,会有负值,也会有大于255的值,因此类型设为CV_16SC1有符号类型 Mat sobely(src.size(), CV_16SC1); Mat img_edgeFiltex(src.size(), CV_8UC1);///结果图,类型设为CV_8UC1进行阈值截断 Mat img_edgeFiltey(src.size(), CV_8UC1); Sobel(src, sobelx, CV_16SC1, 1, 0, 3); convertScaleAbs(sobelx, img_edgeFiltex); Sobel(src, sobely, CV_16SC1, 0, 1, 3); convertScaleAbs(sobely, img_edgeFiltey); ///像素加权 addWeighted(img_edgeFiltex, 1, img_edgeFiltey, 1, 0, dst); } void convertScaleAbs(InputArray src, OutputArray dst, double alpha =

图像卷积及其滤波

两盒软妹~` 提交于 2019-11-28 01:34:56
图像的卷积 ,可以理解为kernel和像素点pixel之间的运算。 把kernel旋转180度(图像是反过来的),使其中心压在图片的第一个像素点,然后每个点和kernel对应的数值相乘,然后把各个值累加得到一个新的值,取代kernel中心压着的像素值。在进行这个运算时,需要copy一下原图或者创建一个size一样的图片,不能直接在原图上修改。 例: 注意: 在图片的某一像素点周围没有足够的值时,比如左上角,忽略最外边的一圈像素或者给边缘插值,然后计算再把边缘扔掉。 New value取值为0-255,小于0认为是0,大于255认为是255。 kernel一般取奇数矩阵 图像边缘提取 图像边缘来源于不同颜色、纹理、光照、表面。 Step edge(阶跃函数) 一阶导数 一个峰值 Ramp edge(缓慢上升) 二阶导数 两个峰值 Peak edge(矩形信号) 一阶导数 一个峰值 图像的导数可以用梯度来表示,但是计算梯度比较麻烦而且效率略低。计算导数需要用到剑减法来求变化率,这就衍生出一些算子,类似于通过分配权重的方式计算梯度。 Sobel 算子其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值,Sobel算子是典型的基于一阶导数的边缘检测算子,由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响

OpenCV学习笔记3

拥有回忆 提交于 2019-11-28 01:08:48
OpenCV学习笔记3 图像平滑(低通滤波) 使用低通滤波器可以达到图像模糊的目的。这对与去除噪音很有帮助。其实就是去除图像中的高频成分(比如:噪音,边界)。所以边界也会被模糊一点。(当然,也有一些模糊技术不会模糊掉边界)。OpenCV 提供了四种模糊技术。 2D 卷积 对 2D 图像实施低通滤波(LPF:low pass filter),高通滤波(HPF:high pass filter)等。LPF 帮助我们 去除噪音,模糊图像 。HPF 帮助我们找到图像的边缘OpenCV 提供的函数 cv.filter2D() 可以让我们对一幅图像进行卷积操作。下面我们将对一幅图像使用平均滤波器。下面是一个 5x5 的平均滤波器核: 操作如下:将核放在图像的一个像素 A 上,求与核对应的图像上 25(5x5)个像素的和,在取平均数,用这个平均数替代像素 A 的值。重复以上操作直到将图像的每一个像素值都更新一边。代码如下,运行一下吧。 import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('../opencv_logo.jpg') kernel = np.ones((5,5),np.float32)/25 dst = cv2.filter2D(img,-1,kernel) plt

霍夫变换

。_饼干妹妹 提交于 2019-11-27 22:03:40
目录 霍夫线变换   标准霍夫变换SHT   多尺度霍夫变换MSHT   累计概率霍夫变换PPHT 霍夫圆变换   霍夫梯度法   霍夫梯度法缺点 霍夫直线变换 一条直线在图像二维空间可以由两个变量表示。 笛卡尔坐标系:可有参数斜率和截距表示; 极坐标系:可由(r,θ)极径和极角表示; 对于霍夫变换,我们用极坐标系来表示直线: 通过点(x 0 ,y 0 )的一族直线统一定义为: 即每一对(r θ ,θ)代表一条通过(x 0 ,y 0 )的直线。 对于一个定点(x 0 ,y 0 ),绘制出(r θ ,θ)曲线,例: 只绘出满足r>0,0<θ<2π 每个点都绘制图这样一条曲线,如果两个不同的点的曲线相交,就意味着它们通过同一条直线。 越多的曲线相交于一点,意味着这个交点表示的直线由更多的点组成。一般设置直线上点的阈值来定义多少条曲线交于一点,这样才认为检测到了一条直线。 霍夫圆变换 对于直线来说,一条直线能够由极径极角(r,θ)表示,而对于圆来说,需要三个参数表示一个圆: 霍夫梯度法 1、先对图像进行边缘检测; 2、对边缘图像中的每个非零点,考虑其局部梯度,就是用sobel函数计算x和y方向的sobel一阶导数得到梯度; 3、由斜率指定一条直线,将直线上的每个点都累加起来。这里的斜率是从一个指定的最小值到指定的最大值的距离; 4、标记边缘图像中每一个非0像素的位置; 5

Sobel filter kernel of large size

假如想象 提交于 2019-11-27 17:59:05
I am using a sobel filter of size 3x3 to calculate the image derivative. Looking at some articles on the internet, it seems that kernels for sobel filter for size 5x5 and 7x7 are also common, but I am not able to find their kernel values. Could someone please let me know the kernel values for sobel filter of size 5x5 and 7x7? Also, if someone could share a method to generate the kernel values, that will be much useful. Thanks in advance. UPDATE 23-Apr-2018: it seems that the kernels defined in the link below are not true Sobel kernels (for 5x5 and above) - they may do a reasonable job of edge

Sobel derivative in OpenCV

馋奶兔 提交于 2019-11-27 05:39:58
I have been tasked with making my own Sobel method, and not use the cv::Sobel found in OpenCV. I tried implementing one I found at Programming techniques When I run the program, cv::Mat throws an error, however. Anyone have any idea why? Sobel method: int sobelCorrelation(Mat InputArray, int x, int y, String xory) { if (xory == "x") { return InputArray.at<uchar>(y - 1, x - 1) + 2 * InputArray.at<uchar>(y, x - 1) + InputArray.at<uchar>(y + 1, x - 1) - InputArray.at<uchar>(y - 1, x + 1) - 2 * InputArray.at<uchar>(y, x + 1) - InputArray.at<uchar>(y + 1, x + 1); } else if (xory == "y") { return

Sobel filter kernel of large size

安稳与你 提交于 2019-11-27 04:13:28
问题 I am using a sobel filter of size 3x3 to calculate the image derivative. Looking at some articles on the internet, it seems that kernels for sobel filter for size 5x5 and 7x7 are also common, but I am not able to find their kernel values. Could someone please let me know the kernel values for sobel filter of size 5x5 and 7x7? Also, if someone could share a method to generate the kernel values, that will be much useful. Thanks in advance. 回答1: UPDATE 23-Apr-2018: it seems that the kernels

Sobel derivative in OpenCV

二次信任 提交于 2019-11-26 11:40:02
问题 I have been tasked with making my own Sobel method, and not use the cv::Sobel found in OpenCV. I tried implementing one I found at Programming techniques When I run the program, cv::Mat throws an error, however. Anyone have any idea why? Sobel method: int sobelCorrelation(Mat InputArray, int x, int y, String xory) { if (xory == \"x\") { return InputArray.at<uchar>(y - 1, x - 1) + 2 * InputArray.at<uchar>(y, x - 1) + InputArray.at<uchar>(y + 1, x - 1) - InputArray.at<uchar>(y - 1, x + 1) - 2 *