c语言实现利用数学的二值形态学和灰度形态学的边缘检测代码
时间: 2024-06-12 13:03:36 浏览: 12
以下是利用数学的二值形态学和灰度形态学的边缘检测代码,使用的是C语言。
二值形态学边缘检测代码:
```
#include <stdio.h>
#include <stdlib.h>
#define WIDTH 10
#define HEIGHT 10
int main()
{
int image[HEIGHT][WIDTH] = { {1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,1,1,1,1,1,1},
{1,0,0,0,1,1,1,1,1,1},
{1,0,0,0,1,1,1,1,1,1},
{1,1,1,1,0,0,0,1,1,1},
{1,1,1,1,0,0,0,1,1,1},
{1,1,1,1,0,0,0,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1} };
int kernel[3][3] = { {0,1,0},
{1,1,1},
{0,1,0} };
int result[HEIGHT][WIDTH] = {0};
int i, j, row, col;
for (i = 1; i < HEIGHT - 1; i++)
{
for (j = 1; j < WIDTH - 1; j++)
{
int sum = 0;
for (row = -1; row <= 1; row++)
{
for (col = -1; col <= 1; col++)
{
sum += image[i + row][j + col] * kernel[1 + row][1 + col];
}
}
if (sum >= 255)
{
result[i][j] = 255;
}
else
{
result[i][j] = 0;
}
}
}
for (i = 0; i < HEIGHT; i++)
{
for (j = 0; j < WIDTH; j++)
{
printf("%d ", result[i][j]);
}
printf("\n");
}
return 0;
}
```
灰度形态学边缘检测代码:
```
#include <stdio.h>
#include <stdlib.h>
#define WIDTH 10
#define HEIGHT 10
int main()
{
int image[HEIGHT][WIDTH] = { {1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,1,1,1,1,1,1},
{1,0,0,0,1,1,1,1,1,1},
{1,0,0,0,1,1,1,1,1,1},
{1,1,1,1,0,0,0,1,1,1},
{1,1,1,1,0,0,0,1,1,1},
{1,1,1,1,0,0,0,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1} };
int kernel[3][3] = { {0,1,0},
{1,1,1},
{0,1,0} };
int result[HEIGHT][WIDTH] = {0};
int i, j, row, col;
for (i = 1; i < HEIGHT - 1; i++)
{
for (j = 1; j < WIDTH - 1; j++)
{
int sum = 0;
for (row = -1; row <= 1; row++)
{
for (col = -1; col <= 1; col++)
{
sum += image[i + row][j + col] * kernel[1 + row][1 + col];
}
}
result[i][j] = sum / 5; // 除以5是因为kernel中元素之和为5
}
}
for (i = 0; i < HEIGHT; i++)
{
for (j = 0; j < WIDTH; j++)
{
printf("%d ", result[i][j]);
}
printf("\n");
}
return 0;
}
```