对lena.bmp进行边缘增强,使用方法有Roberts(两个方向)、 Prewitt(两个方向)、 Sobel(两个方向)、拉普拉斯和高斯拉普拉斯算法,显示原始图像和边缘增强后的8个图像,并加入各个图的标题。
以下是使用MATLAB对lena.bmp进行边缘增强的代码和结果:
% 读入原始图像
I = imread('lena.bmp');
% Roberts算子
Roberts1 = [1 0; 0 -1];
Roberts2 = [0 1; -1 0];
Gx1 = imfilter(double(I), Roberts1, 'replicate');
Gy1 = imfilter(double(I), Roberts2, 'replicate');
G1 = abs(Gx1) + abs(Gy1);
figure, subplot(2,4,1), imshow(I), title('Original Image');
subplot(2,4,2), imshow(G1, []), title('Roberts Operator 1');
Gx2 = imfilter(double(I), Roberts2, 'replicate');
Gy2 = imfilter(double(I), Roberts1, 'replicate');
G2 = abs(Gx2) + abs(Gy2);
subplot(2,4,3), imshow(G2, []), title('Roberts Operator 2');
% Prewitt算子
Prewitt1 = [-1 -1 -1; 0 0 0; 1 1 1];
Prewitt2 = [-1 0 1; -1 0 1; -1 0 1];
Gx1 = imfilter(double(I), Prewitt1, 'replicate');
Gy1 = imfilter(double(I), Prewitt2, 'replicate');
G3 = abs(Gx1) + abs(Gy1);
subplot(2,4,4), imshow(G3, []), title('Prewitt Operator 1');
Gx2 = imfilter(double(I), Prewitt2, 'replicate');
Gy2 = imfilter(double(I), Prewitt1, 'replicate');
G4 = abs(Gx2) + abs(Gy2);
subplot(2,4,5), imshow(G4, []), title('Prewitt Operator 2');
% Sobel算子
Sobel1 = [-1 -2 -1; 0 0 0; 1 2 1];
Sobel2 = [-1 0 1; -2 0 2; -1 0 1];
Gx1 = imfilter(double(I), Sobel1, 'replicate');
Gy1 = imfilter(double(I), Sobel2, 'replicate');
G5 = abs(Gx1) + abs(Gy1);
subplot(2,4,6), imshow(G5, []), title('Sobel Operator 1');
Gx2 = imfilter(double(I), Sobel2, 'replicate');
Gy2 = imfilter(double(I), Sobel1, 'replicate');
G6 = abs(Gx2) + abs(Gy2);
subplot(2,4,7), imshow(G6, []), title('Sobel Operator 2');
% 拉普拉斯算子
Laplacian = [0 -1 0; -1 4 -1; 0 -1 0];
G7 = imfilter(double(I), Laplacian, 'replicate');
subplot(2,4,8), imshow(G7, []), title('Laplacian Operator');
% 高斯拉普拉斯算子
G = fspecial('gaussian',[5 5],1);
I_smooth = imfilter(I,G,'same');
Laplacian = [0 -1 0; -1 5 -1; 0 -1 0];
G8 = imfilter(double(I_smooth), Laplacian, 'replicate');
figure, subplot(1,2,1), imshow(I), title('Original Image');
subplot(1,2,2), imshow(G8, []), title('Gaussian Laplacian Operator');
运行结果如下所示:
原始图像:
Roberts算子:
Prewitt算子:
Sobel算子:
拉普拉斯算子:
高斯拉普拉斯算子:
I=imread('lena.bmp');
h1=fspecial('sobel');
J1=filter2(h1,I)/100;
h2=h1'
J2=filter2(h2,I)/100;
这段MATLAB代码是使用Sobel算子对lena.bmp进行边缘检测,其中h1和h2分别是水平和垂直方向的Sobel算子,J1和J2是分别使用水平和垂直Sobel算子进行边缘检测后的结果。
具体解释如下:
imread('lena.bmp'):读取lena.bmp图像。
fspecial('sobel'):生成一个3x3的Sobel算子。
h1=fspecial('sobel'):将生成的Sobel算子赋值给h1,h1即为水平方向的Sobel算子。
J1=filter2(h1,I)/100:使用h1对图像I进行卷积操作,得到水平方向上的边缘检测结果J1。由于算子的权值较大,需要将结果除以一个较大的数,这里除以100。
h2=h1':将h1转置,得到垂直方向的Sobel算子h2。
J2=filter2(h2,I)/100:使用h2对图像I进行卷积操作,得到垂直方向上的边缘检测结果J2。
需要注意的是,这段代码只是对lena.bmp进行了简单的边缘检测,没有进行图像增强的操作,因此结果可能并不明显。如果需要进行边缘增强,可以对J1和J2进行加权平均或者求和。
J1=filter2(h1,I)/100这句有别的写法吗
是的,J1=filter2(h1,I)/100这句话可以用卷积函数conv2()来替代,两者的作用是一样的。
使用conv2()函数,代码如下:
I = imread('lena.bmp');
h1 = fspecial('sobel');
J1 = conv2(double(I), h1, 'same') / 100;
其中,'same'表示输出大小与输入大小相同。
使用conv2()函数对图像进行卷积时,需要将图像I转换为双精度类型(double),否则会出现数据类型错误。
同样的,垂直方向的Sobel算子可以用h1'代替,代码如下:
h2 = h1';
J2 = conv2(double(I), h2, 'same') / 100;
这两种写法的效果是一样的,选择哪种写法主要是个人习惯和代码风格的问题。
如果不除100,权值是多少
Sobel算子的权值是由算子模板决定的,通常情况下,Sobel算子的权值是1或2,因此如果不除以100,边缘检测的结果会相对较强,但也可能会出现过度检测的问题。
如果不除以100,使用Sobel算子进行边缘检测的代码如下:
I = imread('lena.bmp');
h1 = fspecial('sobel');
J1 = filter2(h1,I);
h2 = h1';
J2 = filter2(h2,I);
需要注意的是,这种写法可能会得到过度检测的结果,因此在实际应用中,需要根据具体情况选择合适的算子和权值。
权值是小数也可以吗
An error occurred with your deployment
EDGE_FUNCTION_INVOCATION_TIMEOUT
权值可以小于1吗
An error occurred with your deployment
EDGE_FUNCTION_INVOCATION_TIMEOUT
权值可以小于1吗