用c语言写出利用sobel算子进行边缘提取的代码
时间: 2023-09-21 09:05:48 浏览: 105
### 回答1:
可以的,以下是利用sobel算子进行边缘提取的C语言代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define WIDTH 512
#define HEIGHT 512
int main()
{
int i, j, x, y, sumx, sumy;
int GX[3][3] = {{-1, , 1}, {-2, , 2}, {-1, , 1}};
int GY[3][3] = {{-1, -2, -1}, {, , }, {1, 2, 1}};
int image[WIDTH][HEIGHT], edge[WIDTH][HEIGHT];
FILE *fp;
fp = fopen("lena.raw", "rb");
fread(image, sizeof(unsigned char), WIDTH * HEIGHT, fp);
fclose(fp);
for (i = 1; i < WIDTH - 1; i++)
{
for (j = 1; j < HEIGHT - 1; j++)
{
sumx = ;
sumy = ;
for (x = -1; x <= 1; x++)
{
for (y = -1; y <= 1; y++)
{
sumx += image[i + x][j + y] * GX[x + 1][y + 1];
sumy += image[i + x][j + y] * GY[x + 1][y + 1];
}
}
edge[i][j] = (int)(sqrt(sumx * sumx + sumy * sumy) / 8);
}
}
fp = fopen("edge.raw", "wb");
fwrite(edge, sizeof(unsigned char), WIDTH * HEIGHT, fp);
fclose(fp);
return ;
}
### 回答2:
以下是使用C语言编写的利用Sobel算子进行边缘提取的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
int image[5][5] = { // 原始图像
{10, 10, 10, 10, 10},
{30, 40, 50, 40, 30},
{80, 90, 100, 90, 80},
{130, 140, 150, 140, 130},
{200, 200, 200, 200, 200}
};
int gradientX[5][5] = {0}; // 存储X方向梯度
int gradientY[5][5] = {0}; // 存储Y方向梯度
int sobelX[3][3] = { // Sobel算子的X方向模板
{-1, 0, 1},
{-2, 0, 2},
{-1, 0, 1}
};
int sobelY[3][3] = { // Sobel算子的Y方向模板
{-1, -2, -1},
{0, 0, 0},
{1, 2, 1}
};
// 计算X方向梯度
for (int i = 1; i < 4; i++) {
for (int j = 1; j < 4; j++) {
int sumX = 0;
for (int m = -1; m <= 1; m++) {
for (int n = -1; n <= 1; n++) {
sumX += image[i + m][j + n] * sobelX[m + 1][n + 1];
}
}
gradientX[i][j] = sumX;
}
}
// 计算Y方向梯度
for (int i = 1; i < 4; i++) {
for (int j = 1; j < 4; j++) {
int sumY = 0;
for (int m = -1; m <= 1; m++) {
for (int n = -1; n <= 1; n++) {
sumY += image[i + m][j + n] * sobelY[m + 1][n + 1];
}
}
gradientY[i][j] = sumY;
}
}
// 计算梯度幅值
int gradientMagnitude[5][5] = {0};
for (int i = 1; i < 4; i++) {
for (int j = 1; j < 4; j++) {
gradientMagnitude[i][j] = sqrt(gradientX[i][j] * gradientX[i][j] + gradientY[i][j] * gradientY[i][j]);
}
}
// 输出边缘提取结果
for (int i = 1; i < 4; i++) {
for (int j = 1; j < 4; j++) {
printf("%d ", gradientMagnitude[i][j]);
}
printf("\n");
}
return 0;
}
```
该代码实现了一个5x5的图像的边缘提取,通过Sobel算子的X方向和Y方向模板对图像的每个像素点进行卷积,得到相应的梯度值,然后计算梯度幅值来表示边缘强度。最后输出了边缘提取结果。
### 回答3:
以下是使用C语言编写的利用Sobel算子进行边缘提取的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义Sobel算子的模板
int sobelX[3][3] = { {-1, 0, 1}, {-2, 0, 2}, {-1, 0, 1} };
int sobelY[3][3] = { {-1, -2, -1}, {0, 0, 0}, {1, 2, 1} };
// 对图像应用Sobel算子进行边缘提取
void sobelEdgeDetection(int *image, int width, int height) {
int *output = (int*)malloc(width * height * sizeof(int)); // 分配输出图像的内存空间
for (int y = 1; y < height - 1; y++) {
for (int x = 1; x < width - 1; x++) {
int gx = 0;
int gy = 0;
// 对每个像素应用Sobel算子
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
gx += image[(y + i - 1) * width + (x + j - 1)] * sobelX[i][j];
gy += image[(y + i - 1) * width + (x + j - 1)] * sobelY[i][j];
}
}
// 计算像素的梯度强度
int gradient = abs(gx) + abs(gy);
// 将梯度强度保存到输出图像中
output[y * width + x] = gradient;
}
}
// 输出边缘提取后的图像
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
printf("%3d ", output[y * width + x]);
}
printf("\n");
}
free(output); // 释放输出图像的内存空间
}
int main() {
int image[9] = { 50, 80, 70, 90, 120, 100, 80, 100, 50 }; // 输入图像示例
int width = 3;
int height = 3;
sobelEdgeDetection(image, width, height);
return 0;
}
```
以上代码使用Sobel算子进行边缘提取。通过应用水平和垂直方向的Sobel算子,可以计算每个像素位置的梯度强度。最后,将计算得到的梯度强度保存到输出图像中并输出。在代码中以一个简单的3x3图像为例进行演示,可以根据需求修改输入图像和相关参数。
阅读全文