CS50(Pset4)过滤更多“;“边缘”;代码出错了

CS50(Pset4)过滤更多“;“边缘”;代码出错了,c,cs50,C,Cs50,我做了第一个中间像素的代码,但它不能正常工作,我不知道为什么。我不知道代码是否有遗漏或者我误解了算法 中间像素的代码: RGBTRIPLE edge[height][width]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { edge[i][j].rgbtBlue = image[i][j].rgbtBlue; edge[i][j].rgbtGree

我做了第一个中间像素的代码,但它不能正常工作,我不知道为什么。我不知道代码是否有遗漏或者我误解了算法

中间像素的代码:

  RGBTRIPLE edge[height][width];

  for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
      edge[i][j].rgbtBlue = image[i][j].rgbtBlue;
      edge[i][j].rgbtGreen = image[i][j].rgbtGreen;
      edge[i][j].rgbtRed = image[i][j].rgbtRed;
    }
  }

  for (int h = 0; h < height; h++) {
    for (int w = 0; w < width; w++) {
      int red1 = (edge[h - 1][w - 1].rgbtRed * -1)
          + (edge[h - 1][w + 1].rgbtRed) + (edge[h][w - 1].rgbtRed * -2)
          + (edge[h][w + 1].rgbtRed * 2) + (edge[h + 1][w - 1].rgbtRed * -1)
          + (edge[h + 1][w + 1].rgbtRed * 1);
      int red2 = (edge[h - 1][w - 1].rgbtRed * -1)
          + (edge[h - 1][w].rgbtRed * -2) + (edge[h - 1][w + 1].rgbtRed * -1)
          + (edge[h + 1][w - 1].rgbtRed) + (edge[h + 1][w].rgbtRed * 2)
          + (edge[h + 1][w + 1].rgbtRed);

      int g_red = round(pow(red1 * red1 + red2 * red2, 0.5));
      if (g_red > 255)
        g_red = 255;
      image[h][w].rgbtRed = g_red;

      int blue1 = edge[h - 1][w - 1].rgbtBlue * -1 + edge[h - 1][w + 1].rgbtBlue
          + edge[h][w - 1].rgbtBlue * -2 + edge[h][w + 1].rgbtBlue * 2
          + edge[h + 1][w - 1].rgbtBlue * -1 + edge[h + 1][w + 1].rgbtBlue;
      int blue2 = edge[h - 1][w - 1].rgbtBlue * -1
          + edge[h - 1][w].rgbtBlue * -2 + edge[h - 1][w + 1].rgbtBlue * -1
          + edge[h + 1][w - 1].rgbtBlue + edge[h + 1][w].rgbtBlue * 2
          + edge[h + 1][w + 1].rgbtBlue;

      int g_blue = round(sqrt(blue1 * blue1 + blue2 * blue2));
      if (g_blue > 255)
        g_blue = 255;
      image[h][w].rgbtRed = g_blue;

      int green1 = edge[h - 1][w - 1].rgbtGreen * -1
          + edge[h - 1][w + 1].rgbtGreen + edge[h][w - 1].rgbtGreen * -2
          + edge[h][w + 1].rgbtGreen * 2 + edge[h + 1][w - 1].rgbtGreen * -1
          + edge[h + 1][w + 1].rgbtGreen;
      int green2 = edge[h - 1][w - 1].rgbtGreen * -1
          + edge[h - 1][w].rgbtGreen * -2 + edge[h - 1][w + 1].rgbtGreen * -1
          + edge[h + 1][w - 1].rgbtGreen + edge[h + 1][w].rgbtGreen * 2
          + edge[h + 1][w + 1].rgbtGreen;

      int g_green = round(sqrt(green1 * green1 + green2 * green2));
      if (g_green > 255)
        g_green = 255;
      image[h][w].rgbtRed = g_green;

    }
  }
rgb三边[高度][宽度];
对于(int i=0;i255)
g_red=255;
图像[h][w]。rgbtRed=g_红;
int blue1=edge[h-1][w-1]。rgbtBlue*-1+edge[h-1][w+1]。rgbtBlue
+边[h][w-1]。rgbtBlue*-2+边[h][w+1]。rgbtBlue*2
+边[h+1][w-1]。rgbtBlue*-1+边[h+1][w+1]。rgbtBlue;
int blue2=edge[h-1][w-1].rgbtBlue*-1
+边[h-1][w]。rgbtBlue*-2+边[h-1][w+1]。rgbtBlue*-1
+边[h+1][w-1]。rgbtBlue+边[h+1][w]。rgbtBlue*2
+边[h+1][w+1].rgbtBlue;
int g_蓝色=圆形(sqrt(蓝色1*蓝色1+蓝色2*蓝色2));
如果(g_蓝>255)
g_蓝=255;
图像[h][w].rgbtRed=g_蓝;
int green1=边[h-1][w-1].rgbtGreen*-1
+边[h-1][w+1]。rgbtGreen+边[h][w-1]。rgbtGreen*-2
+边[h][w+1]。rgbtGreen*2+边[h+1][w-1]。rgbtGreen*-1
+边[h+1][w+1]。绿色;
int green2=边[h-1][w-1].rgbtGreen*-1
+边[h-1][w]。rgbtGreen*-2+边[h-1][w+1]。rgbtGreen*-1
+边[h+1][w-1]。rgbtGreen+边[h+1][w]。rgbtGreen*2
+边[h+1][w+1]。绿色;
int g_绿色=圆形(sqrt(绿色1*绿色1+绿色2*绿色2));
如果(g_绿色>255)
g_绿色=255;
图像[h][w]。rgbtRed=g_绿色;
}
}
检查50个输出:
:(边缘正确过滤中间像素
应为“210 150 60\n”,而不是“150 40 100\n”

至少此问题:

访问其范围之外的阵列

示例:在第一次迭代中,代码尝试访问
边缘[-1][-1]

这不仅仅是“中间像素代码”

for(int h=0;h
代码需要重写以处理边缘和角点情况


有问题的算法

尚不清楚访问8个像素中的6个像素如何均匀地检测边缘


我希望
/6
某个地方可以将
图像[][]
保持在与
边缘[][]相同的大小上

我不明白为什么要对不同相邻像素的值进行加权并取平方根。这里发布的CS50代码通常只找到每个r、g、b分量的简单平均值。在边缘和拐角处,您还可以计算地图上用作除数的像素数。@WeatherVane这可能不是模糊任务,而是t他使用Sobel算子进行边缘检测。@WeatherVane我不明白你的意思。我使用了他们告诉我们要使用的内核,正如Gerhardh@WeatherVane好的,谢谢你和格哈德,我会在谷歌上搜索更多信息来了解itI,它只针对中间像素,但不起作用。根据内核,它应该可以访问周围的6个像素或仅中间像素-->否。发布的代码也会对角点/边缘像素进行操作。它的操作方式会调用不确定的行为。现在,请尝试对(int h=1;h+1进行
width
操作,并像wise一样仅对中间像素进行操作。“根据内核”不清楚。请发布描述算法的文档链接。
for(int h = 0 ; h < height ; h ++) {
    for(int w = 0 ; w < width ; w ++) {
       int red1 = (edge[h - 1][w - 1].rgbtRed * -1) + ...