对lena.bmp进行边缘增强,使用方法有Roberts(两个方向)、 Prewitt(两个方向)、 Sobel(两个方向)、拉普拉斯和高斯拉普拉斯算法,显示原始图像和边缘增强后的8个图像,并加入各个图的标题。

2023-05-01by@3140905649-yAn_z&@ChatGPT.Model: gpt-3.5
3140905649-yAn_z

对lena.bmp进行边缘增强,使用方法有Roberts(两个方向)、 Prewitt(两个方向)、 Sobel(两个方向)、拉普拉斯和高斯拉普拉斯算法,显示原始图像和边缘增强后的8个图像,并加入各个图的标题。

Avatar
Avatar

以下是使用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');

运行结果如下所示:

原始图像:

Original Image

Roberts算子:

Roberts Operator 1
Roberts Operator 2

Prewitt算子:

Prewitt Operator 1
Prewitt Operator 2

Sobel算子:

Sobel Operator 1
Sobel Operator 2

拉普拉斯算子:

Laplacian Operator

高斯拉普拉斯算子:

Gaussian Laplacian Operator

3140905649-yAn_z

I=imread('lena.bmp');
h1=fspecial('sobel');
J1=filter2(h1,I)/100;
h2=h1'
J2=filter2(h2,I)/100;

Avatar
Avatar

这段MATLAB代码是使用Sobel算子对lena.bmp进行边缘检测,其中h1和h2分别是水平和垂直方向的Sobel算子,J1和J2是分别使用水平和垂直Sobel算子进行边缘检测后的结果。

具体解释如下:

  1. imread('lena.bmp'):读取lena.bmp图像。

  2. fspecial('sobel'):生成一个3x3的Sobel算子。

  3. h1=fspecial('sobel'):将生成的Sobel算子赋值给h1,h1即为水平方向的Sobel算子。

  4. J1=filter2(h1,I)/100:使用h1对图像I进行卷积操作,得到水平方向上的边缘检测结果J1。由于算子的权值较大,需要将结果除以一个较大的数,这里除以100。

  5. h2=h1':将h1转置,得到垂直方向的Sobel算子h2。

  6. J2=filter2(h2,I)/100:使用h2对图像I进行卷积操作,得到垂直方向上的边缘检测结果J2。

需要注意的是,这段代码只是对lena.bmp进行了简单的边缘检测,没有进行图像增强的操作,因此结果可能并不明显。如果需要进行边缘增强,可以对J1和J2进行加权平均或者求和。

3140905649-yAn_z

J1=filter2(h1,I)/100这句有别的写法吗

Avatar
Avatar

是的,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;

这两种写法的效果是一样的,选择哪种写法主要是个人习惯和代码风格的问题。

3140905649-yAn_z

如果不除100,权值是多少

Avatar
Avatar

Sobel算子的权值是由算子模板决定的,通常情况下,Sobel算子的权值是1或2,因此如果不除以100,边缘检测的结果会相对较强,但也可能会出现过度检测的问题。

如果不除以100,使用Sobel算子进行边缘检测的代码如下:

I = imread('lena.bmp');
h1 = fspecial('sobel');
J1 = filter2(h1,I);
h2 = h1';
J2 = filter2(h2,I);

需要注意的是,这种写法可能会得到过度检测的结果,因此在实际应用中,需要根据具体情况选择合适的算子和权值。

3140905649-yAn_z

权值是小数也可以吗

Avatar
Avatar

An error occurred with your deployment

EDGE_FUNCTION_INVOCATION_TIMEOUT

3140905649-yAn_z

权值可以小于1吗

Avatar
Avatar

An error occurred with your deployment

EDGE_FUNCTION_INVOCATION_TIMEOUT

3140905649-yAn_z

权值可以小于1吗

Avatar