边缘检测

Opencv和C++实现canny边缘检测

匿名 (未验证) 提交于 2019-12-03 00:30:01
Canny边缘检测主要包括: 图像的灰度化; 图像的高斯滤波; 计算出每一个像素点位置的梯度(X方向梯度、Y方向梯度、已经该点的梯度幅值)和方向角度; 局部非极大值抑制处理; 双阈值处理和连接处理; Canny算法思路参考下面的博客: https://blog.csdn.net/dcrmg/article/details/52344902 https://www.cnblogs.com/love6tao/p/5152020.html 我在下面直接给出可以运行的C++代码(Opencv2.4.9) #include <iostream> #include "opencv2/opencv.hpp" using namespace std ; using namespace cv; /* 生成高斯卷积核 kernel */ void Gaussian_kernel( int kernel_size, int sigma, Mat &kernel) { const double PI = 3.1415926 ; int m = kernel_size / 2 ; kernel = Mat(kernel_size, kernel_size, CV_32FC1); float s = 2 * sigma*sigma; for ( int i = 0 ; i < kernel_size; i++

opencv边缘检测

匿名 (未验证) 提交于 2019-12-03 00:12:02
比如有一幅图,图里面有一条线,左边很亮,右边很暗,那人眼就很容易识别这条线作为边缘.也就是 像素的灰度值快速变化的地方 . 对于f(t),其导数f'(t)反映了每一处的变化趋势.在变化最快的位置其导数最大. sobel算子的思路就是模拟求一阶导数. sobel算子是一个离散差分算子.它计算图像像素点亮度值的近似梯度. 图像是二维的,即沿着宽度/高度两个方向. 我们使用两个卷积核对原图像进行处理: 水平方向 很好理解,原始像素灰度值-->(右边像素值-左边像素值),反映了水平方向的变化情况. 垂直方向 这样的话,我们就得到了两个新的矩阵,分别反映了每一点像素在水平方向上的亮度变化情况和在垂直方向上的亮度变换情况. 综合考虑这两个方向的变化 ,我们使用 反映某个像素的梯度变化情况. 有时候为了简单起见,也直接用绝对值相加替代. opencv里可以使用了如下的卷积核,可以"放大像素的变化情况". 可以参考这个函数 Scharr import cv2 as cv def test(): src = cv.imread("/home/sc/disk/keepgoing/opencv_test/sidetest.jpeg") src = cv.GaussianBlur(src, (3, 3), 0) gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) grad

【数字图像处理】边缘检测与图像分割

匿名 (未验证) 提交于 2019-12-03 00:05:01
原文链接: 边缘检测与图像分割 作者: HUSTLX 1图像分割原理 图像分割的研究多年来一直受到人们的高度重视,至今提出了各种类型的分割算法。Pal把图像分割算法分成了6类:阈值分割,像素分割、深度图像分割、彩色图像分割,边缘检测和基于模糊集的方法。但是,该方法中,各个类别的内容是有重叠的。为了涵盖不断涌现的新方法,有的研究者将图像分割算法分为以下六类:并行边界分割技术、串行边界分割技术、并行区域分割技术、串行区域分割技术、结合特定理论工具的分割技术和特殊图像分割技术。而在较近的一篇综述中,更有学者将图像分割简单的分割数据驱动的分割和模型驱动的分割两类。下面将图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法、基于数学形态的分割方法以及基于特定理论的分割方法等,对其中主要的分别进行简要介绍。 1.1灰度阈值分割法 是一种最常用的并行区域技术,它是图像分割中应用数量最多的一类。阈值分割方法实际上是输入图像f到输出图像g的如下变换: 其中,T为阈值,对于物体的图像元素g(i,j)=l,对于背景的图像元素g(i,j)=0。 由此可见,阈值分割算法的关键是确定阈值,如果能确定一个合适的阈值就可准确地将图像分割开来。如果阈值选取过高,则过多的目标区域将被划分为背景,相反如果阈值选取过低,则过多的背景将被划分到目标区 [7] 。阈值确定后

opencv学习笔记4 边缘检测

匿名 (未验证) 提交于 2019-12-03 00:03:02
一。边缘检测的一般步骤 1.滤波 2.增强 3.检测 二。canny void Canny(InputArray image,OutputArray edges, double threshold1, double threshold2, int apertureSize= 3, bool L2gradient= false ) 1 Mat src = imread ( "E:/test.jpg" ); 2 Mat blur , gray , edge ; 3 Mat dst ( src . rows , src . cols , src . type ()); 4 cvtColor ( src , gray , CV_BGR2GRAY ); //转换为灰度图 5 GaussianBlur ( gray , blur , Size ( 3 , 3 ), 0 , 0 ); //降噪 6 Canny ( blur , edge , 200 , 100 ); //边缘检测 7 dst = Scalar :: all ( 0 ); 8 src . copyTo ( dst , edge ); //edge作掩码将src拷贝到dst 9 imshow ( "src" , src ); 10 imshow ( "canny detect" , dst ); 11 waitKey (); 12

边缘检测

放肆的年华 提交于 2019-12-02 05:56:41
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/Mind_programmonkey/article/details/99476665 Canny边缘检测 使用高斯滤波器,以平滑图像,滤除噪声。 计算图像中每个像素点的梯度强度和方向。 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。 通过抑制孤立的弱边缘最终完成边缘检测。 1 高斯滤波器 2 梯度和方向 3 非极大值抑制 4 双阈值检测 import cv2 import matplotlib . pyplot as plt % matplotlib inline import numpy as np def cv_show ( name , img ) : cv2 . imshow ( name , img ) cv2 . waitKey ( 0 ) cv2 . destroyAllWindows ( ) 1 2 3 4 5 6 7 8 9 img = cv2 . imread ( "lena.jpg" , cv2 . IMREAD_GRAYSCALE ) v1 = cv2 . Canny

边缘检测

家住魔仙堡 提交于 2019-12-01 01:23:59
在图像处理和神经网络中经常出现的一个词,卷积核 那到底什么是卷积呢?卷积为什么可以提取特征或者检测边缘呢?我们一步一步慢慢看。 首先,如图, 卷积对于离散的点来说就是两个矩阵对应位置相乘再相加的和; 也就是说卷积只是数学中的一个叫法,并不是什么高深语言; 那为什卷积能够提取特征呢? 先看模板的理解: 一个数学上的二阶导数经过我们的推导最后可以变成一个矩阵的模板; 也就是说其实卷积的提取原理就是相当于我们做一系列的数学变化,将求导,拉普拉斯变换等数学公式来近似变换成我们的卷积的样子;这就是为什么卷积有这么多作用了。 如果还没有理解,可参考我前面讲解的博文,看一遍基本就理解什么是卷积了; 二阶微分算子-拉普拉斯算子 边缘检测-算子推导 边缘检测算子 边缘检测 来源: https://www.cnblogs.com/fcfc940503/p/11645699.html

OpenCV边缘检测

时光毁灭记忆、已成空白 提交于 2019-11-30 12:18:46
Series: OpenCV学习笔记 边缘检测 /* Author:Eajack Date:2017/8/9 Series:OpenCV笔记 Function:OpenCV边缘检测 Key Points: 1、Canny边缘检测步骤:原图转成灰度图 => blur降噪 => Canny边缘检测 => edge作为掩码 Canny(srcImg,edgeImg,double threshlod1,double threshold2) 2、Sobel算子边缘提取步骤: X方向梯度 => X方向梯度 => 整体方向梯度 [x,y] X : Sobel(srcImg,sobel_x,CV_16S,1,0,3,1,1,BORDER_DEFAULT); Y : Sobel(srcImg,sobel_y,CV_16S,0,1,3,1,1,BORDER_DEFAULT); addWeighted(abs_sobel_x,0.5,abs_sobel_y,0.5,0,sobel_dst); */ #include<stdio.h> #include<iostream> #include<vector> #include<opencv2/opencv.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc

Canny边缘检测

拟墨画扇 提交于 2019-11-30 06:07:53
#导入工具包 from imutils import * image = imread('image/school.jpg') show(image) def edge_detection(image,minVal=100,maxVal=200): image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) edges = cv2.Canny(image,minVal,maxVal) plt.imshow(edges,'gray') plt.axis('off') plt.show() edge_detection(image) image = imread('image/license_plate.png') show(image) edge_detection(image) image = imread('image/bricks.png') show(image) edge_detection(image) image = imread('image/coins.jpg') show(image) image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) image = cv2.GaussianBlur(image, (3,3), 0) Value = [(10,150),(100,200),(180

边缘检测

会有一股神秘感。 提交于 2019-11-30 00:56:07
边缘就是图像上不同区域之间的交界处,就是灰度或者颜色变换很大的一系列的点。 在数学上我们判断一个点变换是否剧烈一般通过导数或者微分来判断。因为当斜率接近90度时,导数会趋近于无限大,所以我们一般采用微分的形式。dy/dx,当dx趋向于无限小,dy/dx 就是x在该函数上的导数,所以dy/dx就可以来近似导数。当我们固定dx,比较不同点的变化率时只用比较dy就好了,所以计算整幅图像的微分,dy的大小就是边缘的强弱了,我们也称之为梯度。 1.Prewitt算子 2.sobel算子 和Prewitt一样,Sobel算子也是用周围8个像素来估计中心像素的梯度,但是Sobel算子认为靠近中心像素的点应该给予更高的权重,所以Sobel算子把与中心像素4邻接的像素的权重设置为2或-2。如下图: 3.candy算子 使用高斯滤波器,以平滑图像,滤除噪声。 计算图像中每个像素点的梯度强度和方向(一般使用sobel算子)。 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应(细化边缘)。 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。 通过抑制孤立的弱边缘最终完成边缘检测。 4.Laplacian算子(拉普拉斯算子) 拉普拉斯算子采用的是二阶差分算子计算边缘的,就是对一阶差分再做一次差分。 f ’'(x, y) = -4 f