pset4filter less: helpers.c

news2024/12/23 13:13:42

(4)blur function

  • 简单画图熟悉一下要做什么
    在这里插入图片描述
  • 可以看到3种情况,顶格,边界,里面
  • 如果分开算的话,是真的麻烦;但是当时还真的没有想到更好的,就先写一写(此处摘取3处)
  • 外部都是 for (int i = 0; i < height; i++) { 下边省去不写 for (int j = 0; j < width; j++) { } }

里面

int sumRed = 0,sumGreen = 0,sumBlue = 0;
    //set 3 conditions by the limit
         //!前面1部分
        //计算9个格子
         if (i > 0 && i < height - 1 && j > 0 && j < width - 1) {
            for (int k = -1; k <= 1; k++) {
                for (int m = -1; m <= 1; m++) {
                sumRed += copy[i + k][j + m].rgbtRed;
                sumGreen += copy[i + k][j + m].rgbtGreen;
                sumBlue += copy[i + k][j + m].rgbtBlue;
            }
        }
         //after sum it all and give that value to image
        image[i][j].rgbtRed = round(sumRed / 9.0);
        image[i][j].rgbtGreen = round(sumGreen / 9.0);
        image[i][j].rgbtBlue = round(sumBlue / 9.0);
}

顶格

//1.1 左上角 i + j +
    sumRed = 0, sumGreen = 0, sumBlue = 0;
    if (j == 0 && i == 0) {
        for (int k = 0; k <= 1; k++) {
            for (int m = 0; m <= 1; m++) {
                sumRed += copy[i + k][j + m].rgbtRed;
                sumGreen += copy[i + k][j + m].rgbtGreen;
                sumBlue += copy[i + k][j + m].rgbtBlue;
            }
        }
        //after sum it all and give that value to image
        image[i][j].rgbtRed = round(sumRed / 4.0);
        image[i][j].rgbtGreen = round(sumGreen / 4.0);
        image[i][j].rgbtBlue = round(sumBlue / 4.0);
    }

边界

    //2.1上边界:移动的方向只有下(高度-1)k +,左边m -,右边m+
    sumRed = 0, sumGreen = 0, sumBlue = 0;
    if (i == 0) {
        //计算RGB利用双循环(k,m)
        for (int k = 0; k <= 1; k++) {
            for (int m = -1; m <= 1; m++) {
                sumRed += copy[i + k][j + m].rgbtRed;
                sumGreen += copy[i + k][j + m].rgbtGreen;
                sumBlue += copy[i + k][j + m].rgbtBlue;
            }
        }
        image[i][j].rgbtRed = round(sumRed / 6.0);
        image[i][j].rgbtGreen = round(sumGreen / 6.0);
        image[i][j].rgbtBlue = round(sumBlue / 6.0);
        }

简化

  • 然后可以看到很多重复的地方,需要开始统一,找到不同的地方4,6,9,然后里层的双循环k,m其实也可以合并,
  • 只要移动之后的index在范围里面就可以了,里层循环的次数加上限定的条件计算count,然后一步步开始删减…
// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
    // copy the image[height][width]
    RGBTRIPLE copy[height][width];
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            copy[i][j] = image[i][j];
        }
    }
    int sumRed = 0, sumGreen = 0, sumBlue = 0, count = 0;
    // set 3 conditions by the limit
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {

            for (int k = -1; k <= 1; k++)
            {
                for (int m = -1; m <= 1; m++)
                {
                    // condition limit boundary
                    if (i + k >= 0 && i + k <= height - 1 && j + m >= 0 && j + m <= width - 1)
                    {
                        sumRed += copy[i + k][j + m].rgbtRed;
                        sumGreen += copy[i + k][j + m].rgbtGreen;
                        sumBlue += copy[i + k][j + m].rgbtBlue;
                        count++;
                    }
                }
            }
            // after sum it all and give that value to image
            //before calculating the results,first convert it to float!
            image[i][j].rgbtRed = round((float) sumRed / count);
            image[i][j].rgbtGreen = round((float) sumGreen / count);
            image[i][j].rgbtBlue = round((float) sumBlue / count);
            // clear it and for next round
            sumRed = 0, sumGreen = 0, sumBlue = 0, count = 0;
        }
    }
}

问题

