如何用matlab实现对边缘检测后的图像的边缘细化和曲线拟合?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用matlab实现对边缘检测后的图像的边缘细化和曲线拟合?相关的知识,希望对你有一定的参考价值。
如何用matlab实现对边缘检测后的图像的边缘细化和曲线拟合? matlab入门不久,在对一副图像(气球的轮廓)进行完边沿检测后,形成一条气球外围轮廓线,不过这条线不怎么光滑,使用matlab怎样对其进行细化成单像素线条,以及怎样对这条轮廓线进行边缘拟合 找了很多资料好多看不懂就更不会用了 谢过...最好详细讲下或是有源代码站内我
可以使用bwboundaries提取边缘节点曲线,然后用样条函数进行曲线拟合插值。 参考技术A 细化可以参考bwmorph函数,拟合可以在边缘跟踪提取有序节点后直接进行样条拟合等操作。 参考技术B Me从其他板块过来,对这种专业问题不懂。参考意见:得到像素点后,把那圆圈分段,使用cftool进行拟合试试。 参考技术C 这个问题正是我现在做的这个题目的重要部分,来找高手问一下基于MATLAB的Sobel边缘检测算法实现
图像边缘就是图像灰度值突变的地方,也就是图像在该部分的像素值变化速度非常之快,就比如在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大。
Sobel算子主要用作边缘检测,它是一离散型差分算子,用来计算图像亮度函数灰度之近似值。
边缘是指其周围像素灰度急剧变化的那些像素的集合。边缘存在于目标、背景和区域之间,所以,边缘是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,因此,边缘也是图像匹配的重要的特征。
Sobel边缘检测的核心在于像素矩阵的卷积,卷积对于数字图像处理非常重要,很多图像处理算法都是做卷积来实现的。卷积运算的本质就是对指定的图像区域的像素值进行加权求和的过程,其计算过程为图像区域中的每个像素值分别与卷积模板的每个元素对应相乘,将卷积的结果作求和运算,运算到的和就是卷积运算的结果。
矩阵的卷积公式如下。
3x3的窗口M与卷积模板C的卷积运算如下。
Gx和Gy是sobel的卷积因子,将这两个因子和原始图像做如下卷积。
Sobel卷积因子
其中A代表原始图像。
得到图像中的每一个点的横向纵向灰度值Gx、Gy。最后通过如下公式来计算改变灰度的大小。
但是通常为了提高效率,使用不开平方的近似值,虽然这样做会损失精度,,
将Sobel算子的实现划分为五个步骤:
(1) 计算Gx与Gy与模板每行的乘积。
(2) 两个3x3矩阵的卷积即将每一行每一列对应相乘然后相加。
(3) 求得3*3模板运算后的Gx、Gy。
(4) 求Gx^2 + Gy^2的平方根或者直接对Gx和Gy取绝对值后求和。
(5)设置一个阈值,运算后的像素值大于该阈值输出为全1,小于该阈值输出为全0。
平方根和绝对值函数
sqrt(x) 计算平方根
abs(x)取数值的绝对值和复数的幅值
在对图像数据进行运算时最好将图像数据转化成double类型的,避免精度损失。
Sobel边缘检测MATLAB实现
Sobel Edge Detect
1 %RGB_YCbCr 2 clc; 3 clear all; 4 close all; 5 6 RGB_data = imread(\'lena.jpg\');% 7 8 R_data = RGB_data(:,:,1); 9 G_data = RGB_data(:,:,2); 10 B_data = RGB_data(:,:,3); 11 12 %imshow(RGB_data); 13 14 [ROW,COL, DIM] = size(RGB_data); 15 16 Y_data = zeros(ROW,COL); 17 Cb_data = zeros(ROW,COL); 18 Cr_data = zeros(ROW,COL); 19 Gray_data = RGB_data; 20 21 for r = 1:ROW 22 for c = 1:COL 23 Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c); 24 Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128; 25 Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128; 26 end 27 end 28 29 Gray_data(:,:,1)=Y_data; 30 Gray_data(:,:,2)=Y_data; 31 Gray_data(:,:,3)=Y_data; 32 33 figure; 34 imshow(Gray_data); 35 36 %Median Filter 37 imgn = imnoise(Gray_data,\'salt & pepper\',0.02); 38 39 figure; 40 imshow(imgn); 41 42 Median_Img = Gray_data; 43 for r = 2:ROW-1 44 for c = 2:COL-1 45 median3x3 =[imgn(r-1,c-1) imgn(r-1,c) imgn(r-1,c+1) 46 imgn(r,c-1) imgn(r,c) imgn(r,c+1) 47 imgn(r+1,c-1) imgn(r+1,c) imgn(r+1,c+1)]; 48 sort1 = sort(median3x3, 2, \'descend\'); 49 sort2 = sort([sort1(1), sort1(4), sort1(7)], \'descend\'); 50 sort3 = sort([sort1(2), sort1(5), sort1(8)], \'descend\'); 51 sort4 = sort([sort1(3), sort1(6), sort1(9)], \'descend\'); 52 mid_num = sort([sort2(3), sort3(2), sort4(1)], \'descend\'); 53 Median_Img(r,c) = mid_num(2); 54 end 55 end 56 57 figure; 58 imshow(Median_Img); 59 60 %Sobel_Edge_Detect 61 62 Median_Img = double(Median_Img); 63 Sobel_Threshold = 150; 64 Sobel_Img = zeros(ROW,COL); 65 for r = 2:ROW-1 66 for c = 2:COL-1 67 Sobel_x = Median_Img(r-1,c+1) + 2*Median_Img(r,c+1) + Median_Img(r+1,c+1) - Median_Img(r-1,c-1) - 2*Median_Img(r,c-1) - Median_Img(r+1,c-1); 68 Sobel_y = Median_Img(r-1,c-1) + 2*Median_Img(r-1,c) + Median_Img(r-1,c+1) - Median_Img(r+1,c-1) - 2*Median_Img(r+1,c) - Median_Img(r+1,c+1); 69 Sobel_Num = abs(Sobel_x) + abs(Sobel_y); 70 %Sobel_Num = sqrt(Sobel_x^2 + Sobel_y^2); 71 if(Sobel_Num > Sobel_Threshold) 72 Sobel_Img(r,c)=0; 73 else 74 Sobel_Img(r,c)=255; 75 end 76 end 77 end 78 79 figure; 80 imshow(Sobel_Img);
处理后的图片效果
中值滤波后的lena
Sobel边沿检测后的lena
为了使图像边缘更加明朗,可以在Sobel的基础上再进行腐蚀膨胀处理,腐蚀膨胀处理,下一篇继续分享。
转载请注明出处:NingHeChuan(宁河川)
个人微信订阅号:开源FPGA
如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号
知乎ID:NingHeChuan
微博ID:NingHeChuan
以上是关于如何用matlab实现对边缘检测后的图像的边缘细化和曲线拟合?的主要内容,如果未能解决你的问题,请参考以下文章
毕业设计/Matlab系列基于NSCT和改进Canny的图像边缘检测matlab实现