关于sobel算子的图像边缘检测程序_利用sobel算子进行边缘提取

关于sobel算子的图像边缘检测程序_利用sobel算子进行边缘提取,第1张

这三者主要面向的对象不一样吧,jetsonnano主要用于机器学习、人工智能等方面,树莓派主要用于计算机编程教育,比起前两者STM32的应用范围更广一些(也可能是前两者我不是很熟悉的缘故)。

STM32可以跑 *** 作系统,但是不能跑Linux,因为其属于Cortex-M系列不带MMU。另外,Cortex-A系列可以跑Linux,因为它带MMU。

图像处理方面、图像识别算法:掌握算法、简化算法、认清算法实质和算法最大复杂度所在;嵌入式CPU数据手册:掌握cpu特点和能力,如需特殊优化了解cpu内部cache和总线特点,特色指令集嵌入式 *** 作系统文档:了解系统能力、存储器使用、系统运行最大速度,程序调用特点(硬中断、软中断、函数),以便决定算法运行过程以及是否能够实现、处理能力如何

我把程序贴下面了,这个是Robert算子的程序。换做其他算子,你只要该其中的一个矩阵就行了。查到这几个算子,然后替换,我在程序中会标出的。

clc

close all

clear all

%%%生成高斯平滑滤波模板%%%

%%%%%%%%%%%%%%%%%%%%%%%%%

hg=zeros(3,3); %设定高斯平滑滤波模板的大小为33

delta=05;

for x=1:1:3

for y=1:1:3

u=x-2;

v=y-2;

hg(x,y)=exp(-(u^2+v^2)/(2pidelta^2));

end

end

h=hg/sum(hg(:));

%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%读入图像%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%

f = imread('1111tif'); % 读入图像文件

f=rgb2gray(im2double(f));

imshow(f)

title('原始图像');

[m,n]=size(f);

ftemp=zeros(m,n);

rowhigh=m-1;

colhigh=n-1;

%%%高斯滤波%%%

for x=2:1:rowhigh-1

for y=2:1:colhigh-1

mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];

A=hmod;

ftemp(x,y)=sum(A(:));

end

end

f=ftemp

figure,imshow(f)

title('通过高斯滤波器后的图像');

% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% %%%利用roberts算子进行边缘检测%%%

% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

sx=[-1 -2 -1;0 0 0;1 2 1];

sy=[-1 0 1;-2 0 2;-1 0 1];%%%%%你可以替换成其他算子,这里是罗伯特算子

% sx=[-1 -2 -1;0 0 0;1 2 1];

% sy=[-1 0 1;-2 0 2;-1 0 1];这个是Sobel算子,类似的,你可以替换成canny算子等等

for x=2:1:rowhigh-1

for y=2:1:colhigh-1

mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];

fsx=sxmod;

fsy=symod;

ftemp(x,y)=sqrt((sum(fsx(:)))^2+(sum(fsy(:)))^2);

end

end

fr=im2uint8(ftemp);

figure,imshow(fr)

title('用roberts算子边缘检测的原始图像');

%%%域值分割%%%

TH1=60; %设定阈值

for x=2:1:rowhigh-1

for y=2:1:colhigh-1

if (fr(x,y)>=TH1)&((fr(x,y-1) <= fr(x,y)) & (fr(x,y) > fr(x,y+1)) )

fr(x,y)=200;

elseif(fr(x,y)>=TH1)&( (fr(x-1,y) <=fr(x,y)) & (fr(x,y) >fr(x+1,y)))

fr(x,y)=200;

else fr(x,y)=50;

end

end

end

figure,imshow(fr)

title('用roberts算子边缘检测并细化后的图像');

你可以试试下面的程序:\x0d\I=imread('myphotojpg'); % 假设要处理的图像是myphotojpg\x0d\heights=size(I,1); % 图像的高\x0d\widths=size(I,2); % 图像的宽\x0d\m=8; % 假设纵向分成8幅图\x0d\n=10; % 假设横向分成10幅图\x0d\% 考虑到rows和cols不一定能被m和n整除,所以对行数和列数均分后要取整\x0d\rows=round(linspace(0,heights,m+1)); % 各子图像的起始和终止行标\x0d\cols=round(linspace(0,widths,n+1)); % 各子图像的起始和终止列标\x0d\blocks=cell(m,n); % 用一个单元数组容纳各个子图像\x0d\for k1=1:m\x0d\ for k2=1:n\x0d\ blocks{k1,k2}=I(rows(k1)+1:rows(k1+1),cols(k2)+1:cols(k2+1),:);\x0d\ subimage=blocks{k1,k2};\x0d\ % 以下是对subimage进行边缘检测\x0d\ % 加入边缘检测的代码\x0d\ % 以上是对subimage进行边缘检测\x0d\ blocks{k1,k2}=subimage;\x0d\ end\x0d\end\x0d\processed=I; % processed为处理后的图像,用原图像对其初始化\x0d\% 以下为拼接图像\x0d\for k1=1:m\x0d\ for k2=1:n\x0d\ processed(rows(k1)+1:rows(k1+1),cols(k2)+1:cols(k2+1),:)=blocks{k1,k2};\x0d\ end\x0d\end\x0d\figure,imshow(processed)\x0d\% 以上的程序已测试过,对灰度图像和真彩图像都可以运行。

int main()

{

IplImage src;

src=cvLoadImage("D:\\image\\linejpg");

{

IplImage dst = cvCreateImage( cvGetSize(src), 8, 1 );

IplImage color_dst = cvCreateImage( cvGetSize(src), 8, 3 );

CvMemStorage storage = cvCreateMemStorage(0);//存储检测到线段,当然可以是N1的矩阵数列,如果实际的直线数量多余N,那么最大可能数目的线段被返回

CvSeq lines = 0;

int i;

IplImage src1=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);

cvCvtColor(src, src1, CV_BGR2GRAY); //把src转换成灰度图像保存在src1中,注意进行边缘检测一定要换成灰度图

cvCanny( src1, dst, 50, 200, 3 );//参数50,200的灰度变换

cvCvtColor( dst, color_dst, CV_GRAY2BGR );

lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80, 30, 10 );

for( i = 0; i < lines->total; i++ )

{

CvPoint line = (CvPoint)cvGetSeqElem(lines,i);

cvLine( color_dst, line[0], line[1], CV_RGB(255,255,0), 3, 8 );

double k=(double)(line[1]y-line[0]y)/(double)(line[1]x-line[0]x);

double d=line[0]y-line[0]xk;

printf("This is the %d line, this line is y = %2f x + %2f \n",i+1,k,d);

}

cvNamedWindow( "Source", 1 );

cvShowImage( "Source", src );

cvNamedWindow( "Hough", 1 );

cvShowImage( "Hough", color_dst );

cvWaitKey(0);

}

}

这主要是为了便于处理,毕竟彩色图像就要分析3组原色的梯度,而灰度图像只要1组。

另外由于边缘检测基本是用梯度算子完成的,梯度是在坐标(x,y)处指向f最大变化率的方向的向量,而彩色图像实际是由若干种原色(如RGB)构成的,如果直接检测彩色图像边缘也就是对每种色彩单独检测,但是各原色在一点处的梯度方向可能不同,从而得到的边缘也不同,会发生错误。要采用计算平均向量可以解决该问题但复杂性提高。

在视觉助手当中。

与 C 和BASIC 一样,LabVIEW也是通用的编程系统,有一个完成任何编程任务的庞大函数库。LabVIEW的函数库包括数据采集、GPIB、串口控制、数据分析、数据显示及数据存储,等等。LabVIEW也有传统的程序调试工具,如设置断点、以动画方式显示数据及其子程序(子VI)的结果、单步执行等等,便于程序的调试。

以上就是关于关于sobel算子的图像边缘检测程序_利用sobel算子进行边缘提取全部的内容,包括:关于sobel算子的图像边缘检测程序_利用sobel算子进行边缘提取、matlab图像分块,边缘检测,图像拼接代码_基于matlab的图像边缘检测、高分求!!图像边缘检测算子的MATLAB程序!发到邮箱232111605@qq.com!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10104873.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存