说白了就是各种边缘提取算子的应用:本人写了 kirsch, Sobel, Roberts, Canny没有完成的很好,还需要以后研究...
基础知识,都是CSDN上找的,没有查书,总感觉有点小问题,列一下我觉得比较好的讲解
感觉看完以后还是挺清楚的,就动手写了。不过以后打算再把书上的权威解释看一下.还有到底要不要确定一个阈值,把图像二值化...待研究
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很玄学,过几天研究....