问题陈述:不使用内置的边缘检测函数,编写用于灰度图像边缘检测的matlab代码。
关于边缘检测:
边缘检测是一种图像处理技术,用于查找图像内对象的边界。它通过检测亮度不连续来工作。边缘检测用于图像处理,计算机视觉和机器视觉等领域中的图像分割和数据提取。
方法:
对于边缘检测,我们借助卷积:Convolution = I * m其中I是图像,m是遮罩,*是卷积运算符。要对图像执行卷积,需要执行以下步骤:
- 水平翻转面具,然后垂直翻转。这将导致图像旋转180度。
- 将蒙版滑动到图像上,以使图像中的每个像素至少与蒙版的中心重合一次。
- 将对应的元素与下面的像素值相乘,然后将它们相加。
- 重复此过程,直到已计算出图像的所有像素值以进行更新。
Now, we will take 3×3 mask for the same.
3×3 Mask for vertical edges : [1, 0, -1; 1, 0, -1; 1, 0, -1]
3×3 Mask for horizontal edges : [1, 0, -1; 1, 0, -1; 1, 0, -1]
3×3 Mask for principal diagonal edges : [1, 0, -1; 1, 0, -1; 1, 0, -1]
3×3 Mask for secondary diagonal edges : [1, 0, -1; 1, 0, -1; 1, 0, -1]
我们将分别找到这些边缘,最后使用max
函数或mean 函数组合它们,但是max
函数对此更准确。
原始图片:
I=double((imread('image1.jpg')); %read image
In=I; %copy image
mask=[1, 0, -1;1, 0, -1;1, 0, -1];
%Rotate image by 180 degree first flip up to down then left to right
mask=flipud(mask);
mask=fliplr(mask);
for i=2:size(I, 1)-1
for j=2:size(I, 2)-1
%multiplying mask value with the corresponding image pixel value
neighbour_matrix=mask.*In(i-1:i+1, j-1:j+1);
avg_value=sum(neighbour_matrix(:));
I(i, j)=avg_value;
end
end
figure, imshow(uint8(I));
输出:
水平边缘的Matlab代码:
I=double((imread('image1.jpg'));
In=I;
mask=[1, 1, 1;0, 0, 0;-1, -1, -1];
mask=flipud(mask);
mask=fliplr(mask);
for i=2:size(I, 1)-1
for j=2:size(I, 2)-1
neighbour_matrix=mask.*In(i-1:i+1, j-1:j+1);
avg_value=sum(neighbour_matrix(:));
I(i, j)=avg_value;
end
end
figure, imshow(uint8(I));
输出:
主要对角线边缘的Matlab代码:
I=double((imread('image1.jpg'));
In=I;
mask=[0, -1, -1;1, 0, -1;1, 1, 0];
mask=flipud(mask);
mask=fliplr(mask);
for i=2:size(I, 1)-1
for j=2:size(I, 2)-1
neighbour_matrix=mask.*In(i-1:i+1, j-1:j+1);
avg_value=sum(neighbour_matrix(:));
I(i, j)=avg_value;
end
end
figure, imshow(uint8(I));
输出:
辅助对角线边缘的Matlab代码:
I=double((imread('image1.jpg'));
In=I;
mask=[1, 1, 1;0, 0, 0;-1, -1, -1];
mask=flipud(mask);
mask=fliplr(mask);
for i=2:size(I, 1)-1
for j=2:size(I, 2)-1
neighbour_matrix=mask.*In(i-1:i+1, j-1:j+1);
avg_value=sum(neighbour_matrix(:));
I(i, j)=avg_value;
end
end
figure, imshow(uint8(I));
输出:
用于边缘检测的最终Matlab代码:
I=double(imread('image1.jpg'));
In=I;
mask1=[1, 0, -1;1, 0, -1;1, 0, -1];
mask2=[1, 1, 1;0, 0, 0;-1, -1, -1];
mask3=[0, -1, -1;1, 0, -1;1, 1, 0];
mask4=[1, 1, 0;1, 0, -1;0, -1, -1];
mask1=flipud(mask1);
mask1=fliplr(mask1);
mask2=flipud(mask2);
mask2=fliplr(mask2);
mask3=flipud(mask3);
mask3=fliplr(mask3);
mask4=flipud(mask4);
mask4=fliplr(mask4);
for i=2:size(I, 1)-1
for j=2:size(I, 2)-1
neighbour_matrix1=mask1.*In(i-1:i+1, j-1:j+1);
avg_value1=sum(neighbour_matrix1(:));
neighbour_matrix2=mask2.*In(i-1:i+1, j-1:j+1);
avg_value2=sum(neighbour_matrix2(:));
neighbour_matrix3=mask3.*In(i-1:i+1, j-1:j+1);
avg_value3=sum(neighbour_matrix3(:));
neighbour_matrix4=mask4.*In(i-1:i+1, j-1:j+1);
avg_value4=sum(neighbour_matrix4(:));
%using max function for detection of final edges
I(i, j)=max([avg_value1, avg_value2, avg_value3, avg_value4]);
end
end
figure, imshow(uint8(I));
输出: