【问题标题】:2d arrays and image smoothing in c [closed]c中的二维数组和图像平滑[关闭]
【发布时间】:2012-09-28 20:55:16
【问题描述】:

我必须编写一个程序,“将图像作为输入,由二维数组像素值表示(为简单起见,每个像素都可以用整数表示)。通过应用均值滤波器输出得到的平滑图像阵列中的每个像素”。

我只是在学习数组,但我什至不知道如何启动这个程序。每当我搜索这个主题时,它都会变得非常混乱,因为我发现的每个示例或概念都在使用或谈论实际图像。由于我的程序使用整数,我很难区分需要什么和不需要什么。基本上我理解这个前提(至少我认为我理解),每个数字必须从它周围的 4 个数字中取平均值,但是在基本概念之外,我不知道需要做什么。任何帮助、建议或示例都会很棒。

谢谢

【问题讨论】:

  • 1) 8 位通道 RGB 图像是 0-255 整数三层的合成,所以对它们有用的方法对你有用 2) 你有一个 2D 图像。在嵌套的 for 循环中循环遍历值 I[i,j],并在每个元素处执行计算。当心边界情况
  • 程序如何获取输入?一份文件?硬编码变量?你知道如何迭代整数数组吗?我会从那里开始。

标签: c arrays image 2d smoothing


【解决方案1】:

一个关键概念:

int values[20][20];
float intermediates[20][20];
for (int y = 1; y < 19; y++)
  for (int x = 1; x < 19; x++)
    intermediates = (float)values[y][x];

int means[20][20];
for (int y = 1; y < 19; y++)
  for (int x = 1; x < 19; x++)
    means[y][x] = (int) ( (float) (intermediates[y-1][x-1] + intermediates[y-1][x] + intermediates[y-1][x+1] + intermediates[y][x-1] + intermediates[y][x] + intermediates[y][x+1] + intermediates[y+1][x-1] + intermediates[y+1][x] + intermediates[y+1][x+1]) / 9.0F); //  Divisor is 9 because we added nine values and we're getting the mean

现在有 4 个极端情况:intermediates[0][0]、intermediates[0][19] 等,然后是所有边。

首先将值复制到“中间体”中,因为我不想将 (float) 放在所有内容的前面。

【讨论】:

    【解决方案2】:

    0) 加载图像?还是给定整数数组?

    1)我们从一个二维数组开始,生成一个副本:int I[N][M]; int New[N][M];

    2) 循环遍历值:

    for (i = 0; i < N; i++){
        for (j = 0; j < M; j++){
    

    3) 做你的事

    New[i][j] = sum(I[i-1][j] + I[i][j-1]...)/4;
    
    • 注意,当心(i 或 j-1) N 或 M。根据您认为合适的方式处理这些边界条件。

    显然这是最简单的方法,但看起来你在上课,所以应该没问题

    【讨论】:

    • 分配有点模糊,我相信应该发生的是用户应该输入他们想要的列数和行数......然后输出会生成一个包含多少列的矩阵和行,然后输出“平滑”矩阵。到目前为止,我的程序接受用户输入的列和行,并使用随机数生成一个矩阵。我只是停留在这个图像平滑方面。
    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 2021-05-22
    • 2013-07-12
    相关资源
    最近更新 更多