即使图像已模糊,CS50 模糊功能也未通过 check50

2023-12-12

我正在处理 CS50 问题集,其中我需要做一个box blur对于图像的每个像素。虽然我的代码有点多余,因为我为像素的特殊情况(如边缘和角)创建了 8 个 if 语句,但它按预期模糊了图像,所以我不太确定如何解决该问题。这是错误代码:

:( blur correctly filters middle pixel
    expected "127 140 149\n", not "145 160 169\n"
:( blur correctly filters pixel on edge
    expected "80 95 105\n", not "90 106 116\n"
:) blur correctly filters pixel in corner
:( blur correctly filters 3x3 image
    expected "70 85 95\n80 9...", not "70 85 95\n90 1..."
:( blur correctly filters 4x4 image
    expected "70 85 95\n80 9...", not "70 85 95\n90 1..."

还有更详细的错误代码here(只看“模糊”错误)

下面是我的代码:

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
    int blue;
    int green;
    int red;
    int counter = 0;

    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            if (i == 0 && j == 0)
            {
                // top left corner
                blue  = (image[i][j].rgbtBlue  + image[i + 1][j].rgbtBlue  + image[i][j+1].rgbtBlue  + image[i + 1][j+1].rgbtBlue);
                green = (image[i][j].rgbtGreen + image[i + 1][j].rgbtGreen + image[i][j+1].rgbtGreen + image[i + 1][j+1].rgbtGreen);
                red   = (image[i][j].rgbtRed   + image[i + 1][j].rgbtRed   + image[i][j+1].rgbtRed   + image[i + 1][j+1].rgbtRed);
                counter = 4;
            }

            else if (i == 0 && j == (width - 1))
            {
                // top right corner
                blue  = (image[i][j].rgbtBlue  + image[i + 1][j].rgbtBlue  + image[i][j-1].rgbtBlue  + image[i + 1][j-1].rgbtBlue);
                green = (image[i][j].rgbtGreen + image[i + 1][j].rgbtGreen + image[i][j-1].rgbtGreen + image[i + 1][j-1].rgbtGreen);
                red   = (image[i][j].rgbtRed   + image[i + 1][j].rgbtRed   + image[i][j-1].rgbtRed   + image[i + 1][j-1].rgbtRed);
                counter = 4;
            }

            else if (i == 0 && (j != 0 || j != (width - 1)))
            {
                // top edge
                blue  = (image[i][j - 1].rgbtBlue  + image[i][j].rgbtBlue  + image[i][j + 1].rgbtBlue  + image[i + 1][j].rgbtBlue  + image[i+1][j - 1].rgbtBlue  + image[i + 1][j + 1].rgbtBlue);
                green = (image[i][j - 1].rgbtGreen + image[i][j].rgbtGreen + image[i][j + 1].rgbtGreen + image[i + 1][j].rgbtGreen + image[i+1][j - 1].rgbtGreen + image[i + 1][j + 1].rgbtGreen);
                red   = (image[i][j - 1].rgbtRed   + image[i][j].rgbtRed   + image[i][j + 1].rgbtRed   + image[i + 1][j].rgbtRed   + image[i+1][j - 1].rgbtRed   + image[i + 1][j + 1].rgbtRed);
                counter = 6;
            }

            else if (i == (height - 1) && j == 0)
            {
                // bottom left corner
                blue  = (image[i-1][j + 1].rgbtBlue  + image[i][j + 1].rgbtBlue  + image[i - 1][j].rgbtBlue  + image[i][j].rgbtBlue);
                green = (image[i-1][j + 1].rgbtGreen + image[i][j + 1].rgbtGreen + image[i - 1][j].rgbtGreen + image[i][j].rgbtGreen);
                red   = (image[i-1][j + 1].rgbtRed   + image[i][j + 1].rgbtRed   + image[i - 1][j].rgbtRed   + image[i][j].rgbtRed);
                counter = 4;
            }

            else if (i == (height - 1) && j == (width - 1))
            {
                // bottom right corner
                blue  = (image[i][j].rgbtBlue  + image[i - 1][j].rgbtBlue  + image[i][j-1].rgbtBlue  + image[i - 1][j-1].rgbtBlue);
                green = (image[i][j].rgbtGreen + image[i - 1][j].rgbtGreen + image[i][j-1].rgbtGreen + image[i - 1][j-1].rgbtGreen);
                red   = (image[i][j].rgbtRed   + image[i - 1][j].rgbtRed   + image[i][j-1].rgbtRed   + image[i - 1][j-1].rgbtRed);
                counter = 4;
            }

            else if (i == (height - 1) && (j != 0 || j != (width - 1)))
            {
                // bottom edge
                blue  = (image[i][j].rgbtBlue  + image[i][j - 1].rgbtBlue  + image[i][j + 1].rgbtBlue  + image[i - 1][j].rgbtBlue  + image[i-1][j - 1].rgbtBlue  + image[i - 1][j + 1].rgbtBlue);
                green = (image[i][j].rgbtGreen + image[i][j - 1].rgbtGreen + image[i][j + 1].rgbtGreen + image[i - 1][j].rgbtGreen + image[i-1][j - 1].rgbtGreen + image[i - 1][j + 1].rgbtGreen);
                red   = (image[i][j].rgbtRed   + image[i][j - 1].rgbtRed   + image[i][j + 1].rgbtRed   + image[i - 1][j].rgbtRed   + image[i-1][j - 1].rgbtRed   + image[i - 1][j + 1].rgbtRed);
                counter = 6;
            }

            else if (j == 0 && (i != 0 || i != (height - 1)))
            {
                // left edge
                blue  = (image[i][j].rgbtBlue  + image[i - 1][j].rgbtBlue  + image[i+1][j].rgbtBlue  + image[i][j + 1].rgbtBlue  + image[i-1][j + 1].rgbtBlue  + image[i + 1][j + 1].rgbtBlue);
                green = (image[i][j].rgbtGreen + image[i - 1][j].rgbtGreen + image[i+1][j].rgbtGreen + image[i][j + 1].rgbtGreen + image[i-1][j + 1].rgbtGreen + image[i + 1][j + 1].rgbtGreen);
                red   = (image[i][j].rgbtRed   + image[i - 1][j].rgbtRed   + image[i+1][j].rgbtRed   + image[i][j + 1].rgbtRed   + image[i-1][j + 1].rgbtRed   + image[i + 1][j + 1].rgbtRed);
                counter = 6;
            }

            else if (j == (width - 1) && (i != 0 || i != (height - 1)))
            {
                // right edge
                blue  = (image[i][j].rgbtBlue  + image[i-1][j].rgbtBlue  + image[i + 1][j].rgbtBlue  + image[i][j - 1].rgbtBlue  + image[i + 1][j-1].rgbtBlue  + image[i-1][j - 1].rgbtBlue);
                green = (image[i][j].rgbtGreen + image[i-1][j].rgbtGreen + image[i + 1][j].rgbtGreen + image[i][j - 1].rgbtGreen + image[i + 1][j-1].rgbtGreen + image[i-1][j - 1].rgbtGreen);
                red   = (image[i][j].rgbtRed   + image[i-1][j].rgbtRed   + image[i + 1][j].rgbtRed   + image[i][j - 1].rgbtRed   + image[i + 1][j-1].rgbtRed   + image[i-1][j - 1].rgbtRed);
                counter = 6;
            }

            else
            {
                blue  = (image[i][j].rgbtBlue  + image[i - 1][j].rgbtBlue  + image[i + 1][j].rgbtBlue  + image[i][j - 1].rgbtBlue  + image[i][j + 1].rgbtBlue  + image[i - 1][j + 1].rgbtBlue  + image[i-1][j - 1].rgbtBlue  + image[i + 1][j - 1].rgbtBlue  + image[i + 1][j + 1].rgbtBlue);
                green = (image[i][j].rgbtGreen + image[i - 1][j].rgbtGreen + image[i + 1][j].rgbtGreen + image[i][j - 1].rgbtGreen + image[i][j + 1].rgbtGreen + image[i - 1][j + 1].rgbtGreen + image[i-1][j - 1].rgbtGreen + image[i + 1][j - 1].rgbtGreen + image[i + 1][j + 1].rgbtGreen);
                red   = (image[i][j].rgbtRed   + image[i - 1][j].rgbtRed   + image[i + 1][j].rgbtRed   + image[i][j - 1].rgbtRed   + image[i][j + 1].rgbtRed   + image[i - 1][j + 1].rgbtRed   + image[i-1][j - 1].rgbtRed   + image[i + 1][j - 1].rgbtRed   + image[i + 1][j + 1].rgbtRed);
                counter = 9;
            }

            image[i][j].rgbtBlue  = round((float) blue / counter);
            image[i][j].rgbtGreen = round((float) green / counter);
            image[i][j].rgbtRed   = round((float) red / counter);
        }
    }
    return;
}

