基于Canny边缘检测算子的图像检索算法
基于Canny边缘检测算子的图像检索算法
2Sh o o m u r cec n eh oo , h } b vrt o ehooy Wu a 30 0 C ia . olfC p t i eadTc nl Wu m Ld e i fT cnl , b 4 0 7 ,hn ) c o eS n  ̄. s) g n
Absr ctAi ng a he d f cse itn n t e e g ba e ma e r ti v ls se wh c sma ny d p nd n n t e ta — t a : mi tt e e t x sig i h d e— s d i g ere a y tm i h i i l e e e to h rdi to a nn p r t , w mag ere a ag rt m i g i i n lCa y o e am’a ne i e r t v l lo ih usn mpr v d i o e Ca y d e o e ao s r p s d. e i a e e e nn e g p r tr i p o o e Th m g dg
ZHA0 n — h ng .ZHANG n e a Ho g z o ’ Ya — h o
( . ho o cn m , hn U i r t o Tcnlg , h n4 0 7 C ia 1 colfE oo y Wu a nv syf eh o y Wu a 30 0,h ; S e i o n
关键 词:图像 检 索 ;边 缘 检 测 :梯度 方 向 ;C rf 算 子 a e a 中 图 分类 号 : P 9 T3l 文 献 标 识 码 :A 文 章 编 号:6 4 6 3 ( 0 0)2 0 7 — 3 17 — 2 6 2 1 0 — 0 5 0
(完整版)Canny边缘检测算法总结
一.Canny边缘检测算法原理JohnCanny于1986年提出Canny算子,属于是先平滑后求导数的方法。
其处理过程大体上分为下面四部分。
1. 对原始图像进行灰度化Canny算法通常处理的图像为灰度图,因此如果获取的是彩色图像,那首先就得进行灰度化。
对一幅彩色图进行灰度化,就是根据图像各个通道的采样值进行加权平均。
以RGB格式的彩图为例,通常灰度化采用的方法主要有:方法1:Gray=(R+G+B)/3;方法2:Gray=0.299R+0.587G+0.114B;(这种参数考虑到了人眼的生理特点)至于其他格式的彩色图像,可以根据相应的转换关系转为RGB然后再进行灰度化;在编程时要注意图像格式中RGB的顺序通常为BGR。
2. 对图像进行高斯滤波图像高斯滤波的实现可以用两个一维高斯核分别两次加权实现,也可以通过一个二维高斯核一次卷积实现。
1)高斯核实现上式为离散化的一维高斯函数,确定参数就可以得到一维核向量。
上式为离散化的二维高斯函数,确定参数就可以得到二维核向量。
在求得高斯核后,要对整个核进行归一化处理。
2)图像高斯滤波对图像进行高斯滤波,其实就是根据待滤波的像素点及其邻域点的灰度值按照一定的参数规则进行加权平均。
这样可以有效滤去理想图像中叠加的高频噪声。
通常滤波和边缘检测是矛盾的概念,抑制了噪声会使得图像边缘模糊,这会增加边缘定位的不确定性;而如果要提高边缘检测的灵敏度,同时对噪声也提高了灵敏度。
实际工程经验表明,高斯函数确定的核可以在抗噪声干扰和边缘检测精确定位之间提供较好的折衷方案。
3. 用一阶偏导的有限差分来计算梯度的幅值和方向关于图像灰度值得梯度可使用一阶有限差分来进行近似,这样就可以得图像在x和y 方向上偏导数的两个矩阵。
常用的梯度算子有如下几种:1)Roberts算子上式为其x和y方向偏导数计算模板,可用数学公式表达其每个点的梯度幅值为:2)Sobel算子上式三个矩阵分别为该算子的x向卷积模板、y向卷积模板以及待处理点的邻域点标记矩阵,据此可用数学公式表达其每个点的梯度幅值为:3)Prewitt算子和Sobel算子原理一样,在此仅给出其卷积模板。
基于Canny算法的改进型图像边缘检测算法
Absr t tac Can y dge n e deecin gorhm i a i o e t t al i o t s knd f dge deec i al i m whi h v go c t t on gorh t ch a e od ompr h sv ev la i , t e en ie au t bu on te Ga s an ier lorhm i h u si ft ag i l t t us m a c s i a to s o h nd u z o te ed y au e m ge o m ot a f z y f h ed ge,nd t s e y en iv f a i v r s st e or i i sl at &pepp n ie. i pa er os Ths perdic ss t i s u es he mpr vn m e h ds f o ig t o o Can yAn m prv s t medi ft r l r h n i o ed wi ch an ie ago i m i l t s pr — o
l G(x x d f 一 ) )xI
() 1
SR N
() f=
Ca n 法 中高 斯 滤 波方 法很 难 满 足边 缘 检测 的要 求 。 n y算 针 对 这 个 问 题 , 们 提 出 了各 自的解 决 方 法 。 如 林 玉池 等 人 例 人 用 固定 小 8 8 1 的 滤 波 器 , 过 Win r 波 及 选 择 合 适 的 (= ) 通 ee滤 高 、 门 限 来 提 高 信 噪 比 ; 有 人 将 小 波分 析 、 糊 增 强 I、 度 低 也 模 3梯 ] 直 方 图 等 概 念 引入 C n y算 法 , 达 到 了一 定 的 效果 。 an 也 本 文 参 考 文 献 [ ] 提 出 了一 种 基 于 排 序 阈 值 的 开关 中值 5中 滤 波 方 法 , 文 将 对 其 做 进 一 步 的 改 进 , 用 一 种 基 于 方 向信 息 本 采 的 ,具 有 双 阈 值 噪声 判别 功 能 的改 进 型 开关 中值 滤 波 方 法 来 替
基于改进Canny_算法的图像边缘检测
第 22卷第 8期2023年 8月Vol.22 No.8Aug.2023软件导刊Software Guide基于改进Canny算法的图像边缘检测窦蕾萍,吴君钦(江西理工大学信息工程学院,江西赣州 341000)摘要:针对传统Canny算法对椒盐噪声敏感,在计算梯度幅值时只考虑了水平与垂直方向、在非极大值抑制过程中仅依据梯度方向的梯度幅值,从而导致梯度计算不准确、滤波后图像边缘模糊等问题,提出一种改进的Canny边缘检测算法。
首先,结合自适应中值滤波与引导滤波的混合滤波器不仅能有效去除图像中的椒盐噪声,还能更好地保存图像边缘;然后,利用4个方向Sobel算子模板计算图像梯度;最后,在非极大值抑制过程中,采用自适应线性插值方法提升边缘检测精度。
仿真实验表明,所提算法不仅能有效滤除椒盐噪声,并且相较于传统Canny算法能检测出更多边缘细节。
关键词:图像边缘检测;Canny算法;混合滤波;4个方向Sobel算子;自适应线性插值DOI:10.11907/rjdk.222062开放科学(资源服务)标识码(OSID):中图分类号:TP391.41 文献标识码:A文章编号:1672-7800(2023)008-0216-05Image Edge Detection Based on Improved Canny AlgorithmDOU Leiping, WU Junqin(School of Information Engineering, Jiangxi University of Technology, Ganzhou 341000,China)Abstract:Aiming at the problem that the traditional Canny algorithm is sensitive to salt-and-pepper noise, only vertical and horizontal direc⁃tions are considered when calculating the gradient amplitude, and only the gradient amplitude in the gradient direction is used in the process of non maximum suppression, which leads to inaccurate gradient calculation and blurred image edges after filtering, an improved Canny edge detection algorithm is proposed. First, the hybrid filter combining adaptive median filter and guided filter can not only effectively remove salt-and-pepper noise in the image, but also better preserve the image edges; Then, use the Sobel operator template in four directions to calculate the image gradient; Finally, in the process of non maximum suppression, the adaptive linear interpolation method is used to improve the edge detection accuracy. Simulation results show that the proposed algorithm can not only effectively filter salt-and-pepper noise, but also detect more edge details than the traditional Canny algorithm.Key Words:image edge detection; Canny algorithm; hybrid filtering; sobel operator in 4 directions; adaptive linear interpolation0 引言目前,边缘检测作为图像处理中极为关键的一部分,已成功应用于航空航天探测、工业监控生产、生物医疗科学等领域[1],大致可分为一阶微分算子(Sobel、Prewitt等)和二阶微分算子(Laplace等)[2-4]。
Canny 边缘检测算法
Canny 边缘检测算法【OpenCV】Canny 边缘检测分类:【OpenCV】2012-08-08 10:17 490人阅读评论(10) 收藏举报Canny 边缘检测算法1986年,JOHN CANNY 提出一个很好的边缘检测算法,被称为Canny编边缘检测器[1]。
Canny边缘检测根据对信噪比与定位乘积进行测度,得到最优化逼近算子,也就是Canny算子。
类似与LoG边缘检测方法,也属于先平滑后求导数的方法。
使用Canny边缘检测器,图象边缘检测必须满足两个条件:能有效地抑制噪声;必须尽量精确确定边缘的位置。
算法大致流程:1、求图像与高斯平滑滤波器卷积:2、使用一阶有限差分计算偏导数的两个阵列P与Q:3、幅值和方位角:4、非极大值抑制(NMS ):细化幅值图像中的屋脊带,即只保留幅值局部变化最大的点。
将梯度角的变化范围减小到圆周的四个扇区之一,方向角和幅值分别为:非极大值抑制通过抑制梯度线上所有非屋脊峰值的幅值来细化M[i,j],中的梯度幅值屋脊.这一算法首先将梯度角θ[i,j]的变化范围减小到圆周的四个扇区之一,如下图所示:5、取阈值将低于阈值的所有值赋零,得到图像的边缘阵列阈值τ取得太低->假边缘阈值τ取得太高->部分轮廊丢失选用两个阈值: 更有效的阈值方案.相关代码Canny算法实现:用高斯滤波器平滑图像(在调用Canny之前自己用blur平滑)用一阶偏导的有限差分来计算梯度的幅值和方向.对梯度幅值应用非极大值抑制.用双阈值算法检测和连接边缘.[cpp] view plaincopyprint?void cv::Canny( InputArray _src, OutputArray _dst,double low_thresh, double high_thresh,int aperture_size, bool L2gradient ){Mat src = _src.getMat();CV_Assert( src.depth() == CV_8U );_dst.create(src.size(), CV_8U);Mat dst = _dst.getMat();if (!L2gradient && (aperture_size &CV_CANNY_L2_GRADIENT) ==CV_CANNY_L2_GRADIENT){//backward compatibilityaperture_size &= ~CV_CANNY_L2_GRADIENT;L2gradient = true;}if ((aperture_size & 1) == 0 || (aperture_size != -1 && (aperture_size 7)))CV_Error(CV_StsBadFlag, "");#ifdef HA VE_TEGRA_OPTIMIZATIONif (tegra::canny(src, dst, low_thresh, high_thresh, aperture_size, L2gradient))return;#endifconst int cn = src.channels();cv::Mat dx(src.rows, src.cols, CV_16SC(cn));cv::Mat dy(src.rows, src.cols, CV_16SC(cn));cv::Sobel(src, dx, CV_16S, 1, 0, aperture_size, 1, 0,cv::BORDER_REPLICATE);cv::Sobel(src, dy, CV_16S, 0, 1, aperture_size, 1, 0, cv::BORDER_REPLICATE);if (low_thresh > high_thresh)std::swap(low_thresh, high_thresh);if (L2gradient){low_thresh = std::min(32767.0, low_thresh);high_thresh = std::min(32767.0, high_thresh);if (low_thresh > 0) low_thresh *= low_thresh;if (high_thresh > 0) high_thresh *= high_thresh;}int low = cvFloor(low_thresh);int high = cvFloor(high_thresh);ptrdiff_t mapstep = src.cols + 2;cv::AutoBuffer buffer((src.cols+2)*(src.rows+2) + cn * mapstep * 3 * sizeof(int));int* mag_buf[3];mag_buf[0] = (int*)(uchar*)buffer;mag_buf[1] = mag_buf[0] + mapstep*cn;mag_buf[2] = mag_buf[1] + mapstep*cn;memset(mag_buf[0], 0, /* cn* */mapstep*sizeof(int));uchar* map = (uchar*)(mag_buf[2] + mapstep*cn); memset(map, 1, mapstep);memset(map + mapstep*(src.rows + 1), 1, mapstep);int maxsize = std::max(1std::vector stack(maxsize);uchar **stack_top = &stack[0];uchar **stack_bottom = &stack[0];/* sector numbers(Top-Left Origin)1 2 3* * ** * *0*******0* * ** * *3 2 1*/#define CANNY_PUSH(d) *(d) = uchar(2), *stack_top++ = (d)#define CANNY_POP(d) (d) = *--stack_top// calculate magnitude and angle of gradient, performnon-maxima supression.// fill the map with one of the following values:// 0 - the pixel might belong to an edge// 1 - the pixel can not belong to an edge// 2 - the pixel does belong to an edgefor (int i = 0; i{int* _norm = mag_buf[(i > 0) + 1] + 1;if (i{short* _dx = dx.ptrshort>(i);short* _dy = dy.ptrshort>(i);if (!L2gradient){for (int j = 0; j_norm[j] = std::abs(int(_dx[j])) + std::abs(int(_dy[j])); }else{for (int j = 0; j_norm[j] = int(_dx[j])*_dx[j] + int(_dy[j])*_dy[j];}if (cn > 1){for(int j = 0, jn = 0; j{int maxIdx = jn;for(int k = 1; kif(_norm[jn + k] > _norm[maxIdx]) maxIdx = jn + k;_norm[j] = _norm[maxIdx];_dx[j] = _dx[maxIdx];_dy[j] = _dy[maxIdx];}}_norm[-1] = _norm[src.cols] = 0;}elsememset(_norm-1, 0, /* cn* */mapstep*sizeof(int));// at the very beginning we do not have a complete ring// buffer of 3 magnitude rows for non-maxima suppressionif (i == 0)continue;uchar* _map = map + mapstep*i + 1;_map[-1] = _map[src.cols] = 1;int* _mag = mag_buf[1] + 1; // take the central row ptrdiff_t magstep1 = mag_buf[2] - mag_buf[1]; ptrdiff_t magstep2 = mag_buf[0] - mag_buf[1];const short* _x = dx.ptrshort>(i-1);const short* _y = dy.ptrshort>(i-1);if ((stack_top - stack_bottom) + src.cols > maxsize) {int sz = (int)(stack_top - stack_bottom);maxsize = maxsize * 3/2;stack.resize(maxsize);stack_bottom = &stack[0];stack_top = stack_bottom + sz;}int prev_flag = 0;for (int j = 0; j{#define CANNY_SHIFT 15const int TG22 =(int)(0.4142135623730950488016887242097*(1 int m = _mag[j];if (m > low){int xs = _x[j];int ys = _y[j];int x = std::abs(xs);int y = std::abs(ys)int tg22x = x * TG22;if (y{if (m > _mag[j-1] && m >= _mag[j+1]) goto __ocv_canny_push;}else{int tg67x = tg22x + (xif (y > tg67x){if (m > _mag[j+magstep2] && m >= _mag[j+magstep1]) goto __ocv_canny_push;}else{int s = (xs ^ ys)if (m > _mag[j+magstep2-s] && m > _mag[j+magstep1+s]) goto __ocv_canny_push;}}}prev_flag = 0;_map[j] = uchar(1);continue;__ocv_canny_push:if (!prev_flag && m > high && _map[j-mapstep] != 2){CANNY_PUSH(_map + j);prev_flag = 1;}else_map[j] = 0;}// scroll the ring buffer_mag = mag_buf[0];mag_buf[0] = mag_buf[1];mag_buf[1] = mag_buf[2];mag_buf[2] = _mag;}// now track the edges (hysteresis thresholding)while (stack_top > stack_bottom){uchar* m;if ((stack_top - stack_bottom) + 8 > maxsize) {int sz = (int)(stack_top - stack_bottom); maxsize = maxsize * 3/2;stack.resize(maxsize);stack_bottom = &stack[0];stack_top = stack_bottom + sz;}CANNY_POP(m);if (!m[-1]) CANNY_PUSH(m - 1);if (!m[1]) CANNY_PUSH(m + 1);if (!m[-mapstep-1]) CANNY_PUSH(m - mapstep - 1); if (!m[-mapstep]) CANNY_PUSH(m - mapstep);if (!m[-mapstep+1]) CANNY_PUSH(m - mapstep + 1); if (!m[mapstep-1]) CANNY_PUSH(m + mapstep - 1); if (!m[mapstep]) CANNY_PUSH(m + mapstep);if (!m[mapstep+1]) CANNY_PUSH(m + mapstep + 1); }// the final pass, form the final imageconst uchar* pmap = map + mapstep + 1;uchar* pdst = dst.ptr();for (int i = 0; i{for (int j = 0; jpdst[j] = (uchar)-(pmap[j] >> 1);}} void cv::Canny( InputArray _src, OutputArray _dst,double low_thresh, double high_thresh,int aperture_size, bool L2gradient ){Mat src = _src.getMat();CV_Assert( src.depth() == CV_8U );_dst.create(src.size(), CV_8U);Mat dst = _dst.getMat(); if (!L2gradient && (aperture_size & CV_CANNY_L2_GRADIENT) ==CV_CANNY_L2_GRADIENT){//backward compatibilityaperture_size &= ~CV_CANNY_L2_GRADIENT;L2gradient = true;} if ((aperture_size & 1) == 0 || (aperture_size != -1 && (aperture_size 7)))CV_Error(CV_StsBadFlag, "");#ifdefHA VE_TEGRA_OPTIMIZATIONif (tegra::canny(src, dst, low_thresh, high_thresh, aperture_size, L2gradient))return;#endif const int cn = src.channels();cv::Mat dx(src.rows, src.cols, CV_16SC(cn));cv::Mat dy(src.rows, src.cols, CV_16SC(cn));cv::Sobel(src, dx, CV_16S, 1, 0, aperture_size, 1, 0,cv::BORDER_REPLICATE);cv::Sobel(src, dy, CV_16S, 0, 1, aperture_size, 1, 0, cv::BORDER_REPLICATE); if (low_thresh > high_thresh) std::swap(low_thresh, high_thresh); if(L2gradient){low_thresh = std::min(32767.0, low_thresh);high_thresh = std::min(32767.0, high_thresh);if (low_thresh > 0) low_thresh *= low_thresh;if (high_thresh > 0) high_thresh *= high_thresh;}int low = cvFloor(low_thresh);int high = cvFloor(high_thresh); ptrdiff_t mapstep =src.cols + 2;cv::AutoBuffer buffer((src.cols+2)*(src.rows+2) + cn * mapstep * 3 * sizeof(int));int* mag_buf[3];mag_buf[0] = (int*)(uchar*)buffer;mag_buf[1] = mag_buf[0] + mapstep*cn;mag_buf[2] = mag_buf[1] + mapstep*cn;memset(mag_buf[0], 0, /* cn* */mapstep*sizeof(int)); uchar* map = (uchar*)(mag_buf[2] + mapstep*cn);memset(map, 1, mapstep);memset(map + mapstep*(src.rows + 1), 1, mapstep);int maxsize = std::max(1 << 10, src.cols * src.rows / 10);std::vector stack(maxsize);uchar **stack_top = &stack[0];uchar **stack_bottom = &stack[0]; /* sector numbers (Top-Left Origin) 1 2 3* * ** * *0*******0* * ** * *3 2 1*/ #define CANNY_PUSH(d) *(d) = uchar(2),*stack_top++ = (d)#define CANNY_POP(d) (d) = *--stack_top // calculate magnitude and angle of gradient, perform non-maxima supression.// fill the map with one of the following values:// 0 - the pixel might belong to an edge// 1 - the pixel can not belong to an edge// 2 - the pixel does belong to an edgefor (int i = 0; i 0) + 1] + 1;if (i < src.rows){short* _dx = dx.ptr(i);short* _dy = dy.ptr(i); if(!L2gradient){for (int j = 0; j < src.cols*cn; j++)_norm[j] = std::abs(int(_dx[j])) + std::abs(int(_dy[j]));}else{for (int j = 0; j 1){for(int j = 0, jn = 0; j _norm[maxIdx]) maxIdx = jn + k;_norm[j] = _norm[maxIdx];_dx[j] = _dx[maxIdx];_dy[j] = _dy[maxIdx];}}_norm[-1] = _norm[src.cols] = 0;}elsememset(_norm-1, 0, /* cn**/mapstep*sizeof(int));// at the very beginning we do not have a complete ring// buffer of 3 magnitude rows for non-maxima suppressionif (i == 0)continue; uchar* _map = map +mapstep*i + 1;_map[-1] = _map[src.cols] = 1; int* _mag = mag_buf[1] + 1; // take the central rowptrdiff_t magstep1 = mag_buf[2] - mag_buf[1];ptrdiff_t magstep2 = mag_buf[0] - mag_buf[1]; const short* _x = dx.ptr(i-1);const short* _y = dy.ptr(i-1); if ((stack_top - stack_bottom) + src.cols > maxsize){int sz = (int)(stack_top - stack_bottom);maxsize = maxsize * 3/2;stack.resize(maxsize);stack_bottom = &stack[0];stack_top = stack_bottom + sz;} int prev_flag = 0;for (int j = 0; j < src.cols; j++){#define CANNY_SHIFT 15const int TG22 =(int)(0.4142135623730950488016887242097*(1 low){int xs = _x[j];int ys = _y[j];int x = std::abs(xs);int y = std::abs(ys) = _mag[j+1]) goto __ocv_canny_push;}else{int tg67x = tg22x + (x =_mag[j+magstep1]) goto __ocv_canny_push;}else{int s = (xs ^ ys)_mag[j+magstep1+s]) goto __ocv_canny_push;}}}prev_flag = 0;_map[j] = uchar(1);continue;__ocv_canny_push:if (!prev_flag && m > high &&_map[j-mapstep] != 2){CANNY_PUSH(_map + j);prev_flag = 1;}else_map[j] = 0;} // scroll the ring buffer_mag = mag_buf[0];mag_buf[0] = mag_buf[1];mag_buf[1] = mag_buf[2];mag_buf[2] = _mag;} // now track the edges (hysteresis thresholding) while (stack_top > stack_bottom){uchar* m;if ((stack_top - stack_bottom) + 8 > maxsize){int sz = (int)(stack_top - stack_bottom);maxsize = maxsize * 3/2;stack.resize(maxsize);stack_bottom = &stack[0];stack_top = stack_bottom + sz;} CANNY_POP(m); if (!m[-1]) CANNY_PUSH(m - 1);if (!m[1]) CANNY_PUSH(m + 1);if (!m[-mapstep-1]) CANNY_PUSH(m - mapstep - 1);if (!m[-mapstep]) CANNY_PUSH(m - mapstep);if (!m[-mapstep+1]) CANNY_PUSH(m - mapstep + 1);if (!m[mapstep-1]) CANNY_PUSH(m + mapstep - 1);if (!m[mapstep]) CANNY_PUSH(m + mapstep);if (!m[mapstep+1]) CANNY_PUSH(m + mapstep + 1);} // the final pass, form the final imageconst uchar* pmap = map + mapstep + 1;uchar* pdst = dst.ptr();for (int i = 0; i 1);}}Canny() 调用接口(C++):[cpp] viewplaincopyprint?void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2,int apertureSize=3, bool L2gradient=false ) voidCanny(InputArray image, OutputArray edges, double threshold1, double threshold2,int apertureSize=3, boolL2gradient=false )实践示例[cpp] viewplaincopyprint?Mat src, src_gray;Mat dst, detected_edges;int edgeThresh = 1;int lowThreshold;int const max_lowThreshold = 100;int ratio = 3;int kernel_size = 3;char* window_name = "Edge Map";void CannyThreshold(int, void*){/// Reduce noise with a kernel 3x3blur( src_gray, detected_edges, Size(3,3) );/// Canny detectorCanny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );dst = Scalar::all(0);src.copyTo( dst, detected_edges);imshow( window_name, dst );}int main( ){src = imread( "images\\happycat.png" );if( !src.data ){ return -1; }dst.create( src.size(), src.type() );cvtColor( src, src_gray, CV_BGR2GRAY ); namedWindow( window_name,CV_WINDOW_AUTOSIZE );createTrackbar( "Min Threshold:", window_name,&lowThreshold, max_lowThreshold, CannyThreshold ); CannyThreshold(0, 0);waitKey(0);return 0;} Mat src, src_gray;Mat dst, detected_edges;int edgeThresh = 1;int lowThreshold;int const max_lowThreshold = 100;int ratio = 3;int kernel_size = 3;char* window_name = "Edge Map";void CannyThreshold(int, void*){/// Reduce noise with a kernel 3x3blur( src_gray, detected_edges, Size(3,3) );/// Canny detectorCanny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );dst = Scalar::all(0);src.copyTo( dst, detected_edges);imshow( window_name, dst );}int main( ){src = imread( "images\\happycat.png" );if( !src.data ){ return -1; }dst.create( src.size(), src.type() );cvtColor( src, src_gray, CV_BGR2GRAY ); namedWindow( window_name,CV_WINDOW_AUTOSIZE );createTrackbar( "Min Threshold:", window_name,&lowThreshold, max_lowThreshold, CannyThreshold ); CannyThreshold(0, 0);waitKey(0);return 0;} 原图:边缘检测效果图:(从左到右lowThread分别为0、50、100)参考文献:[1] Canny. A Computational Approach to Edge Detection, IEEE Trans. on PatternAnalysis and Machine Intelligence, 8(6), pp. 679-698 (1986).转载请注明出处:/xiaowei_cqu/article/details/7839140资源下载:/detail/xiaowei_cqu/4483966。
基于canny算子的边缘检测算法应用研究_陈蒙
100 •电子技术与软件工程 Electronic Technology & Software Engineering图像与多媒体技术 • Image & Multimedia Technology1 引言随着图像处理技术的发展与广泛应用,现在社会中图像处理的应用领域越来越广泛,如三维重建,医学诊断,图像识别等等。
而图像处理过程中,最重要的一项预处理技术即为边缘检测技术。
图像的边缘是图像特征识别中的重要组成部分。
我们一般认为边缘是图像中周围像素有不连续变化或屋脊变化的像素的集合。
在一幅图像中,边缘特征所表达的信息量在整张图片的特征信息中占有主导地位,对图像特征的识别、分析十分重要。
边缘信息主要从像素值幅度和走向两个方面来表示。
一般来说,沿着边缘走向的像素点灰度值呈连续性变化特征,而垂直于边缘走向的像素点灰度值则呈跳跃性或阶跃性变化特征。
边缘检测技术即为通过一定的算法将图像中的边缘尽可能真实地提取或表示出来的技术。
边缘检测技术发展到目前已有很多类提取算法,但主要的计算原则就借助于类似高斯平滑、傅里叶变换等的数学函数与图像的灰度矩阵进行卷积计算,从而得到横、纵两个方向上的梯度图像和模图像,然后根据基于canny 算子的边缘检测算法应用研究文/陈蒙【关键词】canny 边缘检测(Edge Detection)高斯平滑(Gausscian Blur)canny, Edge Detection, Gausscian Blur 梯度方向来进行模的极大值提取,获得需要的图像特征边缘。
本文主要研究的是以canny 算子为检测手段的边缘检测算法。
2 canny边缘检测算法任何一个边缘检测算法的原则都是真实、详尽地标识出原图像的实际边缘,同时又尽可能避免图像中的噪点、伪边缘等噪声的干扰,找到一个最优的图像边缘。
Canny 边缘检测算法也是如此,一般由抑制噪声、寻找梯度亮度、非极大值抑制、确定和连接边缘这四步完成的。
一种基于Canny算子的多重边缘检测算法
一种基于Canny算子的多重边缘检测算法林雯【摘要】Canny operator was used as a basic operator to have the first time edge detection of the image. After the top-hat transformation of the original image, the second time edge detection was applied. On the base of the top-hat transformation image, logarithm transformation was carried out to start the third edge detection. After stacking up the three results of edge detections and skeletonizing it, a clear and simple image of edge detection was finally got. The experiment showed that the algorithm can well realize the extraction of the edges, especially the weak edges.%选择Canny算子为基础算子,对图像进行第一次边缘检测,在对原图进行顶帽变换后进行二次边缘检测,然后在顶帽变换的基础上对图像进行对数变换进行第三次边缘检测,将三次边缘检测的结果叠加,最后进行骨骼化处理,得到清晰简约的边缘检测图.实验结果表明:该算法能较好地实现对边缘尤其是弱边缘的提取.【期刊名称】《北华大学学报(自然科学版)》【年(卷),期】2013(014)001【总页数】4页(P103-106)【关键词】边缘检测;Canny算子;顶帽变换;对数变换【作者】林雯【作者单位】福建江夏学院信息技术科学学院,福建福州350108【正文语种】中文【中图分类】TP391.41目前,图像边缘检测常借助于空域微分算子.经典的基于一阶导数进行边缘检测的算子包括Sobel(索贝尔)、Prewitt(普瑞维特)、Roberts(罗伯特)、Canny(凯尼)算子,经典的基于二阶导数进行边缘检测的算子包括Laplacian(拉普拉斯)、Log(拉普拉斯-高斯)、Zero Crossings(零交叉)算子.经过对不同的边缘检测算子进行分析和比较,Canny算子最不容易受噪声的干扰,能够检测到真正的弱边缘,是相对最有效的边缘检测算子[1].但Canny算子对一些灰度差很小的弱边缘检测依然存在一定的局限性,在抑制噪声的同时容易丢失小目标细节[2].本文基于Canny算子,将原图、顶帽变换和对数变换后的图像边缘检测结果叠加并进行骨骼化处理,实现了对图像边缘尤其是弱边缘的提取.1 基本原理1.1 Canny算子Canny边缘检测算子由Canny提出,是经典的基于一阶导数的边缘检测算子,通过对相邻点进行差分处理来增强图像亮度差,当信号没有变化时,一阶导数不会有响应,信号有变化时,一阶导数可以使变化增强.具体的检测步骤如下:1)用高斯滤波器平滑图像,该滤波器带有标准偏差.2)用一阶偏导的有限差分来计算图像的局部梯度和边缘方向.3)对梯度幅值进行非极大值抑制.梯度的方向可以被定义为4个区之一,各个区用不同的邻近像素用来进行比较,以决定局部极大值[3].梯度方向上其强度局部最大的点被定义为边缘像素.4)用双阈值算法检测.第3步中确定的边缘点会导致梯度幅度图像中出现脊,算法跟踪所有脊的顶部并将所有不在脊的顶部的像素设为0,以便在输出中给出一条细线.脊像素使用双阙值T1和T2进行处理,其中T1<T2.值大于T2的脊像素称为强边缘像素,T1和T2之间的称为弱边缘像素[3].5)将8连接的弱像素集成到强像素,连接边缘.1.2 形态学与顶帽变换1.2.1 形态学形态学诞生于1964年,是一门建立在数学基础上的用集合论方法定量描述几何结构的学科.形态学用于几何结构分析的基本思想是运用一定形状的结构元素对图像做出度量和提取,从而分析和识别图像[4-5].它起初是对二值图像提出的,而后扩展到灰度图像,其关注的是形状[6].形态学的应用主要分解为结构元素的选择和形态学运算的设计两个问题.所有的形态学处理都基于填放结构元素的概念[7],要得到图像不同的特征和分析结果,就取决于不同的结构元素.形态学的基本运算包括:1)膨胀:在二值图像中“加长”或“变粗”的操作[3].可以填充图像中的小孔(相对于结构元素而言比较小的孔洞)及在图像边缘出现的小的凹陷部分[8].2)腐蚀:“收缩”或“细化”二值图像中的对象[3].可以消除图像中小的成分.3)开运算:先腐蚀后膨胀的过程,具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用[8].4)闭运算:先膨胀后腐蚀的过程,具有填充物体内细小孔洞,连接临近物体和平滑边界的作用[8].1.2.2 顶帽变换顶帽变换是基于数学形态学的一种图像处理方式.从原图中减去开运算后的图像称为顶帽变换,也叫高帽变换[9].其中开运算可以用于补偿不均匀的背景亮度,对图像进行开运算可以产生对整个图像背景的合理估计,只要结构元素大到不能完全匹配图像提取中所需要的细节即可.对图像进行顶帽变换后,可以生成一幅具有合适且均匀背景的图像.1.3 对数变换对数变换是对图像进行动态范围处理的基本工具,它对每一个像素对应的灰度级进行对数函数处理g=clog(1+r),其中,c是一个常数,r为图像处理前的灰度级,g为处理后的灰度级.对数变换实现了图像灰度扩展和压缩的功能.它能够对低灰度值的窄范围进行展宽,对高灰度值的宽范围进行压缩,让图像的灰度分布更加符合人的视觉特征.在对图像进行对数变换后进行边缘提取,由于亮度和对比度的改变,可以得到图像的极弱边缘,但却可能失去一些强边缘.1.4 骨骼化骨骼化是形态学中基于膨胀、腐蚀和查找表操作的组合算法,它将二值图像中的对象约简为一组细骨骼,也就是单像素宽线,这些细骨骼仍保留原始对象形状的重要信息.骨骼化能从图像中抽取出模式的特征信息,大量消除冗余数据[10],适用于对检测到的边缘线进行约减.2 算法设计若图像为有噪声图像,先对图像进行去噪预处理.选择Canny算子对图像进行第一次边缘提取,此时图像中的一些弱边缘无法提取出来.对图像进行顶帽变换,生成具有均匀背景的图像,其中关键性的问题是结构元素的选择,包括结构元素的大小和形状.对顶帽变换后的图像用Canny算子进行第二次边缘提取,得到更多的弱边缘.对顶帽变换后的图像进行对数变换处理,图像灰度被扩展和压缩,用Canny算子进行第三次边缘提取,得到更多更细节的弱边缘,但部分强边缘由于图像亮度对比度的变化,反而丢失.因此,此次的变换和边缘检测以牺牲部分强边缘为代价,旨在得到更细节的弱边缘.将三次边缘检测得到的边缘图像叠加,使三张图像互补,强弱边缘均得到很好的体现.但三次边缘检测时所检测出的边缘线条可能有微弱偏差,叠加后会造成部分边缘线合并、变粗.将叠加后的图像进行骨骼化处理,得到最终清晰简约的单像素宽线边缘图像.算法流程如图1所示.该算法具体步骤如下:Step 1.若图像为无噪声图直接执行 Step 2到Step 6,若图像为有噪声图,先对图像进行预处理,得到平滑的待检测图像.Step 2.用Canny边缘检测器对待检测图像进行第一次边缘提取.Step 3.对待检测图像进行顶帽变换后,用Canny边缘检测器进行第二次边缘提取.Step 4.对顶帽变换后的图像进行对数变换后,用Canny边缘检测器进行第三次边缘提取.Step 5.将三次边缘提取的结果图像叠加.Step 6.对叠加后的图像进行骨骼化处理,得到最终清晰简约的边缘图像.图1 基于Canny算子的多重边缘检测算法流程Fig.1 The flow of multiple edge detection algorithm based on Canny operator3 边缘检测实验本次实验在matlab开发环境下,以Lean图像作为原始图进行边缘检测实验,对提出的基于Canny算子的多重边缘检测算法进行验证.3.1 用 Sobel,Log 和 Canny边缘检测器进行边缘检测实验先分别用 Sobel,Log和 Canny三种边缘检测器对待检测图像进行边缘检测,分别如图3~5所示,图2为原始图像.其中图5亦可作为基于Canny算子的多重边缘检测算法中的第一次边缘提取图.3.2 基于Canny算子的多重边缘检测算法的边缘检测实验用基于Canny算子的多重边缘检测算法对待检测图像进行边缘检测,实验过程如图5~11所示.本次实验原图进行顶帽变换时选用直径为30形状为圆盘的结构元素.图2 Lena原始图Fig.2 Original image of Lean图3 Sobel算子Fig.3 Sobel operator图4 Log算子Fig.4 Log operator图5 Canny算子Fig.5 Canny operator图6 顶帽变换Fig.6 Top-hat transformation图7 第二次边缘检测Fig.7 Second edge detection图8 对数变换Fig.8 Logarithm transformation图9 第三次边缘检测Fig.9 Third edge detection图10 图像叠加Fig.10 Image overlay图11 边缘检测结果Fig.11 The results of edge detection4 结果与结论实验结果表明:Canny算子进行边缘检测的结果优于Sobel和Log算子,边缘线更加清晰,亦包含更多的弱边缘.将原图进行顶帽变换后,图像背景变均匀,用Canny算子进行第二次边缘检测,得到了原始图中灰度差较小的弱边缘,如大帽檐的连接边缘和背景中一些细节边缘.对顶帽变换后的图像再进行对数变换,图像亮度和对比度都发生了改变,灰度被扩展和压缩,用Canny算子进行第三次边缘检测,得到了原图中灰度差更小的弱边缘,如帽顶部分的连接边缘,帽子装饰部分的细节边缘,但该次检测失去了部分强边缘,如鼻子和下巴的连接边缘.三次边缘检测的结果进行叠加后,强弱边缘互补,强边缘保留,帽顶、帽檐、帽子装饰物及背景的弱边缘亦得到了检测和提取.骨骼化处理后,边缘线条被细化为单像素宽线,得到了清晰简约的边缘图像.从实验结果可以看出,本文所提出的基于Canny算子的多重边缘检测算法能较好地实现图像的边缘检测,计算快,边缘检测效果尤其是弱边缘检测效果明显优于传统的边缘检测器,能够为后续的图像目标识别提供良好的基础.参考文献:【相关文献】[1]林雯.边缘检测算子分析与比较[J].湖南工业职业技术学院学报,2012,12(5):6-7,25.[2]连洁,韩传久,潘路.基于Canny算法的红外小目标边缘检测方法[J].微计算机信息,2007,23(18):308-310.[3] Rafael C Gonzalez,Richard E Woods,Steven L Eddins.数字图像处理[M].3 版.北京:电子工业出版社,2011.[4]龚炜,石青云,程民德.数字空间中的数学形态学理论及应用[M].北京:科学出版社,1997.[5] Haralick R M,Stemberg S R,Zhuang X.Image Analysis Using Mathematical Morphology[J].IEEE Trans Comput,1987,9(3):532-550.[6] Mark S Nixon,Alberto S Aguado.特征提取与图像处理[M].2 版.北京:电子工业出版社,2010:81-89.[7]赵于前.基于数学形态学的医学图像处理理论与方法研究[D].长沙:中南大学,2006.[8]何新英,王家忠,孙晨霞,等.基于数学形态学和Canny算子的边缘提取方法[J].计算机应用,2008,28(2):477-478,483.[9]赵伟,王希常,李晓寒.基于顶帽变换和模糊C均值聚类的图像分割方法[J].计算机技术与发展,2010,20(8):52-55.[10]朱志良,赵新兵.一种新的二值图像细化算法[J].中国体视学与图像分析,1998,3(2):111-113,67.。
基于Canny算子的图像边缘检测算法
基于Canny算子的图像边缘检测算法作者:石桂名等来源:《现代电子技术》2015年第12期据图像的某种特定信息,把目标的边缘与周围的区分开来。
回顾了几种传统的边缘检测方法,并分析它们的优缺点,详细阐述了Canny算子的检测原理和实验方法。
实验结果表明Canny算子是最优的边缘检测算子,能够较稳定地对目标图像进行边缘信息提取,得到较好的检测效果。
关键词:图像处理;边缘检测; Canny算子;参数选择中图分类号: TN911.73⁃34 文献标识码: A 文章编号: 1004⁃373X(2015)12⁃0092⁃02边缘检测算法是图像处理中的一个重要部分,本文比较了几种常用的传统边缘检测算法,分析Canny算法的含义、原理和步骤,并将Canny算法应用于车牌和动物的检测。
实验仿真结果验证了Canny算法的良好性能:提取缘信息的同时,能很好地抑制噪声的干扰,提高了图像边缘检测效果,但对于某些细节过于复杂的图像可能丢失一些信息。
1 边缘检测算法简介Roberts算子是一种利用局部差分来寻找边缘的边缘检测算子,它处理的边缘效果不是很好,不够平滑。
Sobel算子是滤波算子,用于提取边缘时,可以利用快速卷积函数,方法简单,使用率较高,但是不能严格地模拟人的视觉生理特征,提取的图像轮廓并不能令人满意[1]。
Prewitt算子是一种基于一阶微分算子的边缘检测,利用像素点周围邻点的灰度差,在边缘处达到极值检测边缘,除掉一些假边缘,起到了平滑噪声的功能。
Laplacian算子是一个二阶微分算子,定义为梯度([∇f])的散度([∇⋅f])。
LoG算子也就是高斯拉普拉斯函数,常常用于数字图像的边缘提取和二值化,它结合了Gauss平滑滤波器和Laplacian锐化滤波器,效果更好。
Canny算子是一个多级边缘检测算法,边缘检测效果最好[2⁃3]。
2 Canny边缘检测算子2.1 Canny算法的含义1986年,John F.Canny找到一个可以实现多级边缘检测的算法,命名为Canny边缘检测算子,其含义如下[4]:(1)最佳检测:能够检测到足够多的图像中实际的边缘,减少真实边缘的漏检率和误检率。
基于Canny算子的彩色图像边缘检测算法
基于Canny算子的彩色图像边缘检测算法【摘要】本文将Canny算子应用于彩色图像,针对单尺度滤波器的缺点,本文采用改进的多尺度滤波器对彩色图像进行平滑。
通过实验证明,本文所采取的彩色图像边缘检测方法对噪声有很好的抑制作用,并且能够提取比较完整的图像边缘,是一种有效的检测方法。
【关键词】彩色图像;Canny算子;多尺度高斯滤波器1、引言边缘检测是图像处理中最基础也是最重要的部分。
其中有关灰度边缘检测的算子众多,有Sobel、Laplace、Roberts、Prewitt、Kisch和Laplacian、Canny等算子[1],然而,在我们现实生活中的大部分图像是彩色图像,与灰度图像相比,彩色图像能提供更多、更丰富的信息。
经过大量的实验证明,10%的边缘信息通过灰度边缘检测算子是检测不出来的[2],可能会丢失一些重要信息。
所以彩色图像边缘检测越来越受到人们的关注。
本文选取在RGB颜色空间中进行彩色图像边缘检测,利用Canny算子对彩色图像进行边缘检测,能够继承Canny算子定位准确,单边响应,信噪比高等优点。
然而,Canny算子在进行平滑图像的过程中,采用单尺度高斯滤波器,不能很好的滤除复杂繁多的噪点,针对这些问题,本文采取了一些措施。
2、算法原理2.1 多尺度高斯滤波器平滑图像利用不同尺度的高斯函数对图像进行滤波,在每个尺度下分别对R、G、B 三个分量多维磨光形成新的真彩色图像。
在本文中选取四个不同尺度的滤波器,分别对图像的3个分量进行滤波,然后对三个分量的四个不同结果进行加权求和,最后输出一个滤波图像。
假设,我们选取的四个不同尺度分别是,则利用这四个不同尺度的高斯函数分别对输入图像的R、G、B三分量进行平滑。
对得到的三分量进行加权求和,最后得到一个平滑后的图像,之后对这两个图像进行后续处理。
假设,加权权值,它们的取值与四个不同尺度的选择有关。
在本文中取分别为:(1)最后得到的滤波图像的三分量为公式(2):其中,分别表示经过四个不同尺度滤波器对三个颜色分量滤波后的三分量图。
Canny-算子边缘检测原理解析
w w
w
w
f 2 ( x)dx
G(-x)表示图像边函数 f(x)滤波器函数 表示噪声的均方差
Canny算子详细原理
②高的定位精度:Location越大越好
Location | G ' ( x ) f ' ( x)dx |
• 链接边缘的具体步骤如下:
• 对图像2进行扫描,当遇到一个非零灰度的像素p(x,y)时, 跟踪以p(x,y)为开始点的轮廓线,直到轮廓线的终点q(x,y)。 • 考察图像1中与图像2中q(x,y)点位置对应的点s(x,y)的8邻 近区域。如果在s(x,y)点的8邻近区域中有非零像素s(x,y) 存在,则将其包括到图像2中,作为r(x,y)点。从r(x,y)开 始,重复第一步,直到我们在图像1和图像2中都无法继续为 止。 • 当完成对包含p(x,y)的轮廓线的连结之后,将这条轮廓线标 记为已经访问。回到第一步,寻找下一条轮廓线。重复第一 步、第二步、第三步,直到图像2中找不到新轮廓线为止。 • 至此,完成canny算子的边缘检测。
w w
w
w
通过以上算式得出算子的近似实现:边缘点位于图 像被高斯平滑后的梯度值的极大值点。
算法过程
原始图像 A(x,yBy)
极大 值抑 制非
图像边缘
双阈值检测 连结边缘
初步得到 边缘点
详细算法过程
I. 高斯函数
x2 y2 n 1 G(x, y) exp | |, m , n表示 2 2 2 x m y m 高斯滤波器窗口大小
边缘检测算法
传统的边缘检测算子:Sobel算子,Prewitt算子,Roberts 算子,Krich算子等,大部分处理的效果都不很好,实际处理 中不太实用,而Canny算子检测的性能较好,常被作为其他实 验的标准来参考。Canny算子是John Canny在1986年发表的论 文中首次提出的一种边缘检测算法,当时弥补了其他算法的不 太好的缺点,因此Canny算子被认为是边缘检测领域较好的算 法,并一直被引用,近几年来,随着研究的深入,性能更加完 善的改性型的Canny算子也层出不穷,例如自适应Canny算子等。
Canny边缘检测算法的流程
Canny边缘检测算法的流程介绍边缘检测的⼀般标准包括:1) 以低的错误率检测边缘,也即意味着需要尽可能准确的捕获图像中尽可能多的边缘。
2) 检测到的边缘应精确定位在真实边缘的中⼼。
3) 图像中给定的边缘应只被标记⼀次,并且在可能的情况下,图像的噪声不应产⽣假的边缘。
在⽬前常⽤的边缘检测⽅法中,Canny边缘检测算法是具有严格定义的,可以提供良好可靠检测的⽅法之⼀。
由于它具有满⾜边缘检测的三个标准和实现过程简单的优势,成为边缘检测最流⾏的算法之⼀。
Canny边缘检测算法的处理流程Canny边缘检测算法可以分为以下5个步骤:1) 使⽤⾼斯滤波器,以平滑图像,滤除噪声。
2) 计算图像中每个像素点的梯度强度和⽅向。
3) 应⽤⾮极⼤值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
4) 应⽤双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
5) 通过抑制孤⽴的弱边缘最终完成边缘检测。
下⾯详细介绍每⼀步的实现思路。
1 ⾼斯平滑滤波为了尽可能减少噪声对边缘检测结果的影响,所以必须滤除噪声以防⽌由噪声引起的错误检测。
为了平滑图像,使⽤⾼斯滤波器与图像进⾏卷积,该步骤将平滑图像,以减少边缘检测器上明显的噪声影响。
⼤⼩为(2k+1)x(2k+1)的⾼斯滤波器核的⽣成⽅程式由下式给出:下⾯是⼀个sigma = 1.4,尺⼨为3x3的⾼斯卷积核的例⼦(需要注意归⼀化):若图像中⼀个3x3的窗⼝为A,要滤波的像素点为e,则经过⾼斯滤波之后,像素点e的亮度值为:其中*为卷积符号,sum表⽰矩阵中所有元素相加求和。
重要的是需要理解,⾼斯卷积核⼤⼩的选择将影响Canny检测器的性能。
尺⼨越⼤,检测器对噪声的敏感度越低,但是边缘检测的定位误差也将略有增加。
⼀般5x5是⼀个⽐较不错的trade off。
2 计算梯度强度和⽅向图像中的边缘可以指向各个⽅向,因此Canny算法使⽤四个算⼦来检测图像中的⽔平、垂直和对⾓边缘。
基于Canny算子的图像边缘检测与提取的算法
69科技资讯 科技资讯 SCIENCE & TECHNOLOGY INFORMATION2007 NO.34SCIENCE & TECHNOLOGY INFORMATIONI T 技 术物体的边缘是以图像局部的不连续性的形式出现的,例如,灰度值的突变,颜色的突变,纹理结构的突变等。
从本质上说,边缘常常意味着一个区域的终结和另一个区域的开始。
图像边缘信息在图像分布和人的视觉中都是十分重要的,是图像识别中提取图像特征的一个重要属性,而边缘提取算法则是图像边缘检测问题中经典技术难题之一。
它的解决对于我们进行高层次的特征描述、识别和理解等有着重大的影响,又由于边缘检测在许多方面都有着非常重要的使用价值,所以人们一直在致力于研究和解决如何构造出具有良好性质及好的效果的边缘检测算子的问题。
边缘检测的实质是采用某种算法来提取出图像中对象与背景间的交界线。
我们将边缘定义为图像中灰度发生急剧变化的区域边界。
图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此我们可以用局部图像微分技术来获得边缘检测算子。
Canny(坎尼)算子这种方法是以待处理像素为中心的邻域作为进行灰度分析的基础,实现对图像边缘的提取并已经取得了较好的处理效果。
由于Canny边缘算子具有许多优点,所以重在介绍。
Canny算子检测方法的优点:①低误码率,很少把边缘点误认为非边缘点;②高定位精度,即精确地把边缘点定位在灰度变化最大的像素上;③抑制虚假边缘。
1 Canny边缘检测基本原理具有既能滤去噪声又保持边缘特性的边缘检测最优滤波器,其采用一阶微分滤波器。
采用二维高斯函数的任意方向上的一阶方向导数为噪声滤波器,通过与图像卷积进行滤波;然后对滤波后的图像寻找图像梯度的局部最大值,以此来确定图像边缘。
根据对信噪比与定位乘积进行测度,得到最优化逼近算子,这就是Canny边缘检测算子。
类似与Marr(LOG)边缘检测方法,也属于先平滑后求导数的方法。
2 Canny边缘检测算法,其数学描述如下:step1:用高斯滤波器平滑图象。
canny算子公式
canny算子公式Canny算子公式是一种经典的边缘检测算法,被广泛应用于图像处理领域。
通过使用该算子,可以有效地检测图像中的边缘,并提取出有用的信息。
本文将介绍Canny算子公式的原理及应用。
Canny算子公式的原理是基于图像的梯度变化来检测边缘。
在图像中,边缘是颜色或灰度值发生剧烈变化的地方。
Canny算子通过计算图像中每个像素点的梯度,找到梯度变化最大的地方,从而确定边缘的位置。
Canny算子的公式可以用以下几个步骤来表示:1. 高斯滤波:首先对图像进行高斯滤波,目的是去除噪声。
高斯滤波是一种线性平滑滤波器,可以平滑图像的灰度值,使图像变得更加模糊,从而减少噪声的影响。
2. 计算梯度:对经过高斯滤波后的图像,使用Sobel算子计算每个像素点的梯度。
梯度表示图像灰度值的变化速度,可以用来检测边缘。
3. 非极大值抑制:在计算完梯度后,需要对梯度幅值进行非极大值抑制。
该步骤的目的是只保留梯度幅值最大的像素点,而将其他像素点抑制掉。
这样可以保留边缘的细节信息。
4. 双阈值检测:在完成非极大值抑制后,需要对梯度幅值进行阈值处理。
将梯度幅值分为高阈值和低阈值两部分,高阈值用于检测强边缘,低阈值用于检测弱边缘。
强边缘会被保留下来,而弱边缘则会被进一步处理。
5. 边缘连接:最后一步是对弱边缘进行边缘连接。
通过与强边缘相连,可以将弱边缘转化为强边缘,从而得到完整的边缘图像。
Canny算子公式的应用非常广泛。
在图像处理领域,边缘检测是很多应用的基础,例如目标检测、图像分割等。
通过使用Canny算子,可以提取出图像中的边缘信息,为后续的处理提供重要的依据。
Canny算子公式还可以用于图像的特征提取。
在计算机视觉领域,图像的特征提取是一项重要的任务。
通过提取图像的边缘特征,可以实现图像的分类、识别等应用。
Canny算子公式是一种常用且有效的边缘检测算法。
通过对图像进行高斯滤波、梯度计算、非极大值抑制、双阈值检测和边缘连接等步骤,可以提取出图像中的边缘信息。
dsp-Canny算子实现图像的边缘检测(董书月组)要点
=
n= =
式中:n式方向矢量, 是梯度矢量。
将图像 与 作卷积,同时改变n的方向, 取得最大值时的n就是正交于检测边缘的方向。
2.梯度幅值及方向角计算
已平滑数据矩阵的梯度可以使用 一阶有限差分近似式来计算x与y偏导数的两个矩阵 与 :
在这个 方形内求有限差分的均值,以便在图像中的同一点计算x和y的偏导数梯度。幅值和方向角可用直角坐标到极坐标的坐标转化公式来计算。
综上所述,Canny算子的具体算法步骤如下:
1).用高斯滤波器对图像进行滤波,去除图像中的噪声;
2).用高斯算子的一阶微分对图像进行滤波,得到每个图像的梯度强度和方向;
3).对梯度进行“非极大抑制”梯度的方向可以被定义为如下图所示:
4
3
2
1
X
1
2
3
4
图4梯度方向图
标识为1,2,3,4的属于四个区之一,各个区用不同的邻近像素来进行比较,以决定局部极大值。例如,如果中心像素x的梯度方向属于第4区,则把x的梯度值与它左上和右下相邻像素的梯度值比较,看x的梯度值是否是极大值。如果不是,就把像素x的灰度设为0。这个过程称为“非极大抑制”。
(一)Canny根据检测的要求,定义了下面三个最优准则:
1.最优检测。对真实边缘不漏检,非边缘点不错检,即要求输出信噪比最大。
2.最优检测精度。检测的边缘点的位置距实际的边缘点的位置最近。
3.检测点与边缘点一一对应。每一个实际存在的边缘点和检测的边缘点是一一对应的关系。
用一句话说,就是希望在提高对景物边缘的敏感性的同时,可以抑制噪声的方法才是好的边缘提取方法。
(3)当完成对包含P的轮廓线的连接之后,将这条轮廓线标记为已访问。回到第(1)步,寻找下一条轮廓线,重复Canny算子的具体算法步骤第1步第2步第3步,直到结果二中找不到打新轮廓线为止。至此完成Canny算子的边缘检测。
基于Canny算子的改进的图像边缘检测方法
20 年 第4 08 期
影 像 技 术
,≤ 遴 瘩
基 于C ny an算子 的改进 的
图像 边缘 检 测 方法
周 晓明 , 秋 禾 , 马 肖蓉
( 放 军信 息 工程 大 学测 绘 学 院 , 州 解ny an算子边缘检测 的基本原理 , 并对其性 能进行 了分析和评价。 针对传统C ny an算子在
C n y 18 年 提 出一 个优 良的边缘 检 测算 子 an 于 96
传 统 的微 分算子 , 于最优化 算法 的C n y 缘检测 基 an 边 算 子 因具 有信 噪 比大 和检测精 度高 的优点 ,被广泛
应用。
本文 分析 ]C n y ' a n 边缘 检测 算法 原理 ,对 C n y an 算 子 中的高斯滤 波过程进 行 了深入 的研究 ,提 出了 采 用 自适应 平 滑滤 波对 图像 边 缘进 行增 强 的方 法 , 有效 的提 高了C n y a n 边缘 检测 的精度 , 实验证 明这是
基于这三个判断准则canny推导出了一种最佳边缘检测算子称为canny算子其算法的流程如下改进的自适应平滑滤波canny算法从对canny算法的分析中我们可以看出运用canny算子提取边缘首先进行的是高斯滤波其目的就是对原始图像进行平滑处理以去除或减弱图像中的噪声
维普资讯
Absr c :Thi pe n r d c s h f n a n a t o y o n y p r tr a d are o is ta t s pa r i to u e t e u d me tl he r f Ca n o e ao n c ri s n t
关键词 : 图像处理 ; 边缘检测 ;a n算子 ; Cny 自适应平滑滤波
图像边缘探测--Canny算子实现
图像边缘探测--Canny算⼦实现这⼏天挺郁闷的,不知到该做什么,是继续做我的图像融合,还是改⾏做语⾳识别,我也不清楚。
像剑桥、⽜津、MIT、卡耐基-梅隆等⼤学都在搞语⾳识别。
唉,还是好好忙⾃⼰的数学基础和专业课吧,这⼏天作业也相当的多。
我这⼈有⼀点不好,就是看到新的东西都想学看看,但是三分钟热度。
从今天开始,我要进⾏我的长跑计划,我⼀哥们说这活动最能培养⼈的意志⼒了,如果能坚持⼀年的话,那么你的恒⼼就相当厉害了。
下⾯的这个⼩程序使⽤Canny算⼦进⾏边缘探测,如下:#include"cv.h"#include"highgui.h"void main(){//载⼊图像,并将其转化位灰度图像IplImage* srcImage = cvLoadImage("lena.jpg",0);//创建⽬标图像IplImage* dstImage = cvCloneImage(srcImage);//创建窗⼝cvNamedWindow("srcImage",1);cvNamedWindow("dstImage",1);/*------------使⽤canny算⼦探测边缘-----------------// void cvCanny( const CvArr* img, CvArr* edges, // double threshold1,double threshold2, int // apertureSize=3 ); // 阀值1、2⽤于边缘的连接 */cvCanny(srcImage,dstImage,100,200/*,3*/);//显⽰原图像和处理结果cvShowImage("srcImage",srcImage);cvShowImage("dstImage",dstImage);//等待按键cvWaitKey();//释放资源cvDestroyWindow("srcImage");cvDestroyWindow("dstImage");cvReleaseImage(&srcImage);cvReleaseImage(&dstImage);}Ok,效果如下。
基于新型Canny算法雷达距离图像边缘检测算法
基于新型Canny算法雷达距离图像边缘检测算法代文征;郑良仁;杨勇【摘要】针对激光雷达距离像的噪声滤波和边缘检测问题,提出了一种结合改进环圈滤波算法和自适应Canny算法的距离像边缘检测算法.通过改进环圈滤波对距离像的噪声进行抑制,在滤除噪声的同时保留了图像的细节特征信息.从梯度幅值计算、非极大值抑制和阀值自动选择3个方面对传统Canny算法进行改进,克服了噪声影响和边缘检测模糊等缺点.实验结果表明,该算法能够可靠的对距离图像进行边缘检测,并且检测结果的信息熵和标准差指标数据优于传统的Sobel算法和Laplace算法,能够较好地满足激光雷达距离像边缘检测的实际需要.%In order to solve the problem of noise filtering and edge detection in the range image of laser radar, an edge detection algorithm of range image in combination with both improved loop filtering algorithm and adaptive Canny algorithm was proposed.The noise of range image was suppressed through the improved loop filtering, and the detail feature information of the image was preserved at the same time of removing the noise.The traditional Canny algorithm was improved through the gradient magnitude calculation, non maximum suppression and automatic threshold selection, which overcomed such defaults as the noise effect and fuzzy edge detection.The results show that the proposed algorithm can reliably detect the edge of range image, the information entropy and standard deviation index dataof detected results are superior to those of the traditional Sobel algorithm and Laplace algorithm, and the proposed algorithm can better meet the actual needs of range image edge detection of laser radar.【期刊名称】《沈阳工业大学学报》【年(卷),期】2017(039)004【总页数】5页(P428-432)【关键词】边缘检测;噪声抑制;环圈滤波;激光雷达;距离像;Canny算法;梯度;阀值【作者】代文征;郑良仁;杨勇【作者单位】黄河科技学院信息工程学院,郑州 450063;黄河科技学院信息工程学院,郑州 450063;黄河科技学院信息工程学院,郑州 450063【正文语种】中文【中图分类】TN958激光雷达[1-3]具备高分辨率和强抗干扰能力,使其在武器制导、三维测绘和航空航天等领域得到了广泛应用.激光雷达不同于普通的微波雷达,其成像结果包括强度像和距离像两种.当前针对强度像的处理方法研究较为成熟,但针对距离像的研究还比较少.距离像能够反映不同物体之间的距离信息,与强度像结合可以得到探测区域内的三维信息,因此,对距离像进行研究十分必要.噪声抑制和边缘检测是对激光雷达距离图像处理的重要组成部分,当前的噪声抑制方法[4-5]总的来说可分为频域噪声抑制、空域噪声抑制和小波噪声抑制等方面.每种噪声抑制方法都能够不同程度地对距离图像中的噪声进行抑制,但是也不同程度地存在噪声抑制不彻底、破坏图像细节等问题.边缘检测是指利用图像的不连续特性来得到物体的边缘信息,利用各种边缘检测算子进行边缘检测是常用的办法,如文献[6]中提到的Sobel边缘检测算法;文献[7]中提到的Laplace边缘检测算法;文献[8]中提出的基于小波变换的边缘检测法和文献[9]中提出的基于模糊顺序形态学的边缘检测方法等.这些方法在一定程度上能够提取物体的边缘信息,但是存在对噪声敏感、定位精度差等缺点,在对激光雷达距离像中细节结构的边缘提取上存在不足.本文结合改进环圈滤波方法,提出了一种基于自适应Canny算法[10-11]的激光雷达距离像边缘检测算法,该算法能够有效滤除噪声的影响并保留图像的细节信息,实现了优于Sobel算法和Laplace算法的距离像边缘检测.1.1 噪声抑制模型激光成像雷达工作时,其距离像数据会受到噪声的干扰,这些噪声主要表现为距离反常噪声.距离反常噪声是由激光雷达所得的目标距离测量值与目标距离真实值不同而形成的噪声,这种噪声会降低数据质量,影响后续处理算法对真实目标的检测识别,增加系统的处理难度和探测虚警率,严重时甚至会阻碍雷达对目标的探测.激光成像雷达的距离分辨率较高,图像分辨率较低,当雷达与目标之间的距离比较远时,目标的部分特征结构在探测所得的距离像中会表现为细长结构,这些细长结构可能包含了目标特性的重要信息.噪声抑制方法需要能够有效抑制距离反常噪声对探测结果的影响,还要能够有效保护目标的细长结构等细节信息,因此,本文采取改进的环圈滤波方法进行噪声抑制.传统的环圈滤波将像素点和其邻域像素点划分为当前像素点、里圈窗口像素点和外圈窗口像素点.通过求解当前像素点的距离、里圈窗口距离极值和外圈窗口距离极值的中位数来作为该像素点的最终距离值,计算公式为式中:med为求中位数符号;Di为里圈窗口的像素点集合;Do为外圈窗口的像素点集合;Dc为当前像素点.三者之间的关系为式中,D为所有像素点集合.求当前像素点距离do与最终距离值d之间的绝对差值,并将结果与距离阀值进行比较,当结果小于距离阀值时,该像素点为目标;否则为噪声,判断公式为传统的环圈滤波算法能够保存目标的细长结构等特征,但是对于距离反常噪声的抑制功能较弱.为了提高算法对噪声的抑制功能,对环圈滤波算法进行改进,将像素点的最终距离值计算公式优化为d= med[max(Di)(1-pi),min(Di)(1-pi),max(Do)(1-po),min(Do)(1-po),Dc]式中:pi和po分别为里圈和外圈校正系数.通过调整校正系数,可以提高算法对噪声的抑制能力.为了保证算法不破坏图像的细长结构等关键特征,需要根据细长结构的像素点数量在环圈窗口中的比例来限定校正系数的范围.校正系数的临界值分别为式中:n为细长结构宽度方向能够探测到的像素点个数;ni为里圈窗口大小;no 为外圈窗口大小;Δα为雷达角度分辨率;d1为细长结构的宽度.1.2 边缘检测模型Canny算法以边缘检测性能、定位性能和单一边缘响应3条准则为基础,利用最优化数值求解方法能够较好地用于边缘检测.Canny算法包括图像平滑、计算梯度幅值、梯度图像非极大值抑制和高低双阀值处理4个步骤.传统的Canny算法虽然较Prewitt算法和Sobel算法在图像边缘检测上有较大优势,但存在噪声影响严重、检测边缘模糊和阀值设置过分依靠经验等缺点.为了提高Canny算法对激光雷达距离图像的边缘检测能力,从计算梯度幅值、梯度图像非极大值抑制和阀值自动选择3个方面对Canny算法进行改进,提出一种自适应Canny算法.1.2.1 梯度幅值计算为了抑制噪声对处理结果的影响并计算梯度大小,采用3×3邻域模板计算图像灰度在x、y方向上的偏导数.假设I为经过平滑滤波后的图像,则在水平方向x和垂直方向y上的差分fx(i,j)和fy(i,j)分别为像素点的梯度幅值M(i,j)和梯度方向θ(i,j)分别为1.2.2 非极大值抑制为了提高算法非极大值抑制的准确性,克服传统方法仅采用单个点进行对比而带来的错判,利用插值方法进行了非极大值抑制.采用梯度方向的4个点进行双线性插值,将当前点M(i,j)的邻域划分为4个象限,当θ(i,j)>0时采用一、三象限的点进行插值计算;否则采用二、四象限的点进行插值计算.当θ(i,j)>0时的双线性插值结果M1和M2为式中:当θ(i,j)≤0时的双线性插值结果M3和M4为式中:当M(i,j)≥M1且M(i,j)≥M2或者M(i,j)≥M3且M(i,j)≥M4,两者满足其一时,该像素点为极大值;否则该像素点不是极大值.1.2.3 阀值自动选择利用最大类间方差法进行自适应阀值计算,算法基本思想是将图像中的像素点按照各点的梯度值和最优阀值t之间的关系划分为C0和C1两类.其中C0是由梯度值在0到t之间的像素点组成的集合,C1是由其他像素点组成的集合.类间方差σ(t)2定义为σ(t)2=w1(t)w2(t)[u1(t)-u2(t)]2式中:w1(t)为C0中像素点的数量;u1(t)为C0像素点的平均梯度值;w2(t)为C1中像素点的数量;u2(t)为C1像素点的平均梯度值.利用遗传算法求得使σ(t)2最大的t值即为所需的高阀值,将高阀值t乘以合适的比例系数即得到算法的低阀值.遗传算法的具体流程如下:1) 初始化算法变量,设定最初的个体数为m,随机产生m个个体作为初始种群.2) 计算个体i的适应度Ji,若结果稳定或者迭代次数达到计算最大次数,将适应度Ji最大的个体i作为最优结果,并将其反编码后得到最佳分割阀值.3) 计算个体的选择概率,利用轮盘赌方法得到选择的个体.具体过程为计算种群中个体适应度总和S,并以此来产生小于S的随机数s.将所有个体累加,当累加值大于s时,最后累加的个体作为选择的个体.重复该步操作就可得到用于繁殖的个体集.4) 在选择得到的个体集中,按照交叉概率τ抽取个体进行交叉,得到交叉后的个体集.5) 在交叉后个体集中按照变异概率φ选择个体中的变异位置,将变异位置上对应的数字1或者0进行取反操作得到变异后个体集.6) 判断个体集是否满足结束条件,若满足则将适应度Ji最大的个体i作为最优结果,并将其反编码后得到最佳分割阀值;否则转到步骤2)继续执行.为验证本文所提算法的处理效果,分别采用本文所提算法、传统Sobel算法和Laplace算法分别对一幅激光雷达图像和Lena图像进行检测,结果如图1所示.其中图1a和1e分别为激光雷达与Lena图像的原始图形;图1b和1f为采用本文算法处理得到的结果;图1c和1g为采用Sobel算法处理得到的结果;图1d和1h为采用Laplace算法处理得到的结果.由实验结果可知:3种方法都能在不同程度上对图像中物体的边缘信息进行提取.Sobel算法对于对比度比较明显的边缘能够可靠提取,对比度不明显的边缘丢失现象比较严重;Laplace算法的边缘提取效果优于Sobel算法,对于对比度不明显的边缘信息提取有一定程度改进,但是对于噪声的处理比较欠缺,有的噪声被当作边缘信息进行了提取,同时其中一些细节结构存在丢失的情况;本文所采用的算法不但能够对物体边缘(包括细节结构)进行可靠提取,同时能够对噪声进行有效抑制,其处理结果优于其他两种算法的处理结果.为了直观衡量不同算法对图像的边缘检测结果,采用信息熵H和标准差MSE两个指标衡量处理效果,两个指标的定义为MSE=(A(i,j)-K(i,j))2式中:L为图像总的灰度等级;Pi为图像中灰度值为i的像素点概率;M和N分别为图像的长和宽;A为原始图像像素;K为处理过后的图像像素.熵越大表示图像包含的信息量越大,反之信息量越小;标准差越高表示图像的数据越不精确,反之图像数据越精确.3种方法对图像进行处理的对比结果如表1所示.由对比结果可知:本文所用算法处理结果的信息熵最大,Laplace算法的信息熵次之,Sobel算法的信息熵最小;本文所用算法的标准差最小,Laplace算法的标准差居中,Sobel算法的标准差最大.无论采用信息熵指标还是标准差指标,本文算法得到的处理结果都优于其他两种算法,可以得到更好的边缘检测效果.本文提出了一种结合改进环圈滤波算法和自适应Canny算法的激光雷达距离像边缘检测算法.利用改进环圈滤波算法进行噪声滤波,在对噪声进行抑制的同时有效保护了图像中细长结构等反映图像关键特性的信息.针对传统Canny算法在噪声影响、边缘模糊和阀值设定等方面的缺陷,从梯度幅值计算、双线性插值非极大值抑制和阀值自适应选择3个方面对Canny算法进行了改进.由信息熵和标准差两个指标可知,该算法具有更高的信息熵值和更低的标准差.观察3种算法的边缘检测结果可知,本文算法较其他两种算法更能有效滤除噪声数据,且能够清晰反映图像的细节信息.【相关文献】[1]李磊,胡以华,赵楠翔,等.激光三维成像技术应用现状 [J].激光与光电子学进展,2009,46(12):66-71.(LI Lei,HU Yi-hua,ZHAO Nan-xiang,et al.Application of three-dimensional laser imaging technology [J].Laser & Optoelectronics Progress,2009,46(12):66-71.)[2]王昊鹏,刘泽乾.激光三维成像技术及其主要应用 [J].电子设计工程,2012,20(12):160-163. (WANG Hao-peng,LIU Ze-qian.3-D laser imaging technology and application[J].Electronic Design Engineering,2012,20(12):160-163.)[3]许凯达,金伟其,刘敬,等.基于激光距离选通成像的非视域成像应用 [J].红外与激光工程,2012,41(8):2073-2078.(XU Kai-da,JIN Wei-qi,LIU Jing,et al.Non-line-of-sight imaging based on laser range-gated imaging technology [J].Infrared and Laser Engineering,2012,41(8):2073-2078.) [4]李自勤,王骐,李琦,等.相干激光雷达距离像噪声机理及距离反常抑制 [J].中国激光,2005,32(3):356-360.(LI Zi-qin,WANG Qi,LI Qi,et al.Noises mechanism of range image in coherent laser radar and the range anomalies suppression [J].Chinese Journal of Lasers,2005,32(3):356-360.)[5]陈晓清,马君国,付强,等.相干激光雷达距离像距离反常抑制方法[J].中国激光,2010,37(1):181-185.(CHEN Xiao-qing,MA Jun-guo,FU Qiang,et al.Range anomalies suppression methodof coherent laser radar range image [J].Chinese Journal of Lasers,2010,37(1):181-185.)[6]杜亚勤,郭雷,高世伟.基于模糊集的图像边缘检测算法[J].电子测量与仪器学报,2007,21(6):22-24.(DU Ya-qin,GUO Lei,GAO Shi-wei.Image edge detection algorithm based on fuzzy sets [J].Journal of Electronic Measurement and Instrument,2007,21(6):22-24.)[7]黄世震,郭光宝.基于Sobel边缘检测和双线性算法的图像缩放实现 [J].中国集成电路,2013,9(9):45-49.(HUANG Shi-zhen,GUO Guang-bao.Image scaler based on bilinear algorithm and Sobel edge detection [J].China Integrated Circult,2013,9(9):45-49.)[8]厉丹,钱建生,芦楠楠,等.图像边缘检测技术的改进 [J].计算机工程与应用,2010,46(18):164-166.(LI Dan,QIAN Jian-sheng,LU Nan-nan,et al.Improving of image edge detection technique [J].Computer Engineering and Application,2010,46(18):164-166.)[9]何春华,张雪飞,胡迎春.基于改进Sobel算子的边缘检测算法的研究 [J].光学技术,2012,38(3):323-327.(HE Chun-hua,ZHANG Xue-fei,HU Ying-chun.A study on the improved algorithm for Sobel on image edge detection [J].Optical Technique,2012,38(3):323-327.)[10]Bin R W,Jing L Z,Wei Z,et al.An improved Canny edge detection algorithm[C]//Proceedings of 2014 IEEE International Conference on Mechatronics and Automation.Tianjin,China,2014:577-582.[11]苏恒阳,袁先珍.一种改进的Canny的图像边缘检测算法 [J].计算机仿真,2010,27(10):242-245.(SU Heng-yang,YUAN Xian-zhen.An improved Canny edge detection algorithm[J].Computer Simulation,2010,27(10):242-245.)。
基于Canny边缘检测算子的图像检索算法
基于Canny边缘检测算子的图像检索算法
赵宏中;张彦超
【期刊名称】《电子设计工程》
【年(卷),期】2010(018)002
【摘要】针时依赖传统Canny算子的基于边缘的图像检索系统所存在的不足,提出一种基于Canny边缘检测的图像检索算法.使用改进的Canny算子提取图像边缘特征,将该特征通过傅里叶描述予转化为向量,根据向量闯的Manhanttan距离进行图像检索.试验结果表明,改进的Canny算子能够检测到低强度的边缘并保持边缘清晰连贯,而且该图像检索算法具有良好的检索效果.
【总页数】4页(P75-77,80)
【作者】赵宏中;张彦超
【作者单位】武汉理工大学经济学院,湖北,武汉,430070;武汉理工大学计算机科学与技术学院,湖北,武汉,430070
【正文语种】中文
【中图分类】TP391
【相关文献】
1.基于Canny边缘检测算子的雷达图像1/8插值改进算法 [J], 达平;张金林;谷京朝
2.基于Canny边缘检测算子的雷达图像1/8插值改进算法 [J], 达平;张金林;谷京朝;
3.基于遗传算法的Canny边缘检测算子在配药机器人中的应用 [J], 胡佳林;刘波
峰;何玉成
4.基于改进Canny边缘检测算子的电子稳像算法研究 [J], 周同;邹丽新;尤金正;王海燕;杜伟巍
5.基于蚁群和Canny边缘检测算子混合算法的二维岩石图像裂隙特征提取与修复研究 [J], 张愉玲;邢会林;李三忠;逄硕;刘骏标;张熔鑫
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
壑窒主:箜=壁基±£塑望Y垫丝垒型笠至丝里堡垒壹身壁
术中。
特征的相似度量多采用距离法,即特征的相似程度用特征向量的空间距离来表示,距离越大。
图像之间的差别越大,反之就越相似。
由于马氏(Manhanttan)距离[al能准确匹配噪声图像和遮挡图像,具有很高的可靠性和稳定性,因此本文使用Manhanttan距离来衡量图像间是否相似。
Manhanttan距离的计算公式如下:
二
D(X,y)=乞k-扎J(6)3.3算法实现
基于改进的Canny边缘检测算子的罔像检索算法实现步骤如下:1)对图像库中的图像进行预处理,去除噪声及冗余信息;2)选择查询示例图像,使用改进的Canny算子提取图像边缘信息;3)使用傅里叶描述子表示查询示例图像。
同时初始化图像数据库,对于每一幅图像用改进的Canny算子提取图像边缘信息并且使用傅里叶描述子表示。
此时,图像
(a)测试圈像特征转化为向量:4)根据向量间的Manhanttan距离在数据库中比对,并按照距离的大小对检索结果排序完成整个检索过程。
由于改进的Canny算子能够精准的提取罔像边缘信息,因此本文的图像检索算法能在一定程度上提高检索效率,得到更好的检索效果。
4实验及结果分析
基于上述思想.本文实现了一个实验系统。
实验采用的测试图像数据库共有3500幅图像.包含汽车、动物、花卉等共7类.每幅图像的分辨率为256x385.实验硬件环境为IntelDual.CoreI.6GHz,WindowsXP,lGB内存PC机。
4.1边缘检测实验结果及分析
在测试图像数据库中选择测试图像。
基于传统Canny算子以及基于改进Canny算子的边缘检测结果如图3所示。
【bl传统(,anny算了7璁缘_{生莉结果J峻进Lanny算r边缘俭城结果图3边缘检测结果
由周3可见,与传统Canny边缘检测算法相比,改进的Canny算子在保持传统算法优点的基础上。
检测到了更多的低强度边缘,从而更全面地反映了图像的细节信息。
此外,改进的Canny边缘检测算法在保持边缘清晰连贯的同时.具有
(a)检索示例图像更强的噪声抑制能力。
4.2图像检索算法实验及分析
基于传统Canny算子边缘检测的图像检索算法和本文算法的检索结果比较如图4所示。
(b1传统canny算子边缘检删检索算法结果{c)本文算法检索结果图4两种算法的检索结果比较
本文使用查全率(Recall)和查准率(Precision)lgl评估算法的性能。
查全率(召回率)A和查准率(准确度)C分别定义为:A=RIM,C=R/N。
其中。
R指有关联的正确结果,M指所有有关联的结果,』v指所有检索到的结果。
查全率是衡量检索系统和检索者检出相关信息的能力,查准率是衡量检索系统和检索者拒绝非相关信息的能力。
传统基于Canny边缘检测的图像检索算法和本文算法的性能比较如表l所示。
表l两种算法的检索结果比较
从图4和表l的检索结果可以看出.由于改进的Canny算子能够检测到低强度的边缘,而且较好的保持边缘清晰连贯,所以在此基础上的图像检索算法取得了较好的检索效果,提高了图像检索性能。
5结束语
本文主要探讨在提高边缘检测性能的基础上改善图像检索效率,为基于形状的图像检索提出一种检索思路,提出基于Canny边缘检测的图像检素算法。
该算法使用改进的Canny算子提取图像边缘特征,在此基础上,该特征被应用于图像检索算法中。
由于改进的Cannv算子能(下转第80页)
-77-
《皇±塑让工程—迦!Q生箜2塑
JPEG格式图像之间转换的软件实现。
运用此算法的软件实
现.在图像质量基本不变的情况下能够达到40.-1的压缩比.
且用户可以在本设计的基础上改进某些算法(如DCT变换算
法、Huffman编码算法等)。
从而达到更高的压缩比。
JPEG标
准的优点是在自然景观与再现图片方面表现很出色,且其图
像文件比较小.目前WEB上80%的网像都是JPEG格式。
但
其缺点是只能处理静态图像,不能处理活动景物。
随着技术
的进步。
相信JPEG标准将会得到更进一步的发展和应用。
参考文献:
『11张益贞,刘滔.VisualC++实现MPEG/JPEG编解码技术图5对JPEG文件压缩编码的过程图fMl.北京:北京邮电大学出版社,2003.
缩率;选择55%的图像质量.得到30:l的压缩率;选择35%[2】杨淑莹.VC++图像处理程序设计[M1.2版.北京:清华大学的网像质量,可得到40:1的压缩率,只要压缩率不大于40出版社.2005.
倍,图像压缩后的效果质量无法甩肉眼Ⅸ别。
可见JPEG标准【3】求是科技.VisualC++音视频编解码技术及实践【M】.北京:的优越性。
人民邮电出版社.2006.
从以上测试结果看出,设计实现的JPEG压缩算法较好【4】胡栋.静止图像编码的基本方法与国际标准【M】.北京:北地实现了对于24位bmp图像的压缩,压缩比较高,且压缩图京邮电大学出版社.2003.
像与原始图像相比差异几乎无法察觉。
『51张宏林.精通VisualC++数字图像处理典型算法度实现3结束语同学≯麓{三:.麓嚣删小触械工业阐述了JPEG编码的基本原理,并给出BMP格式图像与出版社,2004.
(上接第77页)
够检测到低强度的边缘而且能够较好的保持边缘清晰连贯.从而提高了算法检索效率。
但是.由于图像往往被表示为高维空间中的矢量.因此在现有的技术条件下对其索引和检索都是较困难的,而且“语义鸿沟”问题同样影响图像检索结果。
如何突破“语义鸿沟”,更加快速准确地检测出近似图像,将是今后研究的方向。
参考文献:
【1JMostafaT,AbbasHM,WaIldanAA.Ontheofhierarch-icalcolormomentsforimageindexingandretrieval[C]//Sys-terns,ManandCybernetics,2002IEEEIntemationalConfer-euee,2002,7(6):6--9.
【2】温泉彻,彭宏,黎琼.基于内容的图像检索关键技术研究【J】.微计算机信息,2007,23(3):278-280.
[3】季虎,孙即祥,邵晓芳。
图像边缘提取方法及展望fJ】.计算.机工程与应用,2004,40(14):70-73.问姚峰林,詹海英,李元宗.机器视觉中的边缘检测技术研究【J】.机械工程与自动化,2005(1):108一110.
【5】王植,贺赛先.一种基于Canny理论的自适应边缘检测方法叨.中国图像图形学报,2004.9(8):957—961.
【6】张斌,贺赛先.基于Canny算子的边缘提取改善方法【J】.红外技术,2006,28(3):165—169.
【7】万力,易昂,傅明.一种基于Canny算法的边缘提取改善算法叨.计算机技术与自动化。
2003,22(1):24—26.
【8】宋艳,刘方爱.基于相似性度量方法的图像检索叨.计算机应用与软件,2007,24(10):166—168.
f9】SmeuldersAWM,SantiniS。
WorriugM,eta1.Contentbasedimageretrievalattheendoftheearlyyears[J】.IEEETram-actionsPatternAnalysisandMachineIntelligence,2000,22(12):l349一l
380。
基于Canny边缘检测算子的图像检索算法
作者:赵宏中, 张彦超
作者单位:赵宏中(武汉理工大学经济学院,湖北,武汉,430070), 张彦超(武汉理工大学计算机科学与技术学院,湖北,武汉,430070)
刊名:
电子设计工程
英文刊名:ELECTRONIC DESIGN ENGINEERING
年,卷(期):2010,18(2)
1.季虎;孙即祥;郡晓芳图像边缘提取方法及展望[期刊论文]-计算机工程与应用 2004(14)
2.温泉彻;彭宏;黎琼基于内容的图像检索关键技术研究[期刊论文]-微计算机信息 2007(03)
3.Mostafa T;Abbas H M;Wahdan A A On the ale of hierarchical color moments for image indexing and retrieval 2002
4.Smeulders A W M;Santini S;Worring M Content based image retrieval at the end of the early years[外文期刊] 2000(12)
5.宋艳;刘方爱基于相似性度量方法的图像检索[期刊论文]-计算机应用与软件 2007(10)
6.万力;易昂;傅明一种基于Canny算法的边缘提取改善算法[期刊论文]-计算技术与自动化 2003(01)
7.张斌;贺赛先基于Canny算子的边缘提取改善方法[期刊论文]-红外技术 2006(03)
8.王植;贺赛先一种基于Canny理论的自适应边缘检测方法[期刊论文]-中国图象图形学报 2004(08)
9.姚峰林;詹海英;李元宗机器视觉中的边缘检测技术研究[期刊论文]-机械工程与自动化 2005(01)
本文链接:/Periodical_dzsjgc201002027.aspx。