① matlab不使用内置函数edge等等,如何根据原理直接实现LOG算子
edge不是matlab的内置函数,如何判断可以用
>>type edge 是否能显示其函数内容,如能显示就不是内置函数。
如不用edge函数,可以根据LOG算子(边缘检测算法)来实现edge函数的功能。
实现LOG算子的步骤:(1) 采用二维高斯滤波器平滑滤波; (2) 采用二维拉普算子进行图像增强; (3) 依据二阶导数零交叉进行边缘检测。
② matlab遗传算法中的交叉算子函数应该怎么编写
function [xv,fv]=myGA(fitness,a,b,NP,NG,Pc,Pm,eps)
L = ceil(log2((b-a)/eps+1)); %根据离散精度,确定二进制编码需要的码长
x = zeros(NP,L);
for i=1:NP
x(i,:) = Initial(L); %种群初始化
fx(i) = fitness(Dec(a,b,x(i,:),L)); %个体适应值
end
for k=1:NG
sumfx = sum(fx); %所有个体适应值之和
Px = fx/sumfx; %所有个体适应值的平均值
PPx = 0;
PPx(1) = Px(1);
for i=2:NP %用于轮盘赌策略的概率累加
PPx(i) = PPx(i-1) + Px(i);
end
for i=1:NP
sita = rand();
for n=1:NP
if sita <= PPx(n)
SelFather = n; %根据轮盘赌策略确定的父亲
break;
end
end
Selmother = floor(rand()*(NP-1))+1; %随机选择母亲
posCut = floor(rand()*(L-2)) + 1; %随机确定交叉点
r1 = rand();
if r1<=Pc %交叉
nx(i,1:posCut) = x(SelFather,1:posCut);
nx(i,(posCut+1):L) = x(Selmother,(posCut+1):L);
r2 = rand();
if r2 <= Pm %变异
posMut = round(rand()*(L-1) + 1);
nx(i,posMut) = ~nx(i,posMut);
end
else
nx(i,:) = x(SelFather,:);
end
end
x = nx;
for i=1:NP
fx(i) = fitness(Dec(a,b,x(i,:),L)); %子代适应值
end
end
fv = -inf;
for i=1:NP
fitx = fitness(Dec(a,b,x(i,:),L));
if fitx > fv
fv = fitx; %取个体中的最好值作为最终结果
xv = Dec(a,b,x(i,:),L);
end
end
function result = Initial(length) %初始化函数
for i=1:length
r = rand();
result(i) = round(r);
end
function y = Dec(a,b,x,L) %二进制编码转换为十进制编码
base = 2.^((L-1):-1:0);
y = dot(base,x);
y = a + y*(b-a)/(2^L-1);
③ matlab canny算子边缘检测函数代码是什么
I = imread('lena.bmp'); %%如果是其他类型图像,请先转换为灰度图
%%没有噪声时的检测结果
BW_sobel = edge(I,'sobel');
BW_prewitt = edge(I,'prewitt');
BW_roberts = edge(I,'roberts');
BW_laplace = edge(I,'log');
BW_canny = edge(I,'canny'); figure(1);
subplot(2,3,1),imshow(I),xlabel('原始图像');
subplot(2,3,2),imshow(BW_sobel),xlabel('sobel检测');
subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt检测');
subplot(2,3,4),imshow(BW_roberts),xlabel('roberts检测');
subplot(2,3,5),imshow(BW_laplace),xlabel('laplace检测');
subplot(2,3,6),imshow(BW_canny),xlabel('canny检测');
%%加入高斯噪声(μ=0,σ^2=0.01)检测结果
I_g1 = imnoise(I,'gaussian',0,0.01);
BW_sobel = edge(I_g1,'sobel');
BW_prewitt = edge(I_g1,'prewitt');
BW_roberts = edge(I_g1,'roberts');
BW_laplace = edge(I_g1,'log');
BW_canny = edge(I_g1,'canny'); figure(2);
subplot(2,3,1),imshow(I_g1),xlabel('加入高斯噪声(μ=0,σ^2=0.01)图像');
subplot(2,3,2),imshow(BW_sobel),xlabel('sobel检测');
subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt检测');
subplot(2,3,4),imshow(BW_roberts),xlabel('roberts检测');
subplot(2,3,5),imshow(BW_laplace),xlabel('laplace检测');
subplot(2,3,6),imshow(BW_canny),xlabel('canny检测');
%%加入高斯噪声(μ=0,σ^2=0.02)检测结果
I_g2 = imnoise(I,'gaussian',0,0.02);
BW_sobel = edge(I_g2,'sobel');
BW_prewitt = edge(I_g2,'prewitt');
BW_roberts = edge(I_g2,'roberts');
BW_laplace = edge(I_g2,'log');
BW_canny = edge(I_g2,'canny'); figure(3);
subplot(2,3,1),imshow(I_g2),xlabel('加入高斯噪声(μ=0,σ^2=0.02)图像');
subplot(2,3,2),imshow(BW_sobel),xlabel('sobel检测');
subplot(2,3,3),imshow(BW_prewitt),xlabel('prewitt检测');
subplot(2,3,4),imshow(BW_roberts),xlabel('roberts检测');
subplot(2,3,5),imshow(BW_laplace),xlabel('laplace检测');
subplot(2,3,6),imshow(BW_canny),xlabel('c
④ Matlab关于图像边缘提取,用Sobel算子、Roberts算子、Prewitt算子,加QQ详谈 急用!!
4.2.1 Roberts算法原理
Roberts算子是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子,他采用对角线方向相邻两象素之差近似梯度幅值检测边缘。检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。
4.2.2 算法流程
Roberts算子在2×2领域上计算对角导数
(4-1)
成为Roberts交叉算子。在实际应用中为了简化计算,用梯度函数的Roberts绝对值来近似
(4-2)另外还可以用Roberts 最大算子来计算
(4-3)
上式能够提供较好的不变性边缘取向。对于同等长度但取向不同的边缘,应用Roberts最大值算子比应用Roberts交叉算子所得到的合成幅度变化小。Roberts边缘检测算子的卷积算子为
Roberts 边缘算子方向模版
由上面两个卷积算子对图像运算后,代入(3-7)式,可求得图像的梯度幅度值,然后选取门限TH,做如下判断>TH,为阶跃状边缘点为一个二值图像,也就是图像的边缘图像。4.4.1 Prewitt 算法原理
Prewitt边缘算子是一种边缘样板算子。Prewitt 从加大边缘检测算子的模板大小出发,由2×2 扩大到3×3 来计算差分算子,采用Prewitt 算子不仅能检测边缘点,而且能抑制噪声的影响。
Prewitt 采用计算偏微分估计的方法,由式(4-9)所示的两个卷积算子形成了Prewitt边缘算子,样板算子由理想的边缘子图像构成,依次用边缘样板去检测图像,与被检测区域最为相似的样板给出最大值,用这个最大值作为算子的输出
(4-9)
另一种方法是,可以将Prewitt算子扩展到八个方向,每个模版对特定的边缘方向做出最大响应,所有8个方向中最大值作为边缘幅度图像的输出,这些算子样板由离线的边缘子图像构成。依次用边缘样板去检测图像,与被检测区域最为相似的的样板给出最大值。定义Prewitt 边缘检测的算子模版如下:
(1)1方向 (2)2方向 (3)3方向 (4)4方
⑤ Matlab中逻辑运算符有哪些运算规则是什么
Matlab共4种逻辑运算符和运算规则如下:
元素级(Element-Wise)的逻辑运算符用于对标量或矩阵元素进行逻辑运算,得到一个结果标量或结果矩阵。假设操作数为a和b,则元素级逻辑运算符包括:
1、a&b: 与运算,两标量或两元素均非0则返回1,否则返回0. 注意,在if条件语句中,两个表达式的与操作用&&。
2、a|b: 或运算,两标量或者两元素至少有一个是非0则返回1,否则返回0. 在条件语句中,两个表达式的或用||。
3、~a: 非运算,对作用的标量或矩阵元素求补,如果标量或者矩阵元素为0则结果为1,如果标量或矩阵元素不为0则结果为0。
4、xor(a,b): 异或运算,两标量或两元素均非0或均为0则返回0,否则返回1。
(5)matlab算子算法扩展阅读:
计算机编程布尔运算(逻辑运算)
逻辑运算通常用来测试真假值。最常见到的逻辑运算就是循环的处理,用来判断是否该离开循环或继续执行循环内的指令。
各种编程语言中的逻辑运算符:
C语言:
与:&&
或:||
非:!
异或:^
Pascal:
与:and
或:or
非:not
异或:xor
⑥ 运用Matlab利用算子法进行数字图像边缘检测(只需三四行 限于本人知识有限 谢谢各位吖)
clear all;
I=imread('**.***');%自己输入图片路径
GryIm=rgb2gray(I);%变灰度,如果是灰度图,直接删掉它
BW=edge(GryIm,'sobel');%后边的参数‘sobel’或'roberts'自己改
subplot(2,2,1);imshow(I);title('Oringal Image');
subplot(2,2,2);imshow(BW);title('Edge detect of sobel');
⑦ 基于matlab的边缘检测的robert算子的算法怎么写
matlab本身有库函数的。直接调用啊
VC代码:
void BianYuanJianCeDib::Robert()
{
LPBYTE p_data; //原图数据区指针
int wide,height; //原图长、宽
int i,j; //循环变量
int pixel[4]; //Robert算子
p_data=this->GetData ();
wide=this->GetWidth ();
height=this->GetHeight ();
LPBYTE temp=new BYTE[wide*height]; //新图像缓冲区
//设定新图像初值为255
memset(temp,255, wide*height);
//由于使用2*2的模板,为防止越界,所以不处理最下边和最右边的两列像素
for(j=0;j<height-1;j++)
for(i=0;i<wide-1;i++)
{
//生成Robert算子
pixel[0]=p_data[j*wide+i];
pixel[1]=p_data[j*wide+i+1];
pixel[2]=p_data[(j+1)*wide+i];
pixel[3]=p_data[(j+1)*wide+i+1];
//处理当前像素
temp[j*wide+i]=(int)sqrt((pixel[0]-pixel[3])*(pixel[0]-pixel[3])
+(pixel[1]-pixel[2])*(pixel[1]-pixel[2]));
}
//将缓冲区中的数据复制到原图数据区
memcpy(p_data, temp,wide*height);
//删除缓冲区
delete temp;
}