说白了就是各种边缘提取算子的应用:本人写了 kirsch, Sobel, Roberts, Canny没有完成的很好,还需要以后研究...
基础知识,都是CSDN上找的,没有查书,总感觉有点小问题,列一下我觉得比较好的讲解
[图像]Canny检测的Matlab实现(含代码)
Roberts边缘检测算子
sobel算子
彻底理解数字图像处理中的卷积-以Sobel算子为例
感觉看完以后还是挺清楚的,就动手写了。不过以后打算再把书上的权威解释看一下.还有到底要不要确定一个阈值,把图像二值化...待研究
Sobel
function newImg = Sobel(img, t)
[width, length] = size(img);
baseImg = zeros(width+2, length+2);
baseImg(2:width+1, 2:length+1) = img; % add zeros to the picture
for i = 2:width+1
for j = 2:length+1
Gy = -1*baseImg(i-1,j-1) + -2*baseImg(i-1,j) + -1*baseImg(i-1,j+1) + baseImg(i+1,j-1) + baseImg(i+1,j)*2 + baseImg(i+1,j+1);
Gx = baseImg(i-1,j-1) + 2*baseImg(i,j-1) + baseImg(i+1,j-1) + -1*baseImg(i-1,j+1) + -2*baseImg(i,j+1) + -1*baseImg(i+1,j+1);
m = abs(Gy) + abs(Gx);
if m > t
img(i-1, j-1) = 255;
else
img(i-1, j-1) = 0;
end
end
end
newImg = img;
end
Roberts
function Imag = Roberts(img,t) % suppose the picture is gray
%grayImg = rgb2gray(img);
[width, length] = size(img);
% add zeros
baseImg = zeros(width+2, length+2);
baseImg(2:width+1, 2:length+1) = img;
for i = 2:width+1
for j = 2:length+1
m = abs(baseImg(i,j) - baseImg(i+1,j+1)) + abs(baseImg(i+1,j) - baseImg(i,j+1));
if m > t
img(i-1, j-1) = 255;
else
img(i-1, j-1) = 0;
end
end
end
Imag = img;
Kirsch
function newImg = Kirsch(img, t)
[width, length] = size(img);
baseImg = zeros(width+2, length+2);
baseImg(2:width+1, 2:length+1) = img; % add zeros to the picture
for i = 2:width+1
for j = 2:length+1
d1 =(5*baseImg(i-1,j-1)+5*baseImg(i-1,j)+5*baseImg(i-1,j+1)-3*baseImg(i,j-1)-3*baseImg(i,j+1)-3*baseImg(i+1,j-1)-3*baseImg(i+1,j)-3*baseImg(i+1,j+1))^2;
d2 =((-3)*baseImg(i-1,j-1)+5*baseImg(i-1,j)+5*baseImg(i-1,j+1)-3*baseImg(i,j-1)+5*baseImg(i,j+1)-3*baseImg(i+1,j-1)-3*baseImg(i+1,j)-3*baseImg(i+1,j+1))^2;
d3 =((-3)*baseImg(i-1,j-1)-3*baseImg(i-1,j)+5*baseImg(i-1,j+1)-3*baseImg(i,j-1)+5*baseImg(i,j+1)-3*baseImg(i+1,j-1)-3*baseImg(i+1,j)+5*baseImg(i+1,j+1))^2;
d4 =((-3)*baseImg(i-1,j-1)-3*baseImg(i-1,j)-3*baseImg(i-1,j+1)-3*baseImg(i,j-1)+5*baseImg(i,j+1)-3*baseImg(i+1,j-1)+5*baseImg(i+1,j)+5*baseImg(i+1,j+1))^2;
d5 =((-3)*baseImg(i-1,j-1)-3*baseImg(i-1,j)-3*baseImg(i-1,j+1)-3*baseImg(i,j-1)-3*baseImg(i,j+1)+5*baseImg(i+1,j-1)+5*baseImg(i+1,j)+5*baseImg(i+1,j+1))^2;
d6 =((-3)*baseImg(i-1,j-1)-3*baseImg(i-1,j)-3*baseImg(i-1,j+1)+5*baseImg(i,j-1)-3*baseImg(i,j+1)+5*baseImg(i+1,j-1)+5*baseImg(i+1,j)-3*baseImg(i+1,j+1))^2;
d7 =(5*baseImg(i-1,j-1)-3*baseImg(i-1,j)-3*baseImg(i-1,j+1)+5*baseImg(i,j-1)-3*baseImg(i,j+1)+5*baseImg(i+1,j-1)-3*baseImg(i+1,j)-3*baseImg(i+1,j+1))^2;
d8 =(5*baseImg(i-1,j-1)+5*baseImg(i-1,j)-3*baseImg(i-1,j+1)+5*baseImg(i,j-1)-3*baseImg(i,j+1)-3*baseImg(i+1,j-1)-3*baseImg(i+1,j)-3*baseImg(i+1,j+1))^2;
d = max([d1,d2,d3,d4,d5,d6,d7,d8]);
if d>t
img(i-1, j-1) = 255;
else
img(i-1, j-1) = 0;
end
end
end
newImg = img;
不要问我为啥没有canny,感觉canny很玄学,过几天研究....