数字图像处理图像几何变换

  • d6_230529
    了解作者
  • 1.7MB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-02 12:35
    上传日期
数字图像处理图像的几何变换C++代码实现
数字图像处理图像几何变换.zip
  • 图形几何变换
  • 图形几何变换.ncb
    41KB
  • 图形几何变换.plg
    258B
  • 图形几何变换.dsw
    549B
  • 1.bmp
    65.1KB
  • main.cpp
    14.1KB
  • 图形几何变换.dsp
    4.2KB
  • Debug
  • 图形几何变换.pdb
    481KB
  • 图形几何变换.pch
    4.5MB
  • 图形几何变换.ilk
    306.5KB
  • 图形几何变换.exe
    240.1KB
  • vc60.idb
    185KB
  • main.obj
    52.8KB
  • vc60.pdb
    100KB
  • 图形几何变换.opt
    47.5KB
内容介绍
#include <windows.h> #include <stdio.h> #include <math.h> #include <time.h> #include <stdlib.h> #include <string.h> #include <iostream.h> #include <list> using namespace std; unsigned char *pBmpBuf;//读入图像数据的指针 int bmpWidth;//图像的宽 int bmpHeight;//图像的高 RGBQUAD *pColorTable;//颜色表指针 int biBitCount;//图像类型,每像素位数 根据BMP文件结构, #define K (0.017453292519943295769236907684886l) /**************************************** ******************************* * 函数名称: * readBmp() * *函数参数: * char *bmpName -文件名字及路径 * *返回值: * 0为失败,1为成功 * *说明:给定一个图像文件名及其路径,读图像的位图数据、宽、高、颜色表及每像素 * 位数等数据进内存,存放在相应的全局变量中 **************************************** *******************************/ bool readBmp(char *bmpName) { //二进制读方式打开指定的图像文件 FILE *fp=fopen(bmpName,"rb"); if(fp==0) return 0; //跳过位图文件头结构BITMAPFILEHEADER fseek(fp, sizeof(BITMAPFILEHEADER),0); //定义位图信息头结构变量,读取位图信息头进内存, //存放在变量head中 BITMAPINFOHEADER head; fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息 bmpWidth = head.biWidth; bmpHeight = head.biHeight; biBitCount = head.biBitCount; //定义变量,计算图像每行像素所占的字节数(必须是4的倍数) int lineByte=(bmpWidth * biBitCount/8+3)/4*4; //灰度图像有颜色表,且颜色表表项为256 if(biBitCount==8){ //申请颜色表所需要的空间,读颜色表进内存 pColorTable=new RGBQUAD[256]; fread(pColorTable,sizeof(RGBQUAD),256,fp); } //申请位图数据所需要的空间,读位图数据进内存 pBmpBuf=new unsigned char[lineByte * bmpHeight]; fread(pBmpBuf,1,lineByte * bmpHeight,fp); //关闭文件 fclose(fp); return 1; } /***************************************** * 函数名称: * saveBmp() * *函数参数: * char *bmpName-文件名字及路径 * unsigned char *imgBuf-待存盘的位图数据 * int width-以像素为单位待存盘位图的宽 * int height-以像素为单位待存盘位图高 * int biBitCount-每像素所占位数 * RGBQUAD *pColorTable-颜色表指针 *返回值: * 0为失败,1为成功 * *说明:给定一个图像位图数据、宽、高、颜色表 指针及每像素所占的位数等信息, * 将其写到指定文件中 ****************************************** *****************************/ bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable) { //如果位图数据指针为0,则没有数据传入,函数返回 if(!imgBuf) return 0; //颜色表大小,以字节为单位,灰度图像颜色表 为1024字节,彩色图像颜色表大小为0 int colorTablesize=0; if(biBitCount==8) colorTablesize=1024; //待存储图像数据每行字节数为4的倍数 int lineByte=(width * biBitCount/8+3)/4*4; //以二进制写的方式打开文件 FILE *fp=fopen(bmpName,"wb"); if(fp==0) return 0; //申请位图文件头结构变量,填写文件头信息 BITMAPFILEHEADER fileHead; fileHead.bfType = 0x4D42;//bmp类型 //bfSize是图像文件4个组成部分之和 fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + colorTablesize + lineByte*height; fileHead.bfReserved1 = 0; fileHead.bfReserved2 = 0; //bfOffBits是图像文件前3个部分所需空间之和 fileHead.bfOffBits=54+colorTablesize; //写文件头进文件 fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp); //申请位图信息头结构变量,填写信息头信息 BITMAPINFOHEADER head; head.biBitCount=biBitCount; head.biClrImportant=0; head.biClrUsed=0; head.biCompression=0; head.biHeight=height; head.biPlanes=1; head.biSize=40; head.biSizeImage=lineByte*height; head.biWidth=width; head.biXPelsPerMeter=0; head.biYPelsPerMeter=0; //写位图信息头进内存 fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp); //如果灰度图像,有颜色表,写入文件 if(biBitCount==8) fwrite(pColorTable, sizeof(RGBQUAD),256, fp); //写位图数据进文件 fwrite(imgBuf, height*lineByte, 1, fp); //关闭文件 fclose(fp); return 1; } void ToGray(const string& srcFile,const string& desFile) { BITMAPFILEHEADER bmfHeader; BITMAPINFOHEADER bmiHeader; FILE *pFile; if ((pFile = fopen(srcFile.c_str(),"rb")) == NULL) { printf("open bmp file error."); exit(-1); } //读取文件和Bitmap头信息 fseek(pFile,0,SEEK_SET); fread(&bmfHeader,sizeof(BITMAPFILEHEADER),1,pFile); fread(&bmiHeader,sizeof(BITMAPINFOHEADER),1,pFile); //先不支持16位位图 int bitCount = bmiHeader.biBitCount; if (bitCount == 16) { exit(-1); } double byteCount = (double)bitCount / 8; int nClr = 0; if (bitCount < 16) { nClr = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bitCount; if (nClr > 256) nClr = 0; } //读取调色板 RGBQUAD *quad = NULL; if (nClr > 0) { quad = new RGBQUAD[nClr]; fread(quad,sizeof(RGBQUAD) * nClr,1,pFile); } int srcW = bmiHeader.biWidth; int srcH = bmiHeader.biHeight; //原图像每一行去除偏移量的字节数 int lineSize = bitCount * srcW >> 3; //偏移量,windows系统要求每个扫描行按四字节对齐 int alignBytes = (((bmiHeader.biWidth * bitCount + 31) & ~31) >> 3) - ((bmiHeader.biWidth * bitCount) >> 3); //原图像缓存 int srcBufSize = lineSize * srcH; BYTE* srcBuf = new BYTE[srcBufSize]; int i,j; //读取文件中数据 for (i = 0; i < srcH; i++) { fread(&srcBuf[lineSize * i],lineSize,1,pFile); fseek(pFile,alignBytes,SEEK_CUR); } //256色位图调色板 RGBQUAD *quadDes = NULL; quadDes = new RGBQUAD[256]; for (i = 0; i < 256; i++) { //灰度图的RGB值相等 quadDes[i].rgbBlue = quadDes[i].rgbGreen = quadDes[i].rgbRed = i; } //灰度图每个像素采用8位表示 int desBufSize = (((srcW * 8 + 31) & ~31) >> 3) * srcH; BYTE *desBuf = new BYTE[desBufSize]; //每个扫描行占用字节数 int desLineSize = ((srcW * 8 + 31) >> 5) * 4; for (i = 0; i < srcH; i++) { for (j = 0; j < srcW; j++) { //从调色板中读取RGB值 if (nClr > 0) { unsigned int pos = srcBuf[i * lineSize + int(j * byteCount)]; desBuf[i * desLineSize + j] = 0.3 * quad[pos].rgbRed + 0.59 * quad[pos].rgbGreen + 0.11 * quad[pos].rgbBlue; } else desBuf[i * desLineSize + j] = 0.3 * srcBuf[i * lineSize + int(j * byteCount)] + 0.59 * srcBuf[i * lineSize + int(j * byteCount) + 1] + 0.11 * srcBuf[i * lineSize + int(j * byteCount) + 2]; } } //创建目标文件 HFILE hfile = _lcreat(desFile.c_str(),0); //文件头信息 BITMAPFILEHEADER nbmfHeader; nbmfHeader.bfType = 0x4D42; nbmfHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD) + srcW * srcH; nbmfHeader.bfReserved1 = 0; nbmfHeader.bfReserved2 = 0; nbmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD); //Bitmap头信息 BITMAPINFOHEADER bmi; bmi.biSize=sizeof(BITMAPINFOHEADER); bmi.biWidth=srcW; bmi.biHeight=srcH; bmi.biPlanes=1; bmi.biBitCount=8; bmi.biCompression=BI_RGB; bmi.biSizeImage=0; bmi.biXPelsPerMeter=0; bmi.biYPelsPerMeter=0; bmi.biClrUsed= 256; bmi.biClrImportant=0; //写入文件头信息 _lwrite(hfile,(LPCSTR)&nbmfHeader,sizeof(BITMAPFILEHEADER)); //写入Bitmap头信息 _lwrite(hfile,(LPCSTR)&bmi,sizeof(BITMAPINFOHEADER)); if (quadDes) { _lwrite(hfile,(LPCSTR)quadDes,sizeof(RGBQUAD) * 256); } //写入图像数据 _lwrite(hfile,(LPCSTR)desBuf,desBufSize); _lclose(hfile);
评论
    相关推荐