这里要在计算之前,把int sumRGB值转化成float类型

image[i][j].rgbtRed = round((float) sumRed / count);

而不是float(计算之后的值),这样就把小数点之后的都丢了

image[i][j].rgbtRed = round((float)( sumRed / count));

总结

刚开始的时候想不到简洁的方法或者不太理解,先慢慢写出来,能运行就可以。
后面再去优化,一步一步来,不需要太大压力

check

:) helpers.c exists
:) filter compiles
:) grayscale correctly filters single pixel with whole number average
:) grayscale correctly filters single pixel without whole number average
:) grayscale leaves alone pixels that are already gray
:) grayscale correctly filters simple 3x3 image
:) grayscale correctly filters more complex 3x3 image
:) grayscale correctly filters 4x4 image
:) sepia correctly filters single pixel
:) sepia correctly filters simple 3x3 image
:) sepia correctly filters more complex 3x3 image
:) sepia correctly filters 4x4 image
:) reflect correctly filters 1x2 image
:) reflect correctly filters 1x3 image
:) reflect correctly filters image that is its own mirror image
:) reflect correctly filters 3x3 image
:) reflect correctly filters 4x4 image
:) blur correctly filters middle pixel
:) blur correctly filters pixel on edge
:) blur correctly filters pixel in corner
:) blur correctly filters 3x3 image
:) blur correctly filters 4x4 image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2264243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3. Kafka入门—安装与基本命令

Kafka基础操作 一. 章节简介二. kafka简介三. Kafka安装1. 准备工作2. Zookeeper安装2.1 配置文件2.2 启动相关命令3. Kafka安装3.1 配置文件3.2 启动相关命令-------------------------------------------------------------------------------------------------------------…

某政银行APP登陆逆向

