计算机视觉大作业之边缘提取

说白了就是各种边缘提取算子的应用:本人写了 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很玄学,过几天研究....

你可能感兴趣的:(matlab与图像处理)