版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 8种常用图像处理算法(函数) 这是我毕业设计的一部分代码/* * * 函数名称: * * VertMirror() * * 参数: * * LPSTR lpDIB /指向源DIB图像指针 * * 返回值: * * BOOL /镜像成功返回TRUE,否则返回FALSE。 * * 说明: * * 该函数用来实现DIB图像的垂直镜像。 * */BOOL WINAPI VertMirror(LPSTR lpDIB)/原图象宽度 LONG lWidth;/原图象高度LONG lHeight;/原图象的颜色数WORD wNumColors;/原图象的信息头结构指针LPBITMAPINFOHEADER l
2、pbmi;/指向原图象和目的图象的像素的指针LPBYTE lpSrc,lpDst;/平移后剩余图像在源图像中的位置(矩形区域)CRectrectSrc;/指向原图像像素的指针LPBYTE lpDIBBits;/指向复制图像像素的指针LPBYTE lpNewDIBBits;/内存句柄HLOCALh;/循环变量LONGi;/图像每行的字节数LONG lLineBytes;/获取图象的信息头结构的指针lpbmi=(LPBITMAPINFOHEADER)lpDIB;/找到图象的像素位置lpDIBBits=(LPBYTE):FindDIBBits(lpDIB);/获取图象的宽度lWidth=:DIBWi
3、dth(lpDIB);/获取图象的高度lHeight=:DIBHeight(lpDIB);/获取图象的颜色数wNumColors=:DIBNumColors(lpDIB);/计算图像每行的字节数lLineBytes = WIDTHBYTES(lWidth *(lpbmi-biBitCount);/ 暂时分配内存,以保存新图像h= LocalAlloc(LHND, lLineBytes);/ 分配内存失败,直接返回if (!h)return FALSE;/ 锁定内存lpNewDIBBits = (LPBYTE)LocalLock(h);/如果是256色位图或真彩色位图if(wNumColors=
4、256|wNumColors=0) /平移图像,每次移动一行 for(i = 0; ibiBitCount);/将旋转角度从度转换到弧度fArcAngle =(iAngle*PI)/180.0;/计算旋转角度的正弦fSin = (float) sin(fArcAngle);/计算旋转角度的余弦fCos = (float) cos(fArcAngle);/计算原图的四个角的坐标(以图像中心为坐标系原点)fSrcX1 = (float) (- (lWidth - 1) / 2);fSrcY1 = (float) ( (lHeight - 1) / 2);fSrcX2 = (float) ( (lW
5、idth - 1) / 2);fSrcY2 = (float) ( (lHeight - 1) / 2);fSrcX3 = (float) (- (lWidth - 1) / 2);fSrcY3 = (float) (- (lHeight - 1) / 2);fSrcX4 = (float) ( (lWidth - 1) / 2);fSrcY4 = (float) (- (lHeight - 1) / 2);/计算新图四个角的坐标(以图像中心为坐标系原点)fDstX1 = fCos * fSrcX1 + fSin * fSrcY1;fDstY1 = -fSin * fSrcX1 + fCos
6、* fSrcY1;fDstX2 = fCos * fSrcX2 + fSin * fSrcY2;fDstY2 = -fSin * fSrcX2 + fCos * fSrcY2;fDstX3 = fCos * fSrcX3 + fSin * fSrcY3;fDstY3 = -fSin * fSrcX3 + fCos * fSrcY3;fDstX4 = fCos * fSrcX4 + fSin * fSrcY4;fDstY4 = -fSin * fSrcX4 + fCos * fSrcY4;/计算旋转后的图像实际宽度lNewWidth = (LONG) ( max( fabs(fDstX4 - f
7、DstX1), fabs(fDstX3 - fDstX2) ) + 0.5);/计算旋转后的图像高度lNewHeight = (LONG) ( max( fabs(fDstY4 - fDstY1), fabs(fDstY3 - fDstY2) ) + 0.5);/计算旋转后图像每行的字节数lNewLineBytes = WIDTHBYTES(lNewWidth * lpbmi0-biBitCount);/计算两个常数f1 = (float) (-0.5 * (lNewWidth - 1) * fCos - 0.5 * (lNewHeight - 1) * fSin+ 0.5 * (lWidth
8、 - 1);f2 = (float) ( 0.5 * (lNewWidth - 1) * fSin - 0.5 * (lNewHeight - 1) * fCos+ 0.5 * (lHeight - 1);/暂时分配内存,以保存新图像hDIB=(HDIB):GlobalAlloc(GHND, lNewHeight*lNewLineBytes+*(LPDWORD)lpDIB+:PaletteSize(lpDIB);/分配内存失败,直接返回if (!hDIB)return NULL;/锁定内存lpNewDIB = (LPSTR):GlobalLock(HGLOBAL)hDIB);/复制DIB信息头
9、和调色板memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB+:PaletteSize(lpDIB);/获取图象的信息头结构的指针lpbmi=(LPBITMAPINFOHEADER)lpNewDIB;/更新DIB图象的高度和宽度lpbmi-biWidth=lNewWidth;lpbmi-biHeight=lNewHeight;/找到新DIB像素的起始位置lpNewDIBBits=(LPBYTE):FindDIBBits(lpNewDIB);/如果是256色位图if(wNumColors=256) /旋转后图像每行 for(i = 0; ilNewHeight; i+) /
10、旋转后图象每列 for(j=0;j= 0) & (j0 = 0) & (i0 lHeight) / 指向源DIB图象第i0行,第j0个象素的指针 lpSrc = (LPBYTE)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0; / 复制象素 *lpDst = *lpSrc; else / 对于源图中没有的象素,直接赋值为255 * (LPBYTE)lpDst) = 255; /如果是24位真彩色位图else if(wNumColors=0) /旋转后图像每行 for(i = 0; ilNewHeight; i+) /旋转后图象每列 for(j=
11、0;j= 0) & (j0 = 0) & (i0 biBitCount);/ 计算缩放后的图像实际宽度/ 此处直接加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分lNewWidth = (LONG) (lWidth* fXZoomRatio + 0.5);/ 计算新图像每行的字节数lNewLineBytes = WIDTHBYTES(lNewWidth * (lpbmi0-biBitCount);/ 计算缩放后的图像高度lNewHeight = (LONG) (lHeight * fYZoomRatio + 0.5);/ 分配内存,以保存新DIBhDIB = (HDIB) :Glo
12、balAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + :PaletteSize(lpDIB);/ 判断是否内存分配失败if (hDIB = NULL)/ 分配内存失败return NULL;/ 锁定内存lpNewDIB = (LPSTR):GlobalLock(HGLOBAL) hDIB);/ 复制DIB信息头和调色板memcpy(lpNewDIB, lpDIB, *(LPDWORD)lpDIB + :PaletteSize(lpDIB);/ 找到新DIB象素起始位置lpNewDIBBits = (LPBYTE):FindD
13、IBBits(lpNewDIB);/ 获取指针lpbmi = (LPBITMAPINFOHEADER)lpNewDIB;lpbmc = (LPBITMAPCOREHEADER)lpNewDIB;/ 更新DIB中图像的高度和宽度if (IS_WIN30_DIB(lpNewDIB)/ 对于Windows 3.0 DIBlpbmi-biWidth = lNewWidth;lpbmi-biHeight = lNewHeight;else/ 对于其它格式的DIBlpbmc-bcWidth = (unsigned short) lNewWidth;lpbmc-bcHeight = (unsigned sh
14、ort) lNewHeight;if(wNumColors=256)/ 针对图像每行进行操作for(i = 0; i lNewHeight; i+)/ 针对图像每列进行操作for(j = 0; j = 0) & (j0 = 0) & (i0 lHeight)/ 指向源DIB第i0行,第j0个象素的指针lpSrc = (LPBYTE)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0;/ 复制象素*lpDst = *lpSrc;else/ 对于源图中没有的象素,直接赋值为255* (LPBYTE)lpDst) = 255;else if(wNumCo
15、lors=0)for(i = 0; i lNewHeight; i+)/ 针对图像每列进行操作for(j = 0; j = 0) & (j0 = 0) & (i0 GetHDIB();/ 获取指向BITMAPINFO结构的指针(Win3.0)lpbmi = (LPBITMAPINFO)lpDIB;/ 获取指向BITMAPCOREINFO结构的指针(OS/2)lpbmc = (LPBITMAPCOREINFO)lpDIB;/ 锁定DIB/ 获取DIB中颜色表中的颜色数目wNumColors = :DIBNumColors(lpDIB);/ 判断是否是256色位图if (wNumColors !=
16、 256)MessageBox(不是256色位图!);/ 解除锁定:GlobalUnlock(HGLOBAL) pDoc-GetHDIB();/ 返回return;/ 更改光标形状BeginWaitCursor();/ 判断是否是WIN3.0的DIBbWin30DIB = IS_WIN30_DIB(lpDIB);/将原图象的调色板转化为灰度调色板/建立原调色板索引与灰度调色板索引的映射关系for (i = 0; i bmiColorsi.rgbRed + 0.587 * lpbmi-bmiColorsi.rgbGreen + 0.114 * lpbmi-bmiColorsi.rgbBlue +
17、 0.5);/ 建立灰度调色板 /红色分量lpbmi-bmiColorsi.rgbRed = i;/ 绿色分量lpbmi-bmiColorsi.rgbGreen = i;/ 蓝色分量lpbmi-bmiColorsi.rgbBlue = i;/ 保留位lpbmi-bmiColorsi.rgbReserved = 0;else/对原256色调色板的每一表项计算对应的灰度值bGrayMapi = (BYTE)(0.299 * lpbmc-bmciColorsi.rgbtRed + 0.587 * lpbmc-bmciColorsi.rgbtGreen + 0.114 * lpbmc-bmciColo
18、rsi.rgbtBlue + 0.5); /建立灰度调色板/ 红色分量lpbmc-bmciColorsi.rgbtRed = i;/ 绿色分量lpbmc-bmciColorsi.rgbtGreen = i;/ 蓝色分量lpbmc-bmciColorsi.rgbtBlue = i;/ 找到DIB图像象素起始位置lpDIBBits = :FindDIBBits(lpDIB);/ 获取图像宽度lWidth = :DIBWidth(lpDIB);/ 获取图像高度lHeight = :DIBHeight(lpDIB);/ 计算图像每行的字节数OneLineBytes = WIDTHBYTES(lWidt
19、h * 8);/ 更换原256色位图的每个象素的颜色索引/ 每行for(ih = 0; ih lHeight; ih+)/ 每列for(iw= 0; iw GetDocPalette()-SetPaletteEntries(0,256,(LPPALETTEENTRY)lpbmi-bmiColors);/ 设置脏标记pDoc-SetModifiedFlag(TRUE);/ 实现新的调色板OnDoRealize(WPARAM)m_hWnd,0);/ 更新视图pDoc-UpdateAllViews(NULL);/ 解除锁定:GlobalUnlock(HGLOBAL) pDoc-GetHDIB();/
20、 恢复光标EndWaitCursor();/* * * 函数名称: * * RandomNoise() * * 参数: * * LPSTR lpDIB / 指向源DIB图像指针 * * 返回值: * * BOOL / 加入随机噪声操作成功返回TRUE,否则返回FALSE。 * * 说明: * * 该函数用来对256色位图和24位真彩色位图进行加入随即噪声操作。 * */BOOL WINAPI RandomNoise (LPSTR lpDIB)/ 图像宽度和高度LONG lWidth,lHeight;/ 指向图像像素的指针LPSTR lpDIBBits;/ 指向源图像的指针LPSTRlpSrc;
21、/循环变量long i;long j;/ 图像每行的字节数LONG lLineBytes;/指向图像信息头结构的指针LPBITMAPINFOHEADER lpbmi;/图像的颜色数WORD wNumColors;/噪声BYTE NoiseValue;/ 计算图像每行的字节数lpbmi=(LPBITMAPINFOHEADER)lpDIB;/计算图像的高度和宽度lWidth=:DIBWidth(lpDIB);lHeight=:DIBHeight(lpDIB);/找到图像像素的起始位置lpDIBBits=:FindDIBBits(lpDIB);/计算图像的颜色数wNumColors=:DIBNumC
22、olors(lpDIB);/计算图像每行的字节数lLineBytes = WIDTHBYTES(lWidth * lpbmi-biBitCount);/生成伪随机种子srand(unsigned)time(NULL);/在图像中加噪/如果是256色位图if(wNumColors=256) for (j = 0;j lHeight ;j+) for(i = 0;i lWidth ;i+)/随机的噪声值 NoiseValue=rand()/1024; / 指向源图像倒数第j行,第i个象素的指针 lpSrc = (char *)lpDIBBits + lLineBytes * j + i; /在像素
23、值中加入噪声值 *lpSrc = (BYTE)(BYTE)*(lpSrc)*224/256 + NoiseValue);/如果是24位真彩色位图else if(wNumColors=0)for (j = 0;j lHeight ;j+) for(i = 0;i lWidth ;i+) NoiseValue=rand()/1024; / 指向源图像倒数第j行,第i个象素的指针 lpSrc = (char *)lpDIBBits + lLineBytes * j + 3*i; /在每个像素的RGB分量中加入随机的噪声值 *lpSrc+ = (BYTE)(BYTE)*(lpSrc+)*224/256
24、 + NoiseValue);*lpSrc+ = (BYTE)(BYTE)*(lpSrc+)*224/256 + NoiseValue);*lpSrc+ = (BYTE)(BYTE)*(lpSrc+)*224/256 + NoiseValue);/如果既不是256色位图也不是24 位真彩色位图,直接返回elseAfxMessageBox(只支持256色位图和24位真彩色位图);return false;/ 返回return true;/* * * 函数名称: * * AdjustBrightness () * * 参数: * * LPSTR lpDIB / 指向源DIB图像指针 * * int
25、 db * * BOOL /操作成功返回TRUE,否则返回FALSE。 * * 说明: * * 该算法函数用来对256色位图和24位真彩色位图进行亮度调整操作。 * */BOOL WINAPI AdjustBrightness(LPSTR lpDIB, int db)BYTE r, g, b; BITMAPINFO *pbmi; WORD wNumColors; LONG i; LPSTR lpDIBBits; int nDelta; int iWidth, iHeight;if (lpDIB = NULL)return FALSE;pbmi = (BITMAPINFO *)lpDIB;if
26、(! pbmi)return FALSE;wNumColors =:DIBNumColors(lpDIB);if (wNumColors=256) for (i=0; ibmiColorsi.rgbRed = BOUND(pbmi-bmiColorsi.rgbRed+db, 0, 255);pbmi-bmiColorsi.rgbGreen = BOUND(pbmi-bmiColorsi.rgbGreen+db, 0, 255);pbmi-bmiColorsi.rgbBlue = BOUND(pbmi-bmiColorsi.rgbBlue+db, 0, 255);else if(wNumColo
27、rs=0)lpDIBBits= :FindDIBBits(lpDIB); nDelta = WIDTHBYTES(pbmi-bmiHeader.biBitCount)*(pbmi-bmiHeader.biWidth) - (pbmi-bmiHeader.biWidth)*(pbmi-bmiHeader.biBitCount)+7)/8;for (iHeight=0; iHeightbmiHeader.biHeight; iHeight+)for (iWidth=0; iWidthbmiHeader.biWidth; iWidth+)b = (BYTE)*(lpDIBBits);g = (BYTE)*(lpDIBBits+1);r = (BYTE)*(lpDIBBits+2);*lpDIBBits+= BOUND(b+db, 0, 255);*lpDIBBits+= BOUND(g+db, 0, 255);*lpDIBBits+= BOUND(r+db, 0, 255);lpDIBBits += nDelta; elseAfxMessageBox(只处理256色和24位位图); return false;return TRUE;/* * * 函数名
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度国际船舶租赁合同环境保护责任与履约评估3篇
- 二零二五版个人住房抵押贷款合同2篇
- 2025年度家具租赁服务合同标准文本4篇
- 2025年肉类加工企业鲜猪肉原料采购合同3篇
- 2025年度生态农业园区商铺租赁合同规范2篇
- 2024租赁公司设备租赁与购买合同
- 二零二五版高压电缆敷设电力施工劳务合同范本2篇
- 二零二五年度矿产品出口与国内销售合同3篇
- 2025年度运动服饰租赁服务合同样本3篇
- 2025年度农机作业租赁与农村土地流转服务合同
- 师德师风警示教育培训内容
- 2024年氢工艺作业考试题库及答案(700题)
- 安徽省淮南四中2025届高二上数学期末统考模拟试题含解析
- 2025届重庆南开中学数学高二上期末教学质量检测试题含解析
- 2024年重点信访人员稳控实施方案
- 保险专题课件教学课件
- 常见症状腹痛课件
- 《生活垃圾的回收与利用》(教案)-2024-2025学年四年级上册综合实践活动教科版
- 汽车租赁行业的利润空间分析
- 电商代运营合作协议书2024年
- 2024年中考英语阅读理解D篇真题汇编(附答案)0117
评论
0/150
提交评论