卷积图像过滤

时间:2019-10-05 21:02:52

标签: c image-processing libpng

我正在尝试用C编写一个将高斯滤镜应用于图像的程序。我已经成功创建了使用libpng读写图像的函数,以及创建了与高斯函数关联的内核的函数。

我的代码受http://zarb.org/~gc/html/libpng.html这个代码的启发,并且正在执行基本任务。例如,我可以增加红色值并保存图像。问题是,当我尝试应用卷积矩阵时,当我尝试访问ptr指针的值时会遇到分段错误。我不明白为什么先读这个值而不是现在读。同样在printf与gdb之前,我可以读取链接到ptr的值。这里是gdb的段错误:

0x0000555555555991 in convolute (image=0x7fffffffda80, matrice=0x7fffffffda78) at imageTools.c:157
157               printf("%d",ptr[0]);

我还想知道,制作循环来计算每个像素的值是否非常有效,因为它进行了大量的计算,而且我认为在像Photoshop这样的软件中,这几乎是瞬时的,因此需要花费很多时间。

这是我的代码: imageTools.c

void convolute(image_t* image, double** matrice){
  image_t imageTemp = *image;
  int x,y,i,j;
  png_byte r,v,b;
  for(x=2;x<image->height-2;x++){
    for(y=2;y<image->width-2;y++){
      png_byte* new_row = imageTemp.row_pointers[x];
      png_byte* new_ptr = &(new_row[y*4]);
      /*png_byte* new_pixel = malloc(4*sizeof(png_byte));*/
      r=0;v=0;b=0;
      for(i=-2;i<3;i++){
        png_byte* row = image->row_pointers[i];
        for(j=-2;j<3;j++){
          png_byte* ptr = &(row[j*4]);
          printf("%d",ptr[0]); /* Here is the segfault*/
          r += (png_byte) ptr[0];
          v += (png_byte) ptr[1];
          b += (png_byte) ptr[2];
        }
      }
      printf("R: %d, V: %d, B: %d",r,v,b);
      new_ptr[0] = r;
      new_ptr[1] = v;
      new_ptr[2] = b;
    }
  }
  image = &imageTemp;
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define PNG_DEBUG 3
#include <png.h>

#include "imageTools.h"
#include "filtreGaussien.h"

int main()
{
    image_t image;
    double** noyau;
    int i,j;

    if(read_png_file("test.png", &image)){
      printf("OK!\n");
      printf("Height: %d, Width: %d\n", image.height, image.width);

      noyau  = noyauGaussien(1.0);
      for(i=0;i<5;i++){
        printf("| ");
        for(j=0;j<5;j++){
          printf("%f | ",noyau[i][j]);
        }
        printf("\n");
      }

      convolute(&image, &noyau);

      write_png_file("test2.png", &image);
    } else {
      printf("An error as occured. Exiting...");
    }
    return 0;
}

image_t结构:

typedef struct{
  png_bytep* row_pointers;
  int width;
  int height;
  png_byte color_type;
  png_byte bit_depth;
}
image_t;

0 个答案:

没有答案
相关问题