我最初在纸上写了这段代码,据我所知,应该可以工作,但我得到了错误的输出。 文件内:https://imgur.com/oIffo7o 输出文件:https://imgur.com/rCNvW3L 感谢任何形式的帮助
void edges(int height, int width, RGBTRIPLE image[height][width])
{
int Gx[3][3] = {{-1, 0, 1}, {-2, 0, 2}, {-1, 0, 1}};
int Gy[3][3] = {{-1, -2, -1}, {0, 0, 0}, {1, 2, 1}};
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
int sumGx[3] = {0, 0, 0};
int sumGy[3] = {0, 0, 0};
for (int dy = -1; dy <= 1; dy++)
{
for (int dx = -1; dx <= 1; dx++)
{
int ky = y + dy;
int kx = x + dx;
if ((ky > 0 && ky < height) && (kx > 0 && kx < width))
{
sumGx[0] += Gx[dy + 1][dx + 1] * image[ky][kx].rgbtRed;
sumGx[1] += Gx[dy + 1][dx + 1] * image[ky][kx].rgbtGreen;
sumGx[2] += Gx[dy + 1][dx + 1] * image[ky][kx].rgbtBlue;
sumGy[0] += Gy[dy + 1][dx + 1] * image[ky][kx].rgbtRed;
sumGy[1] += Gy[dy + 1][dx + 1] * image[ky][kx].rgbtGreen;
sumGy[2] += Gy[dy + 1][dx + 1] * image[ky][kx].rgbtBlue;
}
}
}
int pixel_value[3] = {0, 0, 0};
for (int i = 0; i < 3; i++)
{
if ((sumGx[i] != 0) && (sumGy[i] != 0))
{
int squaredGx = sumGx[i] * sumGx[i];
int squaredGy = sumGy[i] * sumGy[i];
int edge = round(sqrt(squaredGx + squaredGy));
pixel_value[i] = edge > 255 ? 255 : edge;
}
}
image[y][x].rgbtRed = pixel_value[0];
image[y][x].rgbtGreen = pixel_value[1];
image[y][x].rgbtBlue = pixel_value[2];
}
}
这是 RGBTRIPLE 的代码:
typedef struct
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;
所以我发现我做错了什么,我必须创建原始图像的复制图像。然后对复制图像应用 Sobel 算子,同时将值赋给图像[y][x]像素。这样我们就可以避免原始图像中的结果出现偏差。 我之前编写的代码是更改每个像素的值,对于后续像素,它将使用覆盖的值,从而为整个图像产生不同的结果。
这是对代码的添加:
void edges(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE original[height][width];
memcpy(original, image, sizeof(RGBTRIPLE)*height*width);
//* Existing code
if ((ky >= 0 && ky < height) && (kx >= 0 && kx < width))
{
sumGx[0] += Gx[dy + 1][dx + 1] * original[ky][kx].rgbtRed;
sumGx[1] += Gx[dy + 1][dx + 1] * original[ky][kx].rgbtGreen;
sumGx[2] += Gx[dy + 1][dx + 1] * original[ky][kx].rgbtBlue;
sumGy[0] += Gy[dy + 1][dx + 1] * original[ky][kx].rgbtRed;
sumGy[1] += Gy[dy + 1][dx + 1] * original[ky][kx].rgbtGreen;
sumGy[2] += Gy[dy + 1][dx + 1] * original[ky][kx].rgbtBlue;
}
// Rest of the code
// Squaring and finding the value for each pixel using squaredGx and
squaredGy, and assigning the value to image[y][x]
}
这应该可以。这些添加解决了我面临的问题。