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; }