在C ++中使用3X3低通滤波器对.pgm图像进行卷积

Prasanna Date博士

我试图用C ++编写一个程序,该程序具有以下3个功能:(i)read_pgm_image()-从文件中读取.pgm格式的图像;(ii)convolve()-使用3X3低通滤波器对图像进行卷积;(iii)write_pgm_image()-将图像数据写回到单独的文件中

这是我的代码:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

void read_pgm_image(char name[]);
void convolve(int img[][256], int M, int N, int img_intensity);
void write_pgm_image(char name[], int img[256][256], int img_data[]);

int main()
{   read_pgm_image("lenna2.pgm");

    getchar();
    return 0;
}

void read_pgm_image(char name[])
{   string magic, creator_info;
    int img_intensity, M, N;
    ifstream file(name, ios::binary);
    if(file.is_open())
    {   cout<<"File successfully opened! \n\n";
        cout<<"Reading the file...\n";
        cout<<"Name of the file:\t"<<name<<'\n';

        getline(file,magic); // get the magic number

        getline(file,creator_info); // get the creator information

        file>>M; // get width of the image
        cout<<"Width of the Image:\t"<<M<<'\n';

        file>>N; // get length of the image
        cout<<"Length of the Image:\t"<<N<<'\n';

        file>>img_intensity; // get the image intensity
        cout<<"Maximum Intensity:\t"<<img_intensity<<'\n'; 

        int img[256][256]; // create an array to store image data
        for(int i=0; i<N; i++)
        {   for(int j=0; j<M; j++)
            {   file.read((char*)&img[i][j],sizeof(int));
            }
        }
        file.close();

        convolve(img, M, N, img_intensity); // Calling the Convolve function
    }
    else
    {   cout<<"Error in opening image!";
        file.close();
    }
}



void convolve(int img[256][256], int M, int N, int img_intensity)
{   int con_img[256][256], sum=0, img_data[3]={M,N,img_intensity};

    for(int i=0; i<N; i++)
    {   for(int j=0; j<M; j++)
        {   con_img[i][j]=img[i][j];
        }
    }

    for(int i=1; i<(N-1); i++)
{   for(int j=1; j<(M-1); j++)
    {   for(int k=(i-1); k<(i+1); k++)
        {   for(int l=(j-1); l<(j+1); l++)
            {   sum = sum + img[k][l];
            }
        }
        con_img[i][j] = sum/9;
        sum=0;
    }
}

write_pgm_image("image_convolve.pgm", con_img, img_data);
}



void write_pgm_image(char name[], int img[256][256], int img_data[3])
{ cout<<"\nCreating image file...\n";

  ofstream file(name,ios::binary);

  if(file.is_open())
  {   cout<<"File successfully created!\n";
      cout<<"Writing image data...\n";

      file<<"P5\n"<<img_data[0]<<' '<<img_data[1]<<' '<<img_data[2]; //Writing P5, image width, image length and maximum intensity

      cout<<"Image data written!\n";

      for(int i=0; i<img_data[1]; i++)  //Write image data to the file
        {   for(int j=0; j<img_data[0]; j++)
            {   file.write((char*)&(img[i][j]), sizeof(int));
            }
        }
      cout<<"Image pixel info written!\n";
      file.close();
  }
  else
  { cout <<"Error in creating file!";
    file.close();
  }
}

convolve()函数似乎存在一些问题。理想情况下,我应该获得输入图像的模糊版本(我无法上传)。但是我却得到了一个垃圾图像。

非常感谢您的任何帮助...谢谢。

恩基克里斯(Eigenchris)

您声明img是2D整数数组,也就是说,数组中的每个条目都是4个字节。您还同时使用读取4个字节的文件sizeof(int)

 int img[256][256]; // create an array to store image data
 for(int i=0; i<N; i++)
 {   for(int j=0; j<M; j++)
     {   file.read((char*)&img[i][j],sizeof(int));
     }
 }

根据PGM文件规范,像素值是1或2个字节charshorts),具体取决于最大强度值是否大于255。您正在从文件中将2或4个像素值读取到img数组的1个条目中

您的文件阅读器看起来应该更喜欢这个。由于C ++和PGM数组均以行优先的顺序存储数据,因此我们可以一次读取所有文件。

char img[N][M];
file.ignore(); // ignore one character (as described in file specification)
file.read((char*)img,(streamsize)sizeof(img));

如果仍然无法使用,请确保您可以重现此PGM文件的结果test.pgm

P5
# this is a comment
5 5
255
!!!!!AAAAA~~~~~AAAAA!!!!!

打印出矩阵可得出以下值:

33 33 33 33 33 
65 65 65 65 65 
126 126 126 126 126 
65 65 65 65 65 
33 33 33 33 33

我计算机上的图像查看器以如下方式显示(放大2000%):

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在MATLAB中使用imgaussfilt进行的二维高斯低通滤波器

来自分类Dev

使用Pulseaudio在LFE上进行低通滤波器

来自分类Dev

C中的低通滤波器

来自分类Dev

如何在Python中将3维数组(在本例中为滤波器组)与2维图像(单色)进行卷积?

来自分类Dev

IIR低通滤波器在C ++中的实现

来自分类Dev

使用MATLAB中的系数在C ++中进行FIR滤波器设计,滤波器未给出正确的结果

来自分类Dev

优化低通滤波器平滑代码以进行活动识别

来自分类Dev

C中的Gabor滤波器卷积矩阵

来自分类Dev

使用偶数大小的内核进行图像卷积

来自分类Dev

使用for循环opencv python对图像进行卷积

来自分类Dev

在Python中使用有限滤波器和Dirac增量求和进行快速一维卷积

来自分类Dev

在MATLAB中使用自回归(AR)滤波器对某些随机信号进行滤波

来自分类Dev

在深度学习中,两个 3*3 卷积滤波器和一个 5*5 卷积滤波器有什么区别?

来自分类Dev

了解卷积滤波器

来自分类Dev

在Matlab中将朴素逆滤波器与维纳滤波器进行反卷积比较

来自分类Dev

使用角度滤波器对Rails输出进行滤波

来自分类Dev

在音频上使用低通滤波器

来自分类Dev

使用fft的Matlab低通滤波器

来自分类Dev

在尺寸为NxM的图像上应用低通滤波器(AxB)的过程中没有计算量

来自分类Dev

卷积滤波器的参数数量

来自分类Dev

图像的快速转置和C语言中的Sobel滤波器优化(SIMD)

来自分类Dev

FFT卷积-3x3内核

来自分类Dev

如何在three.js中使用3X3矩阵进行旋转

来自分类Dev

应用低通滤波器

来自分类Dev

FFT低通滤波器

来自分类Dev

FPGA的低通滤波器

来自分类Dev

FFT低通滤波器

来自分类Dev

应用低通滤波器

来自分类Dev

在C#中进行3X3中值过滤,但不起作用?

Related 相关文章

  1. 1

    在MATLAB中使用imgaussfilt进行的二维高斯低通滤波器

  2. 2

    使用Pulseaudio在LFE上进行低通滤波器

  3. 3

    C中的低通滤波器

  4. 4

    如何在Python中将3维数组(在本例中为滤波器组)与2维图像(单色)进行卷积?

  5. 5

    IIR低通滤波器在C ++中的实现

  6. 6

    使用MATLAB中的系数在C ++中进行FIR滤波器设计,滤波器未给出正确的结果

  7. 7

    优化低通滤波器平滑代码以进行活动识别

  8. 8

    C中的Gabor滤波器卷积矩阵

  9. 9

    使用偶数大小的内核进行图像卷积

  10. 10

    使用for循环opencv python对图像进行卷积

  11. 11

    在Python中使用有限滤波器和Dirac增量求和进行快速一维卷积

  12. 12

    在MATLAB中使用自回归(AR)滤波器对某些随机信号进行滤波

  13. 13

    在深度学习中,两个 3*3 卷积滤波器和一个 5*5 卷积滤波器有什么区别?

  14. 14

    了解卷积滤波器

  15. 15

    在Matlab中将朴素逆滤波器与维纳滤波器进行反卷积比较

  16. 16

    使用角度滤波器对Rails输出进行滤波

  17. 17

    在音频上使用低通滤波器

  18. 18

    使用fft的Matlab低通滤波器

  19. 19

    在尺寸为NxM的图像上应用低通滤波器(AxB)的过程中没有计算量

  20. 20

    卷积滤波器的参数数量

  21. 21

    图像的快速转置和C语言中的Sobel滤波器优化(SIMD)

  22. 22

    FFT卷积-3x3内核

  23. 23

    如何在three.js中使用3X3矩阵进行旋转

  24. 24

    应用低通滤波器

  25. 25

    FFT低通滤波器

  26. 26

    FPGA的低通滤波器

  27. 27

    FFT低通滤波器

  28. 28

    应用低通滤波器

  29. 29

    在C#中进行3X3中值过滤,但不起作用?

热门标签

归档