精华内容
下载资源
问答
  • 利用opencv亚像素级别的边缘检测和获取,添加了原有程序的包含文件和库,可以直接调试运行,个边参数可以根据实际情形修改
  • opencv亚像素边缘检测

    千次阅读 2021-01-28 10:02:57
    一种新的基于 Zernike 正交矩像素边缘定位的直径测量方法 [J], 宋晋国; 党 宏社; 洪英; 梁勇 2.一种改进的正交 Fourier-Mellin 矩亚像素边缘检测算法 [C.......提出一种新的亚像素边缘检测方法,...2005 Laser 第 1...

    一种新的基于 Zernike 正交矩亚像素边缘定位的直径测量方法 [J], 宋晋国; 党 宏社; 洪英; 梁勇 2.一种改进的正交 Fourier-Mellin 矩亚像素边缘检测算法 [C......

    本文提出一种新的亚像素精度的边缘检测算法 . 该方法给出了一种可修正的贝塞尔点扩...

    一种亚像素边缘检测方法_IT/计算机_专业资料。提出一种新的亚像素边缘检测方法,...

    2005 Laser 第 16 卷第 8 期 2005 年 8 月 Journal of Optoelectronics 图像的快速亚像素边缘检测方法 * 刘力双 , 张 铫 , 卢慧卿 , 赵 琳 , 王宝光 ......

    因此利用文献[ 所检测的亚像素边缘点进 。 行跟踪及后续处理 亚像素边缘点不一定位于像点中心, 即其坐 , 标不一定为整数 因此直接利用亚像素边缘点确 定后续......

    在视觉检测 系统中,亚像素边缘的检测、定位精度是其测量的关键,国 内外很多学者对该问题进行了广泛研究,已提出很多边缘检 测方法,如灰度矩法、空间矩法 [1] 、......

    通用亚像素边缘检测算法_盛遵冰_物理_自然科学_专业资料。第 41 卷第 6 期...

    基于亚像素边缘检测的二维条码识别甘摘 岚 1, 刘宁钟 2 (1.华东交通大学信...

    基于Sigmoid函数拟合的亚像素边缘检测方法_数学_自然科学_专业资料。第 3...

    (2014)02—0290.04 基于三次样条插值的亚像素边缘检测方法 孙秋成1...

    Company LOGO 基于海森矩阵的亚像素图像边缘特征提取 班级:信研1403 姓名:杨明 1 亚像素边缘检测意义 亚像素边缘检测方法 2 3 4 5 海森矩阵检测方法原理程序流程......

    摘法 要: 针对传统边缘检测算法的定位精度低 、 对噪声敏感等缺 点, 提 出基于函数 曲线拟合 的亚像素边 缘检测算 梯度方向高斯曲线拟合亚像素定位算 法。该......

    基于反正切函数拟合的亚像素边缘检测方法_电子/电路_工程科技_专业资料。数字图像...

    亚像素边缘定位算法的稳定性分析_数学_自然科学_专业资料。亚像素精度边缘检测 第...

    实验结果表明,该方法的相对定位误差小于1%. 关键词:结构光;格雷码;边缘检测;亚像素定位;拟合 中图分类号:TH471 文献标识码:A ASub-PixelStripeEdgeDetectionBased......

    然而由于各种物理条件(如摄像 机,存储器等)的限制,所获取图像分析的关键步骤,边缘的定位精度直接影响 到尺寸检测的精度。 3.1 基于曲面拟合的亚像素边缘检测方法 ......

    edu. cn 。 一种改进的灰度矩亚像素边缘检测算法罗 ,侯 ,付 钧艳丽 (...

    本文提出了一种改进的基于正交傅里叶变换的新方法,提高了部分数字图像的亚像素边缘检测的准确性。首先,使用这些矩的低径向阶和旋转不变性描述图像中的小物体,其次,......

    【期刊名称】《计量技术》 【年(卷),期】2005(000)002 【总页数】3 页(P14-16) 【关键词】边缘检测;亚像素算法;垂直占空比;计算机视觉 【作者】廖常俊;......

    为目标函数 点数m,未知数n(m>=n),得到超定方程组 BC=Y 机器视觉测量技术 2、常用拟合亚像素边缘定位法 1) 边缘灰度拟合 三次多项式拟合边缘灰度值,拐点为......

    展开全文
  • 亚像素边缘检测算法

    2018-11-24 10:25:59
    在分析Tabatabai提出的灰度矩亚像素边缘检测算法的基础上,指出灰度矩算法存在 边缘判断条件不够完善和未能考虑模板效应的问题,提出了改进方法,考虑Tabatabai的灰度矩算 法产生很多虚假边缘,改进算法分析了各参数...
  • 一种快速亚像素边缘检测算法的实现的理论,可以快速实现像素的算法,在时间上有一定的优势,先看理论,然后自己通过理论用C++实现
  • 亚像素边缘检测技术是采用图像处理软件算法来提高检测精度的有效途径, 文中对矩法、拟合法和插值法等常用的亚像素边缘检测算法的原理、优点和不足进行了分析 ,提出了Sigmoid函数拟合的像素边缘定位算法....
  • 亚像素边缘检测

    2017-12-25 20:04:31
    亚像素边缘检测,使用泰勒插值实现,有实现原理,有代码
  • 图像亚像素边缘检测

    2013-07-12 21:56:49
    的精确亚像素边缘检测方法。用简单阈值法对待检零件图像进行二值化;用团块面积阈值法去除待检 零件图像中的噪声;用二值数学形态学方法进行像素级边缘检测获得单像素宽连通的像素级轮廓;用基 于三次样条插值的9 ×9...
  • 从而得到像素级别的边缘点的坐标(也就是float类型的坐标),一般来说,现有的技术可以做到2细分、4细分,甚至很牛的能做到更高,通过亚像素边缘检测技术的使用,可以节约成本,提高识别精...

    在做物体检测时,由于成本和应用场合的限制,不能够一味地增加相机的分辨率,或者已经用了分辨率很高的相机,但是视野范围很大,仍然无法实现很高的精度,这时就要考虑亚像素技术,亚像素技术就是在两个像素点之间进行进一步的细分,从而得到亚像素级别的边缘点的坐标(也就是float类型的坐标),一般来说,现有的技术可以做到2细分、4细分,甚至很牛的能做到更高,通过亚像素边缘检测技术的使用,可以节约成本,提高识别精度。

        常见的亚像素技术包括灰度矩、Hu矩、空间矩、Zernike矩等,通过查阅多篇论文,综合比较精度、时间和实现难度,选择Zernike矩作为项目中的亚像素边缘检测算法。基于Zernike矩的边缘检测原理,下一篇文章详细再总结一下,这里大体把步骤说一下,并使用OpenCV实现。

        大体步骤就是,首先确定使用的模板大小,然后根据Zernike矩的公式求出各个模板系数,例如我选择的是7*7模板(模板越大精度越高,但是运算时间越长),要计算M00,M11R,M11I,M20,M31R,M31I,M40七个Zernike模板。第二步是对待检测图像进行预处理,包括滤波二值化等,也可以在进行一次Canny边缘检测。第三步是将预处理的图像跟7个Zernike矩模板分别进行卷积,得到7个Zernike矩。第四步是把上一步的矩乘上角度校正系数(这是因为利用Zernike的旋转不变性,Zernike模型把边缘都简化成了x=n的直线,这里要调整回来)。第五步是计算距离参数l和灰度差参数k,根据k和l判断该点是否为边缘点。以下是基于OpenCV的实现。

    #include <math.h>
    #include <opencv2/opencv.hpp>
     
    using namespace std;
    using namespace cv;
     
    const double PI = 3.14159265358979323846;
    const int g_N = 7;
     
    Mat M00 = (Mat_<double>(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_<double>(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_<double>(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_<double>(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_<double>(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_<double>(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_<double>(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()
    {
    	Mat OriginalImage = imread("original.png", 0);
    	Mat SubImage = OriginalImage;
    	Mat NewSmoothImage;
    	medianBlur(OriginalImage, NewSmoothImage, 13);
    	Mat NewAdaThresImage;
    	adaptiveThreshold(NewSmoothImage, NewAdaThresImage, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY_INV, 7, 4);
    	vector<Point2d> SubEdgePoints;
     
    	Mat ZerImageM00;
    	filter2D(NewAdaThresImage, ZerImageM00, CV_64F, M00, Point(-1, -1), 0, BORDER_DEFAULT);
    	//filter2D( cannyImage, zerImageM00, CV_64F, M00, Point(-1,-1), 0, BORDER_DEFAULT);
     
    	Mat ZerImageM11R;
    	filter2D(NewAdaThresImage, ZerImageM11R, CV_64F, M11R, Point(-1, -1), 0, BORDER_DEFAULT);
    	//filter2D( cannyImage, zerImageM11R, CV_64F, M11R, Point(-1, -1), 0, BORDER_DEFAULT);
     
    	Mat ZerImageM11I;
    	filter2D(NewAdaThresImage, ZerImageM11I, CV_64F, M11I, Point(-1, -1), 0, BORDER_DEFAULT);
    	//filter2D( cannyImage, zerImageM11I, CV_64F, M11I, Point(-1, -1), 0, BORDER_DEFAULT);
     
    	Mat ZerImageM20;
    	filter2D(NewAdaThresImage, ZerImageM20, CV_64F, M20, Point(-1, -1), 0, BORDER_DEFAULT);
    	//filter2D( cannyImage, zerImageM20, CV_64F, M20, Point(-1, -1), 0, BORDER_DEFAULT);
     
    	Mat ZerImageM31R;
    	filter2D(NewAdaThresImage, ZerImageM31R, CV_64F, M31R, Point(-1, -1), 0, BORDER_DEFAULT);
    	//filter2D(cannyImage, zerImageM31R, CV_64F, M31R, Point(-1, -1), 0, BORDER_DEFAULT);
     
    	Mat ZerImageM31I;
    	filter2D(NewAdaThresImage, ZerImageM31I, CV_64F, M31I, Point(-1, -1), 0, BORDER_DEFAULT);
    	//filter2D(cannyImage, zerImageM31I, CV_64F, M31I, Point(-1, -1), 0, BORDER_DEFAULT);
     
    	Mat ZerImageM40;
    	filter2D(NewAdaThresImage, ZerImageM40, CV_64F, M40, Point(-1, -1), 0, BORDER_DEFAULT);
    	//filter2D(cannyImage, zerImageM40, CV_64F, M40, Point(-1, -1), 0, BORDER_DEFAULT);
     
     
     
    	int row_number = NewAdaThresImage.rows;
    	int col_number = NewAdaThresImage.cols;
    	//使用7个的7*7的Zernike模板(其本质是个矩阵)M00、M11R、M11I、M20、M31R、M31I、M40,分别与图像进行卷积,得到每个像素点的七个Zernike矩Z00、Z11R、Z11I、Z20、Z31R、Z31I、Z40
    	//对于每个点,根据它的七个Zernike矩,求得距离参数l和灰度差参数k,当l和k都满足设定的条件时,则判读该点为边缘点,并进一步利用上述7个Zernike矩求出该点的亚像素级坐标
    	//如果l或k不满足设定的条件,则该点不是边缘点,转到下一个点求解距离参数l和灰度差参数k
    	for (int i = 0; i < row_number; i++)
    	{
    		for (int j = 0; j <col_number; j++)
    		{
    			if (ZerImageM00.at<double>(i, j) == 0)
    			{
    				continue;
    			}
     
    			//compute theta
    			//vector<vector<double> > theta2(0);
    			double theta_temporary = atan2(ZerImageM31I.at<double>(i, j), ZerImageM31R.at<double>(i, j));
    			//theta2[i].push_back(thetaTem);
     
    			//compute Z11'/Z31'
    			double rotated_z11 = 0.0;
    			rotated_z11 = sin(theta_temporary)*(ZerImageM11I.at<double>(i, j)) + cos(theta_temporary)*(ZerImageM11R.at<double>(i, j));
    			double rotated_z31 = 0.0;
    			rotated_z31 = sin(theta_temporary)*(ZerImageM31I.at<double>(i, j)) + cos(theta_temporary)*(ZerImageM31R.at<double>(i, j));
     
    			//compute l
    			double l_method1 = sqrt((5 * ZerImageM40.at<double>(i, j) + 3 * ZerImageM20.at<double>(i, j)) / (8 * ZerImageM20.at<double>(i, j)));
    			double l_method2 = sqrt((5 * rotated_z31 + rotated_z11) / (6 * rotated_z11));
    			double l = (l_method1 + l_method2) / 2;
    			//compute k/h
    			double k, h;
    		
    			k = 3 * rotated_z11 / 2 / pow((1 - l_method2*l_method2), 1.5);
    			h = (ZerImageM00.at<double>(i, j) - k*PI / 2 + k*asin(l_method2) + k*l_method2*sqrt(1 - l_method2*l_method2)) / PI;
     
    			//judge the edge
    			double k_value = 20.0;
    		
    			double l_value = sqrt(2) / g_N;
    		
    			double absl = abs(l_method2 - l_method1);
    			if (k >= k_value && absl <= l_value)
    			{
    				Point2d point_temporary;
    				point_temporary.x = j + g_N*l*cos(theta_temporary) / 2;
    				point_temporary.y = i + g_N*l*sin(theta_temporary) / 2;
    				SubEdgePoints.push_back(point_temporary);
    			}
    			else
    			{
    				continue;
    			}
    		}
    	}
    	//显示所检测到的亚像素边缘
    	for (size_t i = 0; i < SubEdgePoints.size(); i++)
    	{
    	    Point center_forshow(cvRound(SubEdgePoints[i].x), cvRound(SubEdgePoints[i].y));
    		circle(OriginalImage, center_forshow, 1, Scalar(0, 97, 255), 1, 8, 0);
    	}
    	imshow("亚像素边缘", OriginalImage);
    	
    	waitKey(0);
    	return 0;
    }
    

     

     

    ---------------------------------------7.28更新分割线-------------------------------------------------

    1.因为留言要源代码的朋友比较多,所以我把上面的代码补完整了,新的代码能够实现基本的过程,但是针对不同的应用,肯定不是最优的效果,可能需要根据不同的应用场合进行调整;

    2.评论里提到的双层轮廓,我能想到的是因为对线进行边缘检测操作,因为线的两侧相当于都是前景和背景的边缘,所以两侧各会有一层边缘,不管是Canny(事实上不少Zernike论文都建议先用canny再用Zernike)还是二值化,只要送入Zernike的是线而不是区域,就会有双层轮廓,其他的原因我暂时还没想到,欢迎大家赐教;

    3.双层轮廓并不一定是坏事,比如做圆检测,最后是要用这些边缘点来拟合圆,那么两层轮廓拟合出来的圆放大了说应该是处于两层轮廓中间,这样的结果其实更符合实际情况,但是如果不是规则轮廓,可能会对边缘点的表达和拟合有些问题;

    转载自:https://blog.csdn.net/zilanpotou182/article/details/69848610

    展开全文
  • 本发明专利技术提供一种亚像素边缘检测方法,包括如下步骤:获取图像;图像预处理;像素计算;生成像素边缘。本发明专利技术采用了像素的像素处理策略,有效地摆脱了由于像素点过大造成的精度丢失问题,能找到...

    本发明专利技术提供一种亚像素边缘检测方法,包括如下步骤:获取图像;图像预处理;亚像素计算;生成亚像素边缘。本发明专利技术采用了亚像素的像素处理策略,有效地摆脱了由于像素点过大造成的精度丢失问题,能找到更为真实的图像边缘,提高了视觉测量的准确性,可作为高精度机器视觉测量的预处理步骤。

    Subpixel edge detection method

    The invention provides a sub-pixel edge detection method, which comprises the following steps of: acquiring an image; image preprocessing; sub-pixel calculation; generating sub-pixel edge. The invention adopts the pixel processing strategy of subpixel, effectively get rid of the pixels caused by excessive loss of precision, can find a real image edge, and improve the accuracy of vision measurement, can be used as a preprocessing step for high precision machine vision measurement.

    【技术实现步骤摘要】

    本专利技术涉及机器视觉

    ,具体涉及一种亚像素边缘检测方法。

    技术介绍

    边缘检测是图像处理和计算机视觉中的基本问题,其目的是标识数字图像中亮度变化明显的点,因为图像属性中的显著变化通常反映了属性的重要事件和变化。边缘检测也是高精度机器视觉测量领域对所获取的图像进行分析判别的必要预处理步骤,在边缘被提取的前提下,其他基于边缘的诸如轮廓检测、尺寸测算等步骤才能进一步展开,从而完成整个高精度机器视觉的流程。目前,流行的方法有Canny算子、Sobel算子等成熟的像素级别的边缘检测算法,但是在现今高精度视觉测量领域,像素级别的边缘检测在精度水平上已经越来越不能满足需求,因此,亚像素边缘检测应运而生。所谓亚像素,就是将原本获取的图像的基础上,将其每个像素点再度进行拆分,使之用比像素更小的“亚像素”单位来表征图像。由于亚像素的尺寸较像素尺寸小,意味着其可以表征的精度比像素要高,可以满足一些较苛刻的高精度机器视觉检测任务的需求。然而,现有的亚像素边缘检测方法,存在由于像素点过大而造成精度丢失的问题,导致图像边缘不太真实,视觉测量的准确性不太高等问题。

    技术实现思路

    本专利技术的目的是提供一种亚像素边缘检测方法,利用亚像素边缘检测的算法对获取图像进行边缘检测,能有效解决由于像素点过大而造成精度丢失的问题,并以此作为高精度机器视觉测量的预处理步骤。为了实现上述目的,本专利技术采用的技术方案如下:一种亚像素边缘检测方法,包括如下步骤:(1)、获取图像;(2)、图像预处理;(3)、亚像素计算;(4)、生成亚像素边缘。根据以上方案,所述步骤(1)包括如下具体步骤:(11)、将物体置于透明玻璃片上;(12)、用远心镜头垂直于玻璃片拍摄照片。根据以上方案,所述步骤(2)包括如下具体步骤:(21)、对获取的图像进行中值滤波;(22)、计算图像中各像素水平梯度;(23)、计算图像中各像素垂直梯度。根据以上方案,所述步骤(3)包括如下具体步骤:(31)、找出像素点中水平梯度大于a的点,该点集合记为A;(32)、找出像素点中垂直梯度大于b的点,该点集合记为B;(33)、将集合A中的水平梯度点最大值和最小值相减得到c;(34)、将集合B中的垂直梯度点最大值和最小值相减得到d。根据以上方案,所述步骤(4)包括如下具体步骤:(41)、将集合A中的水平梯度最大值与A中各个点的水平梯度相减,所得差值除以c,再将该点的横坐标与此结果相减,得到亚像素级别的横坐标;(42)、将集合B中的垂直梯度最大值与A中各个点的垂直梯度相减,所得差值除以d,再将该点的纵坐标与此结果相减,得到亚像素级别的纵坐标;(43)、将横、纵坐标合并得到最终亚像素级别边缘点的坐标。本专利技术的有益效果是:与其他亚像素边缘检测方法相比,本专利技术采用了亚像素的像素处理策略,有效地摆脱了由于像素点过大造成的精度丢失问题,能找到更为真实的图像边缘,提高了视觉测量的准确性。附图说明图1是本专利技术的总流程示意图。具体实施方式下面结合附图与实施例对本专利技术的技术方案进行说明。本专利技术提供一种亚像素边缘检测方法,包括如下具体步骤(见图1):(1)、获取图像:(11)、将物体置于透明玻璃片上;(12)、用远心镜头垂直于玻璃片拍摄照片;(2)、图像预处理:(21)、对获取的图像进行中值滤波;(22)、计算图像中各像素水平梯度;(23)、计算图像中各像素垂直梯度;(3)、亚像素计算:(31)、找出像素点中水平梯度大于a的点,该点集合记为A;(32)、找出像素点中垂直梯度大于b的点,该点集合记为B;(33)、将集合A中的水平梯度点最大值和最小值相减得到c;(34)、将集合B中的垂直梯度点最大值和最小值相减得到d;(4)、生成亚像素边缘:(41)、将集合A中的水平梯度最大值与A中各个点的水平梯度相减,所得差值除以c,再将该点的横坐标与此结果相减,得到亚像素级别的横坐标;(42)、将集合B中的垂直梯度最大值与A中各个点的垂直梯度相减,所得差值除以d,再将该点的纵坐标与此结果相减,得到亚像素级别的纵坐标;(43)、将横、纵坐标合并得到最终亚像素级别边缘点的坐标。本专利技术可应用于机器视觉

    ,作为高精度机器视觉测量的预处理步骤。以上实施例仅用以说明而非限制本专利技术的技术方案,尽管上述实施例对本专利技术进行了详细说明,本领域的相关技术人员应当理解:可以对本专利技术进行修改或者同等替换,但不脱离本专利技术精神和范围的任何修改和局部替换均应涵盖在本专利技术的权利要求范围内。本文档来自技高网...

    【技术保护点】

    一种亚像素边缘检测方法,其特征在于,包括如下步骤:(1)、获取图像;(2)、图像预处理;(3)、亚像素计算;(4)、生成亚像素边缘。

    【技术特征摘要】

    1.一种亚像素边缘检测方法,其特征在于,包括如下步骤:

    (1)、获取图像;

    (2)、图像预处理;

    (3)、亚像素计算;

    (4)、生成亚像素边缘。

    2.根据权利要求1所述的亚像素边缘检测方法,其特征在于,所述步骤

    (1)包括如下具体步骤:

    (11)、将物体置于透明玻璃片上;

    (12)、用远心镜头垂直于玻璃片拍摄照片。

    3.根据权利要求1所述的亚像素边缘检测方法,其特征在于,所述步骤

    (2)包括如下具体步骤:

    (21)、对获取的图像进行中值滤波;

    (22)、计算图像中各像素水平梯度;

    (23)、计算图像中各像素垂直梯度。

    4.根据权利要求1所述的亚像素边缘检测方法,其特征在于,所述步骤

    (3)包括如下具体步骤:

    (31)、...

    【专利技术属性】

    技术研发人员:傅之成,邵卿,李晓强,赵洋洋,

    申请(专利权)人:傅之成,

    类型:发明

    国别省市:浙江;33

    展开全文
  • Matlab实现基于Zerniek矩的亚像素边缘检测
  • 本文主要讲解了canny边缘检测原理:计算梯度幅值和方向、根据角度对幅值进行非极大值抑制、用双阈值算法检测和连接边缘以及python 实现
  • opencv 亚像素 算法

    2020-12-22 12:41:59
    亚像素算法亚像素算法的基本思路就是将一个像素再分为更小的单位。也就是说1个像素的灰度值分为256级。所以,以这类系统为例,进行亚像素计算就要把像素分为255个小单位。或许,可以这样来理解“亚像素算法”。一个...

    亚像素算法亚像素算法的基本思路就是将一个像素再分为更小的单位。

    也就是说

    1

    个像素的灰度值分为

    256

    级。

    所以,

    以这类系统为例,

    进行亚像素计算就要把像

    素分为

    255

    个小单位。

    或许,

    可以这样来理解

    亚像素算法

    一个像素的灰度值从

    0

    255

    0

    是纯黑,

    255

    是纯白。不妨把像素想像成是一个由

    255

    个小像素所组成的集合。而每个小

    像素都是一个独立的小镜子,那就是说一个像素里面有

    255

    个小镜子。

    灰度值则可以看作反光的小镜子数量:

    0

    表示

    255

    个小镜子全都没有反光;

    255

    表示

    255

    镜子一起反光。上面讲到的所设定的临界灰度值

    100

    ,则可表示

    255

    个镜子中有

    100

    个在反

    光,另外

    155

    个镜子没有反光。

    现在,回到上面的测量例子中来。

    如何算亚像素值呢?非常简单,亚像素值(白色部分)=该像素灰度值

    /256

    ;亚像素值(黑

    色部分)=

    1

    -亚像素值(白色部分)

    另外,除了这种计算方法,还有其他几种计算亚像素值的方法:

    (

    1

    )亚像素值(白色部分)=(该像素灰度值

    ×

    (临界灰度值

    /256

    )

    )

    /256

    亚像素值(黑色

    部分)=

    1

    -亚像素值(白色部分)

    (

    2

    )亚像素值(白色部分)=后像素值

    /

    (前像素值

    +

    后像素值)亚像素值(黑色部分)

    1

    -亚像素值(白色部分)

    (

    3

    )亚像素值(白色部分)=(像素值-前像素值)

    /

    (后像素值-前像素值)

    亚像素值

    (黑色部分)=

    1

    -亚像素值(白色部分)

    以上就是亚像素算法的基本原理。

    在结束这个算法讨论之前,

    有两点必须注意:

    一是在实际情况下,

    大家不可能看到像素的一

    半是黑色另一半是白色,

    这只是为了方便大家理解所画出来的,

    而真实的情况是一个像素就

    只是一小块灰色,

    没有明暗的分别。

    明暗的区别只能在像素与像素间显现出来;

    二是在描述

    亚像素的基本算法时,

    所说

    小镜子

    的概念完全是为了方便大家理解,

    比纯数学语言表达更

    为易懂。

    亚像素

    英文名:

    Sub Pixel

    定义:

    面阵摄像机的成像面以像素为最小单位。例如某

    CMOS

    摄像芯片,其像素间距为

    5.2

    微米。

    摄像机拍摄时,

    将物理世界中连续的图像进行了离散化处理。

    到成像面上每一个像素

    点只代表其附近的颜色。至于

    附近

    到什么程度?就很困难解释。两个像素之间有

    5.2

    微米

    的距离,

    在宏观上可以看作是连在一起的。

    但是在微观上,

    它们之间还有无限的更小的东西

    存在。这个更小的东西我们称它为

    亚像素

    。实际上

    亚像素

    应该是存在的,只是硬件上没

    有个细微的传感器把它检测出来。于是软件上把它近似地计算出来。

    计算:

    数码摄像机的成像面的分辨率以像素数量来衡量。隔行

    TV

    的分辨率是

    576x768

    个像

    素。

    像素中心之间的距离有几个至十几个微米不等。为了最大限度利用图像信息来提高分

    辨率,有人提出了

    Sub-Pixel

    概念。意思是说,在两个物理像素之间还有像素,称之为

    Sub-Pixel

    ,它完全是通过计算方法的出来的。这里提出计算方法。

    如果原始图像是

    n

    m

    列的,希望做

    k

    细分的

    Sub-Pixel

    ,这样就有新的行

    N

    和列

    M

    N = k*n

    M = k*m

    原来相邻

    4

    个像素包含的区域现在变成了

    (k+1)*(k+1)

    的区域了;

    要填满这个

    (k+1)*(k+1)

    的区域,

    实际上就是从一个小正方形映照到一个大正方形的过程。

    在数学上用双线性插值得

    算法可以轻松搞定。

    (

    二次或者三次样条曲线

    )

    。下面是算法的代码:

    展开全文
  • 轮廓边缘检测

    2017-11-28 10:57:26
    Canny边缘检测,图像金字塔变换,图像轮廓操作说明等 Canny边缘检测,图像金字塔变换,图像轮廓操作说明等
  • Zernik矩亚像素边缘检测

    千次阅读 多人点赞 2020-10-30 18:26:43
    Zernik矩亚像素边缘检测 在网上看到有人写的Zernike矩亚像素边缘检测,发现存在很大的问题,赌气自己写了一个版本,力求精简,没有做过多优化。模板采用(7,7),借用Opencv的数据结构。如有问题欢迎指出。 关于...
  • 整个项目,我重新用opencv包装了,项目地址: https://github.com/fcqing/sub-pixel-edge-detect https://github.com/songyuncen/EdgesSubPix 论文《A Sub-Pixel Edge Detector: an Implementation of theCanny/...
  • opencv canny边缘检测

    2019-04-06 11:51:51
    Canny边缘检测算法可以分为以下5个步骤: 1) 使用高斯滤波器,以平滑图像,滤除噪声。 2) 计算图像中每个像素点的梯度强度和方向。 3) 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应...
  • 算法推导 上面两张图片截取自论文《应用多项式插值函数提高面阵CCD尺寸测量的分辨力_吴晓波》 其中(Xi,Yj)为通过前面的算法求出的整像素边缘点,(Xe,Ye)则为根据拉格朗日多项式插值法求出的亚像素边缘点坐标。...
  • 本文利用python opencv进行图像的边缘检测,一般要经过如下几个步骤: 1、去噪 如cv2.GaussianBlur()等函数; 2、计算图像梯度 图像梯度表达的是各个像素点之间,像素值大小的变化幅度大小,变化较大,则可以认为是...
  • 为何需要进行亚像素定位?数字图像通常是离散化成像素;每个像素对应一个整数坐标位置;整数坐标位置对于很多应用并不精确,比如跟踪、相机标定、图像配准、图像拼接以及三维重构;为达到有些应用的精确性,需要精确...
  • 亚像素边缘检测源代码

    热门讨论 2010-07-29 19:08:31
    本压缩包包括一个亚像素边缘检测源代码,以及一个测试图片,从像素的角度去解决边缘检测问题,并且与Canny算子做比较,效果显著!
  • Canny边缘检测器是一种被广泛使用的算法,并被认为是边缘检测最优的算法,该方法使用了比高斯差分算法更复杂的技巧,如多向灰度梯度和滞后阈值化。Canny边缘检测器算法基本步骤:平滑图像:通过使用合适的模糊半径...
  • 基于小波变换的亚像素边缘检测论文
  • Opencv实现像素边缘检测,用于实现图像的像素及像素及边缘检测

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,142
精华内容 5,656
关键字:

亚像素边缘检测opencv