#include <fstream>
#include <math.h>
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
//引入时间库 和 随机函数库
#include<time.h>
#include<stdlib.h>
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("生成新图片成功!\n");
fclose(fpin);
fclose(fpout);
return 0;
}
C语言/C++对BMP图片加椒盐噪声 超简单
最新推荐文章于 2022-04-21 18:10:54 发布