C言語/C++BMP画像にピーマン塩ノイズを加えるのは超簡単です
15401 ワード
#include
#include
#include
#include
#include
using namespace std;
//
#include
#include
int main()
{
//
unsigned int Height = 0;
unsigned int Width = 0;
//
int i=0;
int j=0;
BITMAPFILEHEADER bmpfileheader; //
BITMAPINFOHEADER bmpinfoheader; //
//24 RGB
typedef struct tagRGB
{
BYTE blue;
BYTE green;
BYTE red;
}RGBDATA;
FILE *fpin; //
FILE *fpout; //
fpin=fopen("picture.bmp","rb");
fread(&bmpfileheader,sizeof(BITMAPFILEHEADER),1,fpin);//
fread(&bmpinfoheader,sizeof(BITMAPINFOHEADER),1,fpin);//
Height=bmpinfoheader.biHeight;
Width=bmpinfoheader.biWidth;
//
RGBDATA** RGBin;
RGBin = (RGBDATA **)malloc(sizeof(RGBDATA*) * Height);
for (i = 0; i < Height; i++)
{
RGBin[i] = (RGBDATA *)malloc(sizeof(RGBDATA) * Width);
}
//
for(i=0;i<Height;i++)
{
fread(RGBin[i], sizeof(tagRGB), Width, fpin);
}
cout<<" SNR( [0, 1] ):";
double SNR;
cin>>SNR;
int new_Height=(int)(Height*(1-SNR));
//
int member;
//
int x;
int y;
srand((unsigned) (time(NULL)));// srand
//
for(i=0;i<new_Height;i++)
{
for(j=0;j<Width;j++)
{
member=(rand()%2)*255;
x=rand()%Width;
y=rand()%Height;
RGBin[y][x].blue=member;
RGBin[y][x].green=member;
RGBin[y][x].red=member;
}
}
//
fpout=fopen("picture_out.bmp","wb");
fwrite(&bmpfileheader,sizeof(BITMAPFILEHEADER),1,fpout);
fwrite(&bmpinfoheader,sizeof(BITMAPINFOHEADER),1,fpout);
for (i=0;i<Height;i++)
{
fwrite(RGBin[i],sizeof(tagRGB),Width,fpout);
}
printf(" !
");
fclose(fpin);
fclose(fpout);
return 0;
}