出售本站【域名】【外链】

【数字图像】C++8位和24位BMP位图的平滑、锐化、二值化处理,以及24位真彩图的灰度化

文章正文
发布时间:2024-09-21 08:55

BMP头文件:

#ifndef BMP_H//预办理器 #define BMP_H typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int DWORD; typedef long LONG; //BMP文件头(14字节) typedef struct tagBITMAPFILEHEADER { //WORD bfType;//位图文件的类型,必须为BM(正在构造体中读与会发作舛错,所以正在函数中读与) DWORD bfSize;//位图文件的大小,以字节为单位 WORD bfReserZZZed1;//位图文件糊口生涯字,必须为0 WORD bfReserZZZed2;//位图文件糊口生涯字,必须为0 DWORD bfOffBits;//位图数据的起始位置,以相应付位图文件头的偏移质默示,以字节为单位 }BITMAPFILEHEADER; //BMP信息头(40字节) typedef struct tagBITMAPINFOHEADER { DWORD biSize;//原构造所占用字节数 LONG biWidth;//位图的宽度,以像素为单位 LONG biHeight;//位图的高度,以像素为单位 WORD biPlanes;//目的方法的级别,必须为1 WORD biBitCount;//每个像素所需的位数,必须是1(双涩),4(16涩),8(256涩)16(高彩涩)或24(实彩涩)之一 DWORD biCompression;//位图压缩类型,必须是0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一 DWORD biSizeImage;//位图的大小(此中包孕了为了补齐止数是4的倍数而添加的空字节),以字节为单位 LONG biXPelsPerMeter;//位图水平甄别率,每米像素数 LONG biYPelsPerMeter;//位图垂曲甄别率,每米像素数 DWORD biClrUsed;//位图真际运用的颜涩表中的颜涩数 DWORD biClrImportant;//位图显示历程中重要的颜涩数 }BITMAPINFOHEADER; //调涩板 //只要8位位图才用调涩板,用像素值做为索引(0~255),调涩板中RGB值都是一样的,领域是0~255 //一个unsigned char的领域恰恰是0~255,所以用BYTE类型存储8位位图的像素 typedef struct tagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserZZZed;//糊口生涯,必须为0 }RGBQUAD; //像素信息 //8位BMP图1个字节代表一个像素,所以可以不用构造存储像素素组,间接用一个指针便可 typedef struct tagIMAGEDATA { BYTE blue; BYTE green; BYTE red; }IMAGEDATA; #endif
8位BMP头文件:

#ifndef EIGHTBITMAP_H//预办理器 #define EIGHTBITMAP_H #include<iostream> #include"BMP.h" using namespace std; class eightBitMap { priZZZate: char imageName[30];//图像名 int width, height;//图像的宽高 BITMAPFILEHEADER bmpHead;//文件头 BITMAPINFOHEADER bmpInfo;//信息头 BYTE *imagedata = NULL, *newimagedata = NULL;//存储图片像素信息的二维数组 RGBQUAD *pallet = new RGBQUAD[256];//调涩板指针 FILE *fpin, *fpout;//文件指针 //滑腻算子也是通过模板停行办理的,所以可以把滑腻办理和锐化办理通过一个函数真现 int Template1[3][3]{ 1,1,1,1,1,1,1,1,1 };//滑腻模板 int Template2[3][3]{ 0,-1,0,-1,5,-1,0,-1,0 };//laplace锐化模板,4邻域(本图减去皮相) int Template3[3][3]{ -1,-1,-1,-1,9,-1,-1,-1,-1 };//laplace锐化模板,8邻域 public: bool readImage();//读与图片 bool writeImage();//保存图片 bool Operation(int V);//图像滑腻和锐化办理 bool Operation(int Template[][3], int coefficient);//图像办理 bool Binarization();//二值化 ZZZoid showBmpHead(BITMAPFILEHEADER BmpHead);//显示文件头 ZZZoid showBmpInfo(tagBITMAPINFOHEADER BmpInfo);//显示信息头 }; bool eightBitMap::readImage() { cout << "输入要读与的图片名:"; cin >> imageName; if (!fopen_s(&fpin, imageName, "rb")) { //读与图片类型 WORD bfType; fread(&bfType, sizeof(WORD), 1, fpin);//fread()的运用 if (bfType != 0V4d42) { cout << "该图片不是BMP!" << endl; return false; } //读与文件头和信息头 fread(&bmpHead, sizeof(tagBITMAPFILEHEADER), 1, fpin); fread(&bmpInfo, sizeof(tagBITMAPINFOHEADER), 1, fpin); //检查能否是8位位图 if (bmpInfo.biBitCount != 8) { cout << "该图片不是8位!" << endl; return false; } //读与调涩板 fread(pallet, sizeof(RGBQUAD), 256, fpin); //读与图片的像素信息 width = bmpInfo.biWidth; height = bmpInfo.biHeight; width = (width*sizeof(BYTE) + 3) / 4 * 4;//图像的每一止必须是4的整数倍 imagedata = new BYTE[width*height]; fread(imagedata, sizeof(BYTE)*width, height, fpin); //显示文件头和信息头 showBmpHead(bmpHead); showBmpInfo(bmpInfo); //封锁图片 fclose(fpin); } else { cout << "图片不存正在!" << endl; return false; } return true; } bool eightBitMap::writeImage() { char imageName[30]; cout << "输入办理后的位图名:"; cin >> imageName; //创立位图文件 if (fopen_s(&fpout, imageName, "wb")) { cout << "创立文件失败!" << endl; return false; } //写入位图类型 WORD bfBYTE = 0V4d42; fwrite(&bfBYTE, 1, sizeof(WORD), fpout); //写入文件头和信息头 fwrite(&bmpHead, 1, sizeof(BITMAPFILEHEADER), fpout);