边缘检测

基于matlab的经典图像边缘检测算法

半世苍凉 提交于 2020-03-25 04:55:17
图像边缘检测算法 (1)Robert算子边缘检测 (2)Sobel算子边缘检测 (3)Prewitt算子边缘检测 (4)LOG算子边缘检测 (5)Canny边缘检测 Matlab的实现。 其实还只是掉包侠,一点算法没有写 争取有空用openCV写一遍 I=imread('1.jpg'); I0=rgb2gray(I); subplot(231); imshow(I); BW1=edge(I0,'Roberts',0.16); subplot(232); imshow(BW1); title('Robert算子边缘检测') BW2=edge(I0,'Sobel',0.16); subplot(233); imshow(BW2); title('Sobel算子边缘检测') BW3=edge(I0,'Prewitt',0.16); subplot(234); imshow(BW3); title('Prewitt算子边缘检测'); BW4=edge(I0,'LOG',0.012); subplot(235); imshow(BW4); title('LOG算子边缘检测') BW5=edge(I0,'Canny',0.2); subplot(236); imshow(BW5); title('Canny算子边缘检测')    来源: https://www.cnblogs.com

opencv-python中Canny算子边缘检测详解

▼魔方 西西 提交于 2020-02-21 17:47:16
Canny算子是一种非常流行的边缘检测算法,在opencv中直接提供给了我们Canny函数,但是我们还是有必要对其原理有一定的了解。 原理 Canny算子包含四步操作: 去噪 首先要去除图像的噪声,边缘检测很容易受到噪声的影响。去噪操作中我们使用的是5*5的高斯滤波器。 计算梯度 在这一步要计算图像的梯度。不但要计算梯度的大小,还要求出梯度的方向。梯度的方向被归为四类:水平,垂直,两条对角线方向。 计算图像梯度的大小和方向的公式如下: 非极大值抑制 经过以上操作得出的边界是非常粗糙且精度低的。我们需要在计算出梯度的大小和方向之后对整幅图像的像素点进行遍历。去除那些不在边界上的点。 对每一个像素点进行检查,看它是否是周围同方向梯度的点中梯度最大的。如果是最大的,就保留,如果不是,就抑制(归0) 如图,黄色点被保留,白色点被抑制。 滞后阈值 这是确定点是否在边界上的最后一关。我们设置两个阈值(maxVal,minVal) 凡是梯度大于maxVal的点我么就认为这个点处在边界上,保留 梯度值大于minVal小于maxVal的点,如果这个点与某个确定为边界的点相连,保留;否则就抛弃 梯度值小于minVal的点,全部抛弃 经过这四步操作,我们就可以得到所想要的真正边界。 函数 OpenCV中提供给我们现成的函数: cv2 . Canny ( sec , minVal , maxVal )

Canny边缘检测

↘锁芯ラ 提交于 2020-02-07 14:38:59
步骤 :噪声去除,计算图像梯度,非极大值抑制, 滞后阈值 cv2.Canny()可以完成以上几步。 import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('messi5.jpg',0) edges = cv2.Canny(img,100,200) plt.subplot(121),plt.imshow(img,cmap = 'gray') plt.title('Original Image'), plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(edges,cmap = 'gray') plt.title('Edge Image'), plt.xticks([]), plt.yticks([]) plt.show() 来源: https://www.cnblogs.com/h694879357/p/12272609.html

Canny边缘检测

人盡茶涼 提交于 2020-02-07 02:50:29
Canny边缘检测步骤 步骤1:去噪声 步骤2: 计算梯度的方向和幅度 步骤3:非极大值抑制。 步骤4:确定边缘。使用双阈值算法确定最终的边缘信息 例程 import cv2 o = cv2 . imread ( "20.jpeg" , cv2 . IMREAD_GRAYSCALE ) r1 = cv2 . Canny ( o , 150 , 550 ) r2 = cv2 . Canny ( o , 32 , 100 ) cv2 . imshow ( "original" , o ) cv2 . imshow ( "result1" , r1 ) cv2 . imshow ( "result2" , r2 ) cv2 . waitKey ( ) cv2 . destoryAllWindows ( ) 结果: 来源: CSDN 作者: a_eastern 链接: https://blog.csdn.net/a_eastern/article/details/104193639

Halcon编程笔记-(2) 边缘检测-Sobel 算子

。_饼干妹妹 提交于 2020-02-02 04:31:28
边缘检测简介 边缘 就是图像上灰度或者颜色变化很大的一系列连续的点。或者说是图像上不同的区域之间的交界处。 图像中边缘的特点就要从这两方向去分析:方向和幅度。在沿着边缘走向的像素值变化比较平缓;而沿着垂直于边缘的走向,像素值则变化得比较大。 边缘检测方法 我们要研究 边缘检测的方法 ,就要从它的特点入手。是否是边缘可以说是来判断一个点在某个方向上的变化是否剧烈。那么我们怎么用数学的方式去描述这种变化特点呢。在数学上,我们一般使用导数或者微分。 导数 : 这个很简单,就是连续函数上某点斜率,导数越大表示变化率越大,变化率越大的地方就越是“边缘”。但是,但斜率接近90度的时候,他的斜率就无限大了,在计算机计算的时候就很麻烦了,首先占用空间大,然后就是当斜率过大的时候便无法用常用的数据类型表示了。所以我们一般不用导数来表示 微分 : 这个概念需要在大学的时候结束,但也很简单。连续函数上x变化了dx,导致y变化了dy,dy/dx 越大,就可以表示变化率很大了。dx趋向于无限小,dy/dx 就是x在该函数上的导数,所以dy/dx就可以来近似导数,我们成这种方式叫做微分。那这种方式有什么优势呢?当我们固定dx,比较不同点的变化率时只用比较dy就好了,所以计算整幅图像的微分,dy的大小就是边缘的强弱了,我们也称之为梯度。所以我们一般会采用微分的方式。 算子 是一个函数空间到另一个函数空间上的映射

边缘检测之Sobel检测算子

廉价感情. 提交于 2020-02-02 02:21:21
在讨论边缘算子之前,首先给出一些术语的定义: (1)边缘:灰度或结构等信息的突变处,边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。 (2)边缘点:图像中具有坐标[x,y],且处在强度显著变化的位置上的点。 (3)边缘段:对应于边缘点坐标[x,y]及其方位 ,边缘的方位可能是梯度角。 二、Sobel算子的基本原理 Sobel算子是一阶导数的边缘检测算子,在算法实现过程中,通过3×3模板作为核与图像中的每个像素点做卷积和运算 ,然后选取合适的阈值以提取边缘。 一个特殊卷积所实现的功能是由卷积核的形式决定的。这个核本质上是一个大小固定、由数值参数构成的数组,数组的参考点(anchor point)通常位于数组的中心。数组的大小成为核支撑。单就技术而言,核支撑实际上仅仅由核数组的非0部分组成。对图像的卷积,首先将核的参考点定位到图像的第一个像素点,核的其余元素覆盖图像中其相对应的局部像素点。对于每一个核点,我们可以得到这个点的核值以及图像中相应图像点的值,将这些值相乘并求和,并将这个结果放在与输入图像参考点所相对应的位置。通过在整个图像上扫描卷积核,对图像的每个点重复此操作。 索贝尔算子 (Sobel operator)主要用作边缘检测,在技术上,它是一阶离散性差分算子,用来运算图像亮度函数的灰度值近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量

【于燕飞韩丽丽】边缘检测代码

与世无争的帅哥 提交于 2020-02-02 00:10:19
im=imread('C:\Documents and Settings\Administrator\桌面\2.jpg'); Subplot(231);imshow(im);title(' 原始图像 '); ii=rgb2gray(im); %ii=im2double(ii); Subplot(232);imshow(ii);title(' 灰度图像 '); hsv=rgb2hsv(im); h=hsv(:,:,1); s=hsv(:,:,2); v=hsv(:,:,3); %figure;imshow(h);title('h'); %figure;imshow(s);%title('s'); Subplot(233);imshow(v);title('强度v'); v=imnoise(v,'salt & pepper',0.1); Subplot(234),imshow(v);title('椒盐噪声'); v=~im2bw(v,0.75); % 转为二值图像并取反 Subplot(235),imshow(v);title('二值取反'); % 图像增强 [h,w]=size(v); n=3; f=double(v); a=ones(n,n); y=f; for i=1:h-n+1 for j=1:w-n+1 a=f(i:i+(n-1),j:j+(n-1)); s=sum(sum

dog 高斯差分边缘检测

萝らか妹 提交于 2020-01-29 08:53:07
Applies two Gaussian blurs to the drawable, and subtracts the results. This is robust and widely used method for detecting edges. cv::Mat input;// source image cv::Mat edge;// output image cv::Mat blur1; cv::Mat blur2; int r1 = 1; // 奇数 int r2 = 49;// 奇数 float s1 =sqrt (-(r1 * r1) / (2 * log (1.0 / 255.0))) ; float s2 =sqrt (-(r2 * r2) / (2 * log (1.0 / 255.0))) ; // 两个不同半径的高斯滤波 cv::GaussianBlur(input, blur1, cv::Size(r1,r1),s1); cv::GaussianBlur(input, blur2, cv::Size(r2,r2),s2); //作差 cv::subtract(blur1,blur2,edge); //反色 cv::bitwise_not(edge,edge); Gimp 插件高斯差分边缘检测 源码: https://github.com

基于sobel算子的边缘检测 (python实现)

巧了我就是萌 提交于 2020-01-28 05:17:09
算子 (Operator)   在图像处理中,边缘检测是不可分割的一个组成部分,而算子,可以看作是边缘检测的一个媒介。像我们这种学EE的,算子就好比是一个巴特沃夫滤波器,滤掉我们不想要的,留下我们所需要的;又像是我们小时候看到的筛米的米筛子,那时候家里吃的米掺杂着许多“奇怪的”东西,小石砾、麦穗等等,不像现在买来的大米都是机器为我们筛好的,基本是很少能在吃米饭时牙齿突然咔嚓一下,当时确是蛮痛苦的。   在本篇文章中用的是Sobel算子,是使用两个与原始图像卷积的 3×3内核 来计算导数的近似值-一个用于水平变化,一个用于垂直变化。   如果我们将 A 定义为源图像,并且 G x G_x G x ​ 和 G y G_y G y ​ 是两个图像,每个点分别包含垂直和水平导数近似值,则计算如下: G x = [ − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ] ∗ A G y = [ − 1 − 2 − 1 0 0 0 + 1 + 2 + 1 ] ∗ A G_x =\begin{bmatrix} -1 & 0 & +1\\ -2 & 0 & +2\\ -1 & 0 & +1\\ \end{bmatrix} * A\quad\quad\quad G_y = \begin{bmatrix} -1 & -2 & -1\\ 0 & 0 & 0\\ +1 & +2 & +1\\

canny边缘检测 C++手动实现

空扰寡人 提交于 2020-01-16 15:59:58
实现步骤: (1)高斯模糊 (2)边缘梯度 (3)综合梯度 (4)依据梯度方向做非极大值抑制 (5)使用上下阈值检测边缘 (6)连接边缘 canny.cpp#include "iostream" #include "opencv2/opencv.hpp" #include "imgproc.h" #include "characterproc.h" using namespace cv; using namespace std; int main() { //1,读取图像 String img_path = "/home/whf/PycharmProjects/Tool/data/motion_data/trafficcone_src/10.jpg"; Mat img_src = imread(img_path); Mat img_gray = Mat(img_src.rows,img_src.cols,CV_8UC1,Scalar(0)); //1.1 灰度变换 img_gray = rgb2gray(img_src,"eyeperception"); //2,高斯模糊 Mat img_gauss = gaussproc(img_gray); //3,求梯度 Mat xy_grad = Mat(img_src.rows,img_src.cols,CV_8UC1,Scalar(0)