看看其他人对同样问题的答案,我发现有些人做了第二个嵌套for循环存储像素的原始值。我最初尝试实现这个,但最终导致了问题,所以我认为没有必要。这是我的代码的问题吗?如果是,我将如何在代码中正确实现“原始值”像素?如果没有,有人知道问题所在吗?提前致谢。


您正在修改您的image当您将模糊功能应用于像素时。这意味着当您修改几个像素时,相邻像素的模糊值将使用“模糊像素值”计算。这是错误的。所有计算必须在原始图像像素值内完成。为此,您应该创建一个副本image一开始(例如temp)并在其中进行所有这些计算temp具有未修改像素值的图像。

将其添加到代码的开头;

RGBTRIPLE temp[height][width]; // create a temporary array to store a duplicate of image.

// save a new copy of image as temp per color.
for (int i = 0; i < height; i++) //Loop for height of image.
{
    for (int j = 0; j < width; j++) //Loop for width of image and save color values in temp.
    {
        temp[i][j] = image[i][j];
    }
}

并更换image with temp在你的计算中(除了最后的作业)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使图像已模糊,CS50 模糊功能也未通过 check50 的相关文章

  • 具有可绑定属性的自定义视图未在 Xamarin.Forms SAP 上正确绑定

    我有一个复选框 应该触发按钮的 IsEnabled 事件 但不知何故 应该执行的命令永远不会正确绑定并因此执行 这是 CheckBox xaml cs 控件 中的可绑定属性 public static readonly BindablePr
  • 将 Stream 反序列化为 List 或任何其他类型

    尝试将流反序列化为List
  • SharpZipLib - 将文件夹/目录添加到 zip 存档

    通过示例 我很好地掌握了如何提取 zip 文件 几乎在每个示例中 识别 ZipEntry 是否为目录的方法如下 string directoryName Path GetDirectoryName theEntry Name string
  • Accept() 是线程安全的吗?

    我目前正在用 C 语言为我正在做的课程编写一个简单的网络服务器 我们的一项要求是实现一个线程池来使用 pthread 处理连接 我知道我将如何粗略地执行此操作 在主线程中调用accept并将文件描述符传递给freee线程 但是我的朋友建议了
  • 如何从RichTextBox中获取显示的文本?

    如何获得显示的RichTextBox 中的文本 我的意思是 如果 RichTextBox 滚动到末尾 我只想接收那些对我来说可见的行 P S 获得第一个显示的字符串就足够了 您想使用 RichTextBox GetCharIndexFrom
  • 如何使用 MVVM 更新 WPF 中编辑的数据? [复制]

    这个问题在这里已经有答案了 我正在为聊天应用程序构建 UI 设计 在尝试更新所选联系人的消息时遇到问题 选择现有联系人 选择编辑选项 然后编辑其属性 例如用户名和图像 后 唯一进行的更改是联系人的用户名和图像 我仍然想更改 MessageM
  • 从 future 中检索值时的 SIGABRT

    我在使用 C 11 future 时遇到问题 当我打电话时wait or get 关于返回的未来std async 程序接收从mutex标头 可能是什么问题呢 如何修复它 我在 Linux 上使用 g 4 6 将以下代码粘贴到 ideone
  • 如何使用 wpf webbrowser 将数据发布到 Web 服务器

    我想从数据库获取数据并使用它来让用户登录到网站 我有一个包含 Web 浏览器控件的 wpf 页面 我有这样的代码 用于将用户登录到用 php 编写的网站
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 单线程公寓问题

    从我的主窗体中 我调用以下命令来打开一个新窗体 MyForm sth new MyForm sth show 一切都很好 但是这个表单有一个组合框 当我将其 AutoCompleteMode 切换为建议和追加时 我在显示表单时遇到了这个异常
  • C# datagridview 列转入数组

    我正在用 C 构建一个程序 并在其中包含一个 datagridview 组件 datagridview 有固定数量的列 2 我想将其保存到两个单独的数组中 但行数确实发生了变化 我怎么能这样做呢 假设一个名为 dataGridView1 的
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • 以编程方式更新 ClickOnce 应用程序的部署清单会导致缺少 4.0 中所需的 <兼容框架> 元素

    我正在致力于自动化 NET 4 0 ClickOnce WPF 应用程序的安装程序 该应用程序需要在应用程序配置文件 我经历了寻找必须遵循的具体步骤的棘手过程Mage exe http msdn microsoft com en us li
  • 特征密集稀疏矩阵乘积是线程化的吗?

    我知道稀疏密集产品是根据文档进行线程化的 https eigen tuxfamily org dox TopicMultiThreading html https eigen tuxfamily org dox TopicMultiThre
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 使用 foreach 循环和 XmlNodeList C# 将新节点附加到节点列表

    目前我处理的是这样的XML类型 XML FILE http 20drive google com open id 0By5BxgNi9eGcRldxcEZNU0FDTzQ 参考XML文件 我想检查一个节点 如果找不到该节点 我必须将该节点附
  • ASP.NET Core Razor Page 多路径路由

    我正在使用 ASP NET Core 2 0 Razor Pages 不是 MVC 构建系统 但在为页面添加多个路由时遇到问题 例如 所有页面都应该能够通过 abc com language 访问segment shop mypage 或
  • FindAsync 很慢,但是延迟加载很快

    在我的代码中 我曾经使用加载相关实体await FindAsync 希望我能更好地遵守 C 异步指南 var activeTemplate await exec DbContext FormTemplates FindAsync exec

随机推荐

  • ARM 中的 WFE 指令处理

    WFE 指令如何运作 我读到的是 它使处理器等待 IRQ FIQ event 但是 当您获得 IRQ 时会发生什么 irq fault handler 向量是否在获得中断或执行 WFE 之后的指令时执行 WFE 在概念上等同于 while
  • Firefox 滚动顶部问题

    我对 Firefox 的scrollTop 值和onscroll 事件有疑问 这在 IE Safari 和 Chrome 中效果很好 但 Firefox 似乎滞后 我尝试使用onscroll事件更新一些背景位置 但是当我拿起手柄并快速上下拖
  • ubuntu 16 上的 bash:set -e 不在子 shell 内继承

    当我运行这个命令时 set e echo echo I get himBH作为输出 我期待着这封信e包含在输出中 这是怎么回事 我使用的是 Ubuntu 16 04 1 LTS GNU bash 版本 4 3 46 1 release x8
  • 如何从 AngularJS 指令中选择动态生成的元素?

    在我的指令中 我需要选择某些 DOM 元素 其中一些元素是在 ng repeat 循环中动态生成的 如果我以直接的方式执行此操作 我将只获得静态元素 但是 如果我将选择延迟 500 毫秒 我将获得所有元素 这就是我想要的 虽然这可行 但它不
  • destroy_user_session_path 在 Rails 中触发 GET 而不是 DELETE

    我认为有以下代码 li li 它会生成以下 HTML a href users sign out Sign out a 但是 当单击该链接时 我收到以下错误 No route matches GET users sign out 我在这里做
  • 如何修复 Flask 蓝图的端点错误

    我正在用蓝图学习 Flask 我有以下代码示例 from flask import Flask render template Blueprint g bp Blueprint language name url prefix
  • 自定义 ListView 适配器。 TextChangedListener 调用错误的 EditText

    我有带有自定义适配器的旅行者列表 其中包含两个 EditText edtFirstName 和 edtLastName 我希望当用户输入文本时将更改保存到列表中 并且当单击下一个按钮时将此列表发送到另一个活动 My code public
  • 加密字符串从 Delphi 到 C#

    我正在尝试解密在 Delphi 中使用 Cipher1 3 0 加密的 C 中的一个字符串 来自 Delphi 加密纲要的第一部分 我使用 TCipher Rijndael 我加密的字符串是 this is a test example 密
  • 将字符串中除第一个和最后一个字符之外的所有字符替换为星号[重复]

    这个问题在这里已经有答案了 如何在PHP中将字符串中除了第一个和最后一个字符之外的所有字符替换为星号 例如test应该成为t t and profanity become p y等等 function get starred str len
  • 如何在没有 oledb 的情况下将 Excel 文件数据上传到 SQL Server

    我一直在尝试使用 ASP NET Core MVC 将数据从 Excel 文件导入到 SQL Server 中 但这段代码无法运行 HttpPost public IActionResult Index ICollection
  • NHibernate QueryOver 投影 - 将集合投影到 DTO

    我正在尝试将实体集合投影到 DTO 中 使用简单的属性就足够简单了 但是集合有问题 public class Blog public string Name get set public IList
  • JQuery mobile - 内容导航在纵向按钮上折叠

    我们正在开发一个布局接近 jqm 示例的应用程序here 左侧的目录和右侧的内容 但我们想要与 Sencha mobile 相同的行为 当它处于纵向时 目录会在导航按钮中折叠here 可以用jqm来做吗 我创建了一个示例 jQuery Mo
  • 需要 SIMPLESAMLPHP 后 SESSION 变量不起作用

    我的会话变量有问题 在我需要一次之后我无法设置任何变量 但我需要在登录后存储我的数据 这是代码 EDIT session start 位于 header php 中 我尝试在另一个页面上获取会话变量echo SESSION niva
  • Android getUriForFile IllegalArgumentException

    我用 Intent 发送文件的代码不适用于所有文件源 而且我还找不到解决方案 我的应用程序已注册用于打开文件 因此当我在 ES 文件资源管理器中选择文件时 意图如下所示 intent gt mData gt uriString storag
  • 对 <****.ViewController: 0x7fa425f07120> 的开始/结束外观转换的不平衡调用

    我看过很多与此错误相关的其他 stackoverflow 帖子 但在我的情况下我无法理解它 因此不知道如何解决 stackoverflow 帖子中的大多数回复 例如this例如 其中一个 涉及多个视图控制器 以及如何在前一个视图控制器完成之
  • 如何向WebRequest添加cookie?

    我正在尝试对一些代码进行单元测试 我需要替换它 HttpWebRequest httpWebRequest HttpWebRequest WebRequest Create uri httpWebRequest CookieContaine
  • 从 byte[] 转换为字符串

    我有以下代码 using BinaryReader br new BinaryReader File Open FILE PATH FileMode Open FileAccess ReadWrite int pos 0 int lengt
  • 获取 JAR 文件版本号

    我有一个用于集群的应用程序 以便在一个或多个失败时保持其可用 并且我想实现一种方法来检查 java 中 jar 文件的版本 我有这段代码可以做到这一点 例如 在 MyClass 类中 URLClassLoader cl URLClassLo
  • 在网络浏览器中单击按钮

    我已经创建了网络浏览器 现在我想通过单击表单上的 Button1 单击网络上的按钮 private void button1 Click object sender EventArgs e webBrowser1 Document GetE
  • 即使图像已模糊,CS50 模糊功能也未通过 check50

    我正在处理 CS50 问题集 其中我需要做一个box blur对于图像的每个像素 虽然我的代码有点多余 因为我为像素的特殊情况 如边缘和角 创建了 8 个 if 语句 但它按预期模糊了图像 所以我不太确定如何解决该问题 这是错误代码 blu