版本 V10.0.0 环境检测 {"xposed": {"action": "warn_and_exit","msg": {"zh_CN": "检测到您的设备安装有Xposed框架&#xff0c;存在非法攻击风险&#xff01;"},"button": {"zh_CN": &qu…

51c自动驾驶~合集42

我自己的原文哦~ https://blog.51cto.com/whaosoft/12888355 #DriveMM 六大数据集全部SOTA&#xff01;最新DriveMM&#xff1a;自动驾驶一体化多模态大模型&#xff08;美团&中山大学&#xff09; 近年来&#xff0c;视觉-语言数据和模型在自动驾驶领域引起了广泛关注…

算法题(12): 特殊年份

审题&#xff1a; 需要输出特殊年份的个数 思路&#xff1a; 获取数据&#xff1a;用字符串获取&#xff0c;然后全部加到总字符串s上判断 使用for循环对每一个四位数年分进行判断&#xff0c;如果是特殊年份就让负责记录的cou变量 解题&#xff1a; 注意&#xff1a;为什么我们…

RuoYi-Vue 数据权限控制示例nvliz (作业机器版)

目录 需求分析 ​编辑建表 代码编写 service层 Mapper层 测试 修改数据权限 添加数据 需求分析 建表 在若依的数据库中建立设备表&#xff1a;equipment 代码编写 使用代码生成&#xff0c;设备管理信息界面&#xff0c;如下图&#xff1a; 使用RuoYi的代码生成的功…

汽车IVI中控开发入门及进阶(三十八):手机投屏HiCar开发

手机投屏轻松实现手机与汽车的无缝连接,导航、音乐、通话等功能应有尽有,还支持更多第三方应用,让车载互联生活更加丰富多彩。 HiCar在兼容性和开放性上更具优势。 手机投屏可以说是车机的杀手级应用,大大拓宽了车机的可用性范围。其中华为推出的HiCar就是非常好用的一种。…

数据结构经典算法总复习(下卷)

第五章:树和二叉树 先序遍历二叉树的非递归算法。 void PreOrderTraverse(BiTree T, void (*Visit)(TElemType)) {//表示用于查找的函数的指针Stack S; BiTree p T;InitStack(S);//S模拟工作栈while (p || !StackEmpty(S)) {//S为空且下一个结点为空&#xff0c;意味着结束遍…

PID 控制算法理论背景:飞控领域的核心调控机制(1)

在飞控工程领域&#xff0c;PID 控制算法占据着极为关键的地位&#xff0c;是实现飞行器精确稳定控制的基石。PID 作为比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;、微分&#xff08;D&#xff09;的集成代表&#xff0c;构建起了控制系统的核心架构&#x…

插入排序与计数排序详解

在 C 编程中&#xff0c;排序算法是非常基础且重要的知识。今天我们就来深入探讨两种常见的排序算法&#xff1a;插入排序和计数排序&#xff0c;包括它们的代码实现、时间复杂度、空间复杂度、稳定性分析以及是否有优化提升的空间。 一、插入排序 插入排序&#xff08;Inser…

示波器--UNI-T 优利德 UT4102C 使用介绍

示波器--UNI-T 优利德 UT4102C 使用介绍 1 介绍图示特点 2 UTP04示波器探头&#xff08;100M带宽&#xff09;3 功能介绍4 示例RS232 电平信号测试 参考 1 介绍 图示 特点 2GS/s的实时采样率&#xff1a;设备能够以每秒2吉萨&#xff08;Giga Samples per second&#xff09;…

【Mybatis-Plus】连表查询 逻辑删除 多租户

文章目录 连表查询逻辑删除多租户 连表查询 引入 mybatis-plus-join-boot-starter 依赖 <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId><version>1.5.1</version>…

【java面向对象编程】第七弹----Object类、类变量与类方法

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;javase &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一、Object类 1.1equa…

【常微分方程讲义1.1】方程的种类发展与完备

方程在数学历史中不断发展&#xff0c;逐步趋于完备。从最初的简单代数方程到包含函数、算子甚至泛函的更复杂方程&#xff0c;数学家通过不断的扩展和深化&#xff0c;逐渐建立起更为丰富和多元的方程类型体系。方程的种类之所以不断演变&#xff0c;部分是因为解决实际问题的…

《庐山派从入门到...》板载按键启动!

《庐山派从入门到...》板载按键启动&#xff01; 《庐山派从入门到...》板载按键启动&#xff01; 视频内容大致如下 我们之前了解了GPIO的输出模式使用方法&#xff0c;并且成功点灯&#xff0c;很明显本篇要来分享的自然是GPIO的输入模式 正好回顾一下之前学的python基础包…

Android笔试面试题AI答之Android基础(3)

文章目录 1.谈一谈 Android 的安全机制一、系统架构层面的安全设计二、核心安全机制三、其他安全机制与措施 2.Android 的四大组件是哪四大&#xff1f;3.Android 的四大组件都需要在清单文件中注册吗&#xff1f;4.介绍几个常用的Linux命令一、文件和目录管理二、用户和权限管…

黑马商城项目—服务调用

使用起因 之前我们完成了拆分购物车模块,但当我们进行测试查询时: 我们注意到&#xff0c;其中与商品有关的几个字段中:最新状态和库存为默认值,最新价格为空&#xff01;这就是因为我们注释掉了查询购物车时&#xff0c;查询商品信息的相关代码。 那么&#xff0c;我们该如何…

RK356x bsp 5 - 海华AW-CM358SM Wi-Fi/Bt模组调试记录

文章目录 1、环境介绍2、目标3、海华AW-CM358SM3.1、基本信息3.2、支持SDIO3.03.3、电气特性 4、适配流程步骤5、让SDIO控制器工作&#xff0c;且可以扫到WIFI卡5.1、dts配置5.2、验证 6、Wi-Fi 适配6.1、dts配置6.2、驱动移植6.2.1、kernel menuconfig6.2.2、传统驱动移植6.2.…

VBA编程:自定义函数 - 字符串转Hex数据

目录 一、自定义函数二、语法将字符串转换为hex数据MID函数:返回一个字符串中指定位置和长度的子串LEN函数:返回一个字符串的长度(字符数)Asc函数三、定义变量和数据类型变量声明的基本语法常见的数据类型四、For循环基本语法五、&运算符一、自定义函数 定义:用户定义…

工业大数据分析算法实战-day12

文章目录 day12时序分解STL&#xff08;季节性趋势分解法&#xff09;奇异谱分析&#xff08;SSA&#xff09;经验模态分解&#xff08;EMD&#xff09; 时序分割ChangpointTreeSplitAutoplait有价值的辅助 时序再表征 day12 今天是第12天&#xff0c;昨天主要是针对信号处理算…