【问题标题】:image smoothing in cc中的图像平滑
【发布时间】:2012-09-30 03:49:40
【问题描述】:

好的,所以我试图让用户输入列数和行数,然后让输出显示一个随机数矩阵,然后是一个平滑图像矩阵,该矩阵为数组中的每个像素找到均值滤波器。现在我有它可以给我一个随机数矩阵,但平滑矩阵完全不正常。现在我写的代码只关注有 4 个邻居的整数,但显然我做错了。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
// function that randomly generates numbers 
void fillArray(int a[10][20], int m, int n)
{
  int random;
  int i,j;   
      for (i=0;i<m;i++)
      {
          for (j=0;j<n;j++)
          {
                           random=rand()%100;
                           a[i][j]=random;
                           }
                           }
  }
  // function that prints the first matrix of random numbers
  void printarray (int a[10][20], int m, int n)
 {
 int i,j;
for (i=0;i<m;i++) 
{
    for (j=0;j<n;j++)
        {
                     printf("%4d", a[i][j]);
                     }
                     printf("\n");
                     }
  }
  // function that finds the mean for any number and its 4 nieghbors 
  void smooth (int a[10][20], int m, int n)
 {

 int i,j;
 for (i=1;i<m;i++) 
{
    for (j=1;j<n;j++)
    {
        a[i][j]=a[i][j]=(a[i-1][j]+a[i][j-1]+a[i+1][j]+a[i][j+1])/4;
        printf("%4d",a[i][j]);
        }
        printf("\n");
 }
 }
 int main()
{

int a[10][20];
 int m,n;
 srand(time(NULL));
 //User input
 printf("please enter number of columns and rows");
 scanf("%d %d", &m,&n);
 fillArray(a,m,n);
 printarray (a,m,n);
 printf("The smoothed image is\n");
 smooth(a,m,n);
 getch();
return 0;
}

现在如果我输入 3 和 3,我会得到这样的结果:

23 43 54
12 76 89
56 98 24

The smoothed image is
347373849493234343
12 23345345345
2132334565645645645

有人有什么想法吗?

【问题讨论】:

  • 我很惊讶您的程序在平滑角和边距时没有遇到错误;那些应该是特殊情况,区别对待。
  • @coraldoe,我已经修复了大部分程序,我现在唯一的问题是我似乎无法修复右侧边距和 2 个右侧角的边界问题。

标签: c arrays image 2d smoothing


【解决方案1】:

看起来您访问 a[m][..] 和 a[..][n] (例如,因为您在 i

编辑:分配值时,每个循环从 0 变为 m-1 / n-1

for (i=0;i<m;i++)
      {
          for (j=0;j<n;j++)
          {
                           random=rand()%100;
                           a[i][j]=random;
                           }
                           }

但是,当您使用这些值时,每个循环都会从 1 变为 m-1/n-1,但在此循环内您使用相邻单元格(i-1、j-1、i+1、j+1)

 for (i=1;i<m;i++) 
{
    for (j=1;j<n;j++)
    {
        a[i][j]=(a[i-1][j]+a[i][j-1]+a[i+1][j]+a[i][j+1])/4;
        }
 }
 }

这意味着在最后一次迭代 (i = m - 1) 中,您访问的是未初始化的单元格,因为您访问的是 i+1 = m 请记住,多维数组实际上是内存中的一维数组,因此其中一些调用并不是真正针对未初始化的值,但有些是

要解决此问题,您可以在分配阶段循环直到 m/n(而不是 m-1/n-1)

【讨论】:

  • 我不确定我是否完全理解你在说什么,你能指出你在上面的代码中的意思吗?
  • 好吧,我的程序大部分时间都在工作,但我可能有点奇怪。我现在可以返回左上角数字、数字左侧和中间数字集的值,但我只能单独执行它们。有没有办法将 3 组组合成一个矩阵(最终我需要组合 9 组)还是我完全错了?
猜你喜欢
  • 1970-01-01
  • 2014-11-18
  • 2013-01-23
  • 2013-06-06
  • 2011-09-11
  • 2010-10-08
  • 2012-09-07
  • 1970-01-01
  • 2011-02-09
相关资源
最近更新 更多