精华内容
下载资源
问答
  • 态学梯度的样条插值亚像素边缘检测方法。利用改进的数学形态学梯度算子进行边缘 点的粗定位,再利用三次样条插值法对提取出的边缘图像进行插值运算,最后利用数学 形态学细化算子将提取出的边缘进行细化,可有效地...
  • 为了提高刀具预调测量仪的检测精度,提出了一种改进的图像快速亚像素边缘检测算法——基于正交多项式拟合的亚像素边缘检测算法。首先,利用传统的Sobel算子完成边缘点整像素级别的检测,确定边缘的主体区域;然后,...
  • 一种快速亚像素边缘检测算法的实现的理论,可以快速实现亚像素的算法,在时间上有一定的优势,先看理论,然后自己通过理论用C++实现
  • 基于Zernike矩的亚像素边缘检测
  • 亚像素边缘检测算法

    2018-11-24 10:25:59
    在分析Tabatabai提出的灰度矩亚像素边缘检测算法的基础上,指出灰度矩算法存在 边缘判断条件不够完善和未能考虑模板效应的问题,提出了改进方法,考虑Tabatabai的灰度矩算 法产生很多虚假边缘,改进算法分析了各参数...
  • 执行快速准确的亚像素边缘检测,基于改进的zernike矩方法,有需要的可以下载~~
  • 利用正交矩来进行亚像素边缘检测的算法,首先通过计算图像3个不同阶次的Zernike正交矩,把理想阶跃灰度模型的4个参数映射到3个Zernike正交矩中;然后计算边缘所在直线的参数,确定边缘的亚像素级坐标。
  • 亚像素边缘检测技术是采用图像处理软件算法来提高检测精度的有效途径, 文中对矩法、拟合法和插值法等常用的亚像素边缘检测算法的原理、优点和不足进行了分析 ,提出了Sigmoid函数拟合的亚像素边缘定位算法....
  • 精确确定数字图像边缘的位置,对于图像测量非常重要。同时,图像获取过程中受到各种噪声的影响,...对几种代表性的亚像素边缘检测 技术进行了原理分析和性能比较。介绍了基于曲面拟合的和基于灰度矩的亚像素边缘检测算法。
  • 修改过的亚像素边缘检测修改过的亚像素边缘检测修改过的亚像素边缘检测
  • 亚像素边缘检测

    2018-07-20 19:14:45
    亚像素边缘检测,使用泰勒插值实现,有实现原理,有代码
  • 直接生成位图,提取出一个像素宽度的条纹。需要matlab的工具箱
  • 亚像素边缘检测的matlab代码,比一般的边缘检测代码精确
  • 本程序使用Zernike矩来进行边缘像素检测,并添加了一个例子,欢迎需要亚像素边缘检测的同学讨论。
  • 图像亚像素边缘检测

    2013-07-12 21:56:49
    的精确亚像素边缘检测方法。用简单阈值法对待检零件图像进行二值化;用团块面积阈值法去除待检 零件图像中的噪声;用二值数学形态学方法进行像素级边缘检测获得单像素宽连通的像素级轮廓;用基 于三次样条插值的9 ×9...
  • 灰度距亚像素边缘检测

    热门讨论 2013-06-15 22:39:22
    基于灰度矩的亚像素边缘检测,精确度可以达到0.1-0.2个像素,内附源代码及主要参考文献,仅供学习参考!
  • 提出一种新算法将像素级算子sobel,log,prewitt,roberts,zerocross和canny分别与Zemike矩算子及搜索算法相结合,并对边缘检测结果进行比较,从中选取较优的算子来实现医学图像亚像素边缘检测。实验结果表明该算法...
  • 首先,建立亚像素边缘模型,利用各级 Franklin 矩的卷积来提取图像边缘点的细节特征;然后,依据Franklin 矩的旋转不变性原理,分析图像边缘旋转至垂直方向后各级 Franklin 矩之间的关系,从而确定图像中亚像素边缘的...
  • 一种有效的几何矩方法,利用六个矩模板得到灰度跳变高度,背景灰度级,像素中心到边缘的距离与角度,使边缘定位达到亚像素级.
  • 利用opencv的亚像素级别的边缘检测和获取,添加了原有程序的包含文件和库,可以直接调试运行,个边参数可以根据实际情形修改
  • Zernik矩亚像素边缘检测

    千次阅读 热门讨论 2020-10-30 18:26:43
    Zernik矩亚像素边缘检测 在网上看到有人写的Zernike矩亚像素边缘检测,发现存在很大的问题,赌气自己写了一个版本,力求精简,没有做过多优化。模板采用(7,7),借用Opencv的数据结构。如有问题欢迎指出。 关于...

    Zernik矩亚像素边缘检测

    在网上看到有人写的Zernike矩亚像素边缘检测,发现存在很大的问题,赌气自己写了一个版本,力求精简,没有做过多优化。模板采用(7,7),借用Opencv的数据结构。如有问题欢迎指出。
    关于Zernike矩求亚像素的原理,可以百度,有很多资源,下面是本人参考的文献:
    Zernike矩亚像素原理
    下面直接上代码:

    #include <string>
    #include <opencv2/opencv.hpp>
    #include <vector>
    using namespace cv;
    using namespace std;
    
    
    
    const double PI = 3.14159265358979323846;
    const int g_N = 7;
    const int h_N = 3;
    Mat M00 = (Mat_<float>(7, 7) <<
    	0, 0.0287, 0.0686, 0.0807, 0.0686, 0.0287, 0,
    	0.0287, 0.0815, 0.0816, 0.0816, 0.0816, 0.0815, 0.0287,
    	0.0686, 0.0816, 0.0816, 0.0816, 0.0816, 0.0816, 0.0686,
    	0.0807, 0.0816, 0.0816, 0.0816, 0.0816, 0.0816, 0.0807,
    	0.0686, 0.0816, 0.0816, 0.0816, 0.0816, 0.0816, 0.0686,
    	0.0287, 0.0815, 0.0816, 0.0816, 0.0816, 0.0815, 0.0287,
    	0, 0.0287, 0.0686, 0.0807, 0.0686, 0.0287, 0);
    
    Mat M11R = (Mat_<float>(7, 7) <<
    	0, -0.015, -0.019, 0, 0.019, 0.015, 0,
    	-0.0224, -0.0466, -0.0233, 0, 0.0233, 0.0466, 0.0224,
    	-0.0573, -0.0466, -0.0233, 0, 0.0233, 0.0466, 0.0573,
    	-0.069, -0.0466, -0.0233, 0, 0.0233, 0.0466, 0.069,
    	-0.0573, -0.0466, -0.0233, 0, 0.0233, 0.0466, 0.0573,
    	-0.0224, -0.0466, -0.0233, 0, 0.0233, 0.0466, 0.0224,
    	0, -0.015, -0.019, 0, 0.019, 0.015, 0);
    
    Mat M11I = (Mat_<float>(7, 7) <<
    	0, -0.0224, -0.0573, -0.069, -0.0573, -0.0224, 0,
    	-0.015, -0.0466, -0.0466, -0.0466, -0.0466, -0.0466, -0.015,
    	-0.019, -0.0233, -0.0233, -0.0233, -0.0233, -0.0233, -0.019,
    	0, 0, 0, 0, 0, 0, 0,
    	0.019, 0.0233, 0.0233, 0.0233, 0.0233, 0.0233, 0.019,
    	0.015, 0.0466, 0.0466, 0.0466, 0.0466, 0.0466, 0.015,
    	0, 0.0224, 0.0573, 0.069, 0.0573, 0.0224, 0);
    
    Mat M20 = (Mat_<float>(7, 7) <<
    	0, 0.0225, 0.0394, 0.0396, 0.0394, 0.0225, 0,
    	0.0225, 0.0271, -0.0128, -0.0261, -0.0128, 0.0271, 0.0225,
    	0.0394, -0.0128, -0.0528, -0.0661, -0.0528, -0.0128, 0.0394,
    	0.0396, -0.0261, -0.0661, -0.0794, -0.0661, -0.0261, 0.0396,
    	0.0394, -0.0128, -0.0528, -0.0661, -0.0528, -0.0128, 0.0394,
    	0.0225, 0.0271, -0.0128, -0.0261, -0.0128, 0.0271, 0.0225,
    	0, 0.0225, 0.0394, 0.0396, 0.0394, 0.0225, 0);
    
    Mat M31R = (Mat_<float>(7, 7) <<
    	0, -0.0103, -0.0073, 0, 0.0073, 0.0103, 0,
    	-0.0153, -0.0018, 0.0162, 0, -0.0162, 0.0018, 0.0153,
    	-0.0223, 0.0324, 0.0333, 0, -0.0333, -0.0324, 0.0223,
    	-0.0190, 0.0438, 0.0390, 0, -0.0390, -0.0438, 0.0190,
    	-0.0223, 0.0324, 0.0333, 0, -0.0333, -0.0324, 0.0223,
    	-0.0153, -0.0018, 0.0162, 0, -0.0162, 0.0018, 0.0153,
    	0, -0.0103, -0.0073, 0, 0.0073, 0.0103, 0);
    
    Mat M31I = (Mat_<float>(7, 7) <<
    	0, -0.0153, -0.0223, -0.019, -0.0223, -0.0153, 0,
    	-0.0103, -0.0018, 0.0324, 0.0438, 0.0324, -0.0018, -0.0103,
    	-0.0073, 0.0162, 0.0333, 0.039, 0.0333, 0.0162, -0.0073,
    	0, 0, 0, 0, 0, 0, 0,
    	0.0073, -0.0162, -0.0333, -0.039, -0.0333, -0.0162, 0.0073,
    	0.0103, 0.0018, -0.0324, -0.0438, -0.0324, 0.0018, 0.0103,
    	0, 0.0153, 0.0223, 0.0190, 0.0223, 0.0153, 0);
    
    Mat M40 = (Mat_<float>(7, 7) <<
    	0, 0.013, 0.0056, -0.0018, 0.0056, 0.013, 0,
    	0.0130, -0.0186, -0.0323, -0.0239, -0.0323, -0.0186, 0.0130,
    	0.0056, -0.0323, 0.0125, 0.0406, 0.0125, -0.0323, 0.0056,
    	-0.0018, -0.0239, 0.0406, 0.0751, 0.0406, -0.0239, -0.0018,
    	0.0056, -0.0323, 0.0125, 0.0406, 0.0125, -0.0323, 0.0056,
    	0.0130, -0.0186, -0.0323, -0.0239, -0.0323, -0.0186, 0.0130,
    	0, 0.013, 0.0056, -0.0018, 0.0056, 0.013, 0);
    
    
    int main()
    {
    	cv::Mat gray_img, med_img, canny_img, border_img, border_edge;
    	string image_path = "lena.jpg";
    	gray_img = cv::imread(image_path, 0);                                                         //以灰度图形式读取
    	cv::medianBlur(gray_img, med_img, 5);                                                         //中值滤波,不是必须,只为消除部分椒盐噪声
    	cv::Canny(med_img, canny_img, 80, 120);                                                       //canny边缘检测,进行初定位,获取初始边缘
    	//由于图像用到的模板为7*7的,所以先对图像进行边缘扩展
    	copyMakeBorder(med_img, border_img, h_N, h_N, h_N, h_N, cv::BORDER_REPLICATE);
    	copyMakeBorder(canny_img, border_edge, h_N, h_N, h_N, h_N, cv::BORDER_REPLICATE);
    	float Z00 = 0, Z11_I = 0, Z11_R = 0, Z20 = 0, Z31_I = 0, Z31_R = 0, Z40 = 0;                 //不同模板的卷积值
    	cv::Mat roi_img;
    	float theta1, theta3,Zz11, Zz31, Zz20, Zz40, l, r, t;
    	float x, y;
    	vector<cv::Point2f> sub_pixel_edge;
    	//对初始边缘进行亚像素边缘求取
    	for (int i = h_N; i < border_img.rows - h_N; i++)
    	{
    		for (int j = h_N; j < border_img.cols - h_N; j++)
    		{
    			if (border_edge.at<uchar>(i, j) == 255)
    			{	
    				//卷积
    				border_img(cv::Rect(j - h_N, i - h_N, g_N, g_N)).convertTo(roi_img, CV_32FC1);
    				Z00 = roi_img.dot(M00);
    				Z11_I = roi_img.dot(M11I);
    				Z11_R = roi_img.dot(M11R);
    				Z20 = roi_img.dot(M20);
    				/*Z31_I = roi_img.dot(M31I);
    				Z31_R = roi_img.dot(M31R);
    				Z40 = roi_img.dot(M40);	*/
    				theta1 = atan(Z11_I / Z11_R);                                                       //旋转角度计算          
    				Zz11 = Z11_R * cos(theta1) + Z11_I * sin(theta1);                                   //各阶Zernike矩旋转后结果
    
    				l = Z20 / Zz11;                                                                     //边缘距离圆心的距离
    				r = 1.5 * Zz11 / sqrt(pow(1 - pow(l, 2), 3));                                       //阶跃幅度
    				t = (Z00 - r * PI / 2 + r * asin(l) + r * l * sqrt(1 - pow(l, 2))) / PI;            //背景灰度值计算
    
    				//计算亚像素位置
    				x = j + g_N / 2.0 * l * cos(theta1) - h_N;                                          //根据公式计算即可,因扩充了边缘需要减去                
    				y = i + g_N / 2.0 * l * sin(theta1) - h_N;
    				cv::Point2f sub_pixel_point(x, y);
    				sub_pixel_edge.push_back(sub_pixel_point);                                          //存储亚像素边缘位置
    			}			
    		}
    	}
    
    	cv::Mat draw_image;
    	cv::cvtColor(canny_img, draw_image, cv::COLOR_GRAY2RGB);
    	//绘制亚像素边缘图
    	for (int i = 0; i < sub_pixel_edge.size(); i++)
    	{
    		circle(draw_image, sub_pixel_edge[i], 0, Scalar(255, 0, 255), 1, 0, 0);
    	}
    	imshow("sub pixel edge", draw_image);
    	cv::waitKey();
    	return 0;
    }
    

    原图如下:
    Canny结果如下
    在这里插入图片描述
    亚像素结果如下:
    在这里插入图片描述
    图中白色为Canny的像素位置,红色为亚像素的位置。因为图像像素只能画出整像素位置,所以仅供显示,看一下效果。若要准确对比相对位置,可以把亚像素坐标存储起来,用matlab画出来进行对比。

    展开全文
  • 亚像素边缘检测源代码

    热门讨论 2010-07-29 19:08:31
    本压缩包包括一个亚像素边缘检测源代码,以及一个测试图片,从亚像素的角度去解决边缘检测问题,并且与Canny算子做比较,效果显著!
  • 但是,随着科学技术的飞速发展,工业检测等应用对精确度的要求不断提高,传统的像素级边缘检测方法已经不能满足实际测量的需要,本文重点介绍的亚像素边缘检测能将检测精度提高到亚像素级别。 2 主题 2.1 亚像素定位...

    一、获取代码方式

    **获取代码方式1:**私信博主

    **获取代码方式2:已上传CSDN,平台审核中

    二、插值法亚像素边缘检测简介

    1 引言
    数字图像的边缘检测是图像分割、目标识别、区域形状提取等图像处理领域的重要基础。在进行图像理解和分析时,第一步往往是边缘检测。目前边缘检测已经成为机器视觉领域最活跃的课题之一,其研究具有非常重要的理论意义和实际应用价值。传统的边缘检测方法的检测精度最高只能达到一个像素级,但是,随着科学技术的飞速发展,工业检测等应用对精确度的要求不断提高,传统的像素级边缘检测方法已经不能满足实际测量的需要,本文重点介绍的亚像素边缘检测能将检测精度提高到亚像素级别。

    2 主题

    2.1 亚像素定位原理
    亚像素是将像素这个基本单位再进行细分,它是比像素还小的单位,从而提高了图像分辨率。通常情况下,亚像素边缘点存在于图像中逐渐发生过度变化的区域,我们可以利用多项式拟合等多种方法获得边缘点的亚像素位置。亚像素定位可以理解为在摄像系统硬件条件不变的情况下,用软件算法来提高边缘检测精度的方法,或者说是一种可以使分辨率小于一个像素的图像处理技术。
    亚像素定位技术的应用具有一定的前提条件:1、被检测目标不是由孤立的、单个的像素点组成,而是由多个像素点组成,且这些像素点应具有一定的分布特性,如灰度分布、几何形状分布特性等;2、一般情况下,不同的目标都具有各自的特征,主要包括基于目标的灰度分布特征、几何形状特征、几何与灰度耦合特征等,能够分析并利用已知的目标特征,通过对被检测目标图像的分析、识别,最后确定出目标的准确位置。在此分析定位的过程中,采用浮点运算对目标图像进行定位,得到的目标定位精度高于整像素级的定位精度。这种利用目标特性从图像中分析,计算出最符合此特征的目标位置的方法称为图像目标亚像素定位技术。

    2.2 亚像素定位国内外发展现状
    目前研究的亚像素级的边缘检测算法,可以归纳为3种类型:矩方法、插值法和拟合法。

    2.2.1 矩方法
    Tabatabai等首先提出一种利用前三阶灰度矩对边缘进行亚像素边缘定位的算法 ,随后基于空间矩、Zernike正交矩的方法也相继被提出。Zernike矩的方法由于只需要计算3个模板,计算量比空间矩的方法要小得多。但是 ,这些方法都是针对理想边缘模型提出的。Shan等对矩方法进行了改进,使用了模糊边缘模型,更能真实反映边缘信息。矩方法的优点是计算简便,并且可以得到解析解。但是矩方法对图像噪声敏感,如果考虑模糊后的边缘模型,就会增加模型参数,使得解析解的确定变得十分困难。

    2.2.2 插值法

    插值法的核心是对像素点的灰度值或灰度值的导数进行插值,增加信息,以实现亚像素边缘检测。其中,研究比较多的方法有二次插值、B样条插值和切比雪夫多项式插值等。插值类的运算时间短,二次插值算法简单,可以通过硬件实现,适合在线检测。当光学系统的线扩散函数对称时,插值边缘检测的精度较高。插值法的特点同基于矩的方法类似,计算过程简单,但是容易受噪声的影响。

    2.2.3 拟合法
    拟合方法是通过对假设边缘模型灰度值进行拟合来获得亚像素的边缘定位。Nalwa等给出一种边缘模型为双曲正切函数的最小二乘拟合算法;Ye等提出的算法所用的边缘模型是理想边缘模型与高斯函数卷积得到的高斯型边缘函数。这两种算法都能提供较高的亚像素边缘定位精度。由于拟合不需要数值微分,而且按各灰度值到拟合曲线的距离最小进行拟合,不但合理地利用了有误差的灰度值,又可以减小灰度值误差的影响,因此拟合方法对噪声不敏感。但因模型复杂,其求解速度慢。

    2.2.4 相关改进算法

    1 基于改进形态学梯度和Zernike矩的亚像素边缘检测方法
    该算法先利用改进的数学形态学梯度算子进行边缘点的粗定位,在像素级上确定边缘点的坐标和梯度方向;然后再根据构造的边缘点向量和参考阈值,用Zernike矩算法对边缘点进行亚像素的重新定位,实现图像的亚像素边缘检测。这种复合的图像边缘亚像素检测算法,能够很好地融合数学形态学梯度算子及Zernike矩算法的优点,具备良好的抗噪性能与亚像素精确定位能力,其计算量相对较少,能快速实现CCD图像测量系统的亚像素边缘检测。此外,由于一般测量图像简单且对比度高,若采用适当的模板窗口,该算法可具有良好的处理效率,能够满足一般图像测量系统的实时性、亚像素精确测量要求,具备良好的应用前景。

    2 基于改进的形态学梯度的样条插值亚像素边缘检测方法
    此改进方法是将改进的形态学梯度滤波算子与三次样条插值法结合起来进行边缘检测,首先利用改进的数学形态学梯度滤波算子进行边缘点的粗定位,得到图像的像素级边缘;然后再利用三次样条插值法对提取出的边缘图像进行插值运算,即亚像素精定位。最后将插值后的边缘进行细化,可得到亚像素级边缘图像。

    3 基于贝塞尔边缘模型的亚像素边缘检测算法

    该算法首先在原有的贝塞尔点扩散函数中引入修正参数 t,并与理想边缘模型卷积,获得可修正的贝塞尔边缘灰度模型;然后,利用图像边缘的信息对该模型进行最小二乘拟合,在拟合过程中,通过修正参数 t 对边缘模型进行修正,最终获得精确的边缘模型 ,同时考虑数字采样等因素对灰度分布的影响,得到图像边缘的亚像素位置。
    关于亚像素边缘检测的改进算法还有很多,如胡树杰提出的图像亚像素检测新方法,提出了一种改进的基于正交傅里叶变换的新方法,提高了部分数字图像的亚像素边缘检测的准确性。陆凯等提出的一种快速的亚像素图像配准算法,速度较类似算法速度有较大的提高,等等。

    3 总结
    通常情况下,提高检测系统精度最直接的方法是提高摄像机的硬件分辨率,但价格相当昂贵。如果将512×512的摄像机分辨率提升到1024×1024,会相差几倍,甚至十几倍的价格,同时,系统的图像存储容量和图像传输速度都要随之提升,否则会造成硬件方面的不匹配。因此,通过提高硬件分辨率来提高测量系统精度的方法是不经济的,同时在各种视觉系统应用中还受到一定的限制。因此,研究利用软件处理的方法来提高测量系统的检测精度,即亚像素边缘检测方法,具有十分重大的意义。
    采用多种算法相结合是提高检测精度的一个思路,如形态学和Zernike矩, 改进的形态学梯度和样条插值等。

    在亚像素边缘检测方面,前人已经做了很多工作,但往往只对某些特定领域比较有效,通用的方法还是比较少,不同领域还需运用不同方法。

    三、部分源代码

    clear
    clc
    II=imread('1.bmp');
    II=rgb2gray(II);
    II=im2bw(II,0.25);
    % II=medfilt2(II);
    figure(1),imshow(II)
    I=double(II);
    [m,n]=size(I);
    
    ff=edge(I,'canny',0.1);
    figure(2),imshow(ff)
    t1=clock;
    tic;
    f=double(ff);
    %求原函数梯度函数
    R=zeros(m,n);
    for xi=2:1:m-1
       
            R(xi,yi)=abs(I(xi+1,yi+1)+2*I(xi,yi+1)+I(xi-1,yi+1)-I(xi-1,yi-1)-2*I(xi,yi-1)-I(xi+1,yi-1))+abs(I(xi-1,yi-1)+2*I(xi-1,yi)+I(xi-1,yi+1)-I(xi+1,yi+1)-2*I(xi+1,yi)-I(xi+1,yi-1));
        end
    end
    %开始求坐标
    figure(4),imshow(R)
    nn=1;
    W=zeros(m,n);
    for x=2:1:m-1
        for y=2:1:n-1
            if f(x,y)==0
               W(x,y)=0;
            else
                i=[R(x-1,y),R(x,y),R(x+1,y)];
                j=[R(x,y-1),R(x,y),R(x,y+1)];
                if (( (i(2)>i(1))||(i(2)>i(3)) )||( (j(2)>j(1))||(j(2)>j(3)) ))
                    Xe=x+(i(1)-i(3))/((i(1)-2*i(2)+i(3))+eps);%求亚像素边缘坐标[Xe,Ye]
                    Ye=y+(j(1)-j(3))/((j(1)-2*j(2)+j(3))+eps);
                    if (Xe<m)&(Xe>0)&(Ye<n)&(Ye>0)
                        
                        nn=nn+1;                              
                    end
    

    四、运行结果

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

    五、matlab版本及参考文献

    1 matlab版本
    2014a

    2 参考文献
    [1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
    [2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
    [3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
    [4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,935
精华内容 1,174
关键字:

亚像素边缘检测