图像编程学习笔记5——图像镜像

简介: 以下文字内容copy于,code为自己实现,是win32控制台程序。   镜象(mirror)分水平镜象和垂直镜象两种。图2.2的水平镜象和垂直镜象分别如图2.13和图2.14所示 图2.13   图2.2的水平镜象                                                                                     图2.14   图2.2的垂直镜象 镜象的变换矩阵很简单。

以下文字内容copy于<<数字图像处理编程入门>>,code为自己实现,是win32控制台程序。

 

镜象(mirror)分水平镜象和垂直镜象两种。图2.2的水平镜象和垂直镜象分别如图2.13和图2.14所示

图2.13   图2.2的水平镜象

                                                                                 

 

图2.14   图2.2的垂直镜象

镜象的变换矩阵很简单。设原图宽为w,高为h,变换后,图的宽和高不变。

水平镜象的变化矩阵为:

                                                                                          

 

(2.10)

垂直镜象的变化矩阵为:

                                                                                          

 

(2.11)

镜象变换的源代码如下,因为和平移的那段程序很类似,程序中的注释就简单一些。

[cpp]  view plain copy
 
    1. /** 
    2. * 程序名: Mirror.cpp 
    3. * 功  能: 实现灰度图像的水平镜像和垂直镜像 
    4. *         测试图片test.bmp放在工程目录下 
    5. */  
    6. #include <iostream>  
    7. #include <windows.h>  
    8. #include <fstream>  
    9. #include <cstring>  
    10. using namespace std;  
    11. BITMAPFILEHEADER bmpFileHeader; //bmp文件头  
    12. BITMAPINFOHEADER bmpInfoHeader; //bmp信息头  
    13. RGBQUAD *pColorTable;       //bmp颜色表  
    14. unsigned char *pBmpData;    //bmp位图数据     
    15. unsigned char *pXBmpData;  //水平镜像bmp位图数据  
    16. unsigned char *pYBmpData;  //垂直镜像bmp位图数据  
    17. /** 
    18. * 函数名: readBmp 
    19. * 参  数: fileName -- 指向文件名的指针 
    20. * 功  能: 读取将要处理的图片的信息,成功返回TRUE 
    21. */  
    22. bool readBmp(char *fileName)  
    23. {  
    24.     FILE *fp = fopen(fileName,"rb");  //以二进制读方式打开  
    25.     if (NULL == fp)  
    26.     {     
    27.         cout<<"open failure!"<<endl;  
    28.         return FALSE;  
    29.     }  
    30.     //获得图片数据  
    31.     fread(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);  
    32.     fread(&bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,fp);  
    33.     pColorTable = new RGBQUAD[256];  
    34.     fread(pColorTable,sizeof(RGBQUAD),256,fp);  
    35.     int imgSize = bmpInfoHeader.biSizeImage;  
    36.     pBmpData = new unsigned char[imgSize];  
    37.     //因为大小没有改变,所以一起处理了  
    38.     pXBmpData = new unsigned char[imgSize];  
    39.     pYBmpData = new unsigned char[imgSize];  
    40.     fread(pBmpData,sizeof(unsigned char),imgSize,fp);  
    41.     fclose(fp); //关闭文件  
    42.     return TRUE;  
    43. }  
    44. /** 
    45. * 函数名: mirror 
    46. * 功  能: 对图片进行水平和垂直镜像操作 
    47. */  
    48. void mirror()  
    49. {  
    50.     int height = bmpInfoHeader.biHeight;  
    51.     int width = bmpInfoHeader.biWidth;  
    52.     int imgSize = bmpInfoHeader.biSizeImage;  
    53.     memset(pXBmpData,0,sizeof(unsigned char )*imgSize);  
    54.     memset(pYBmpData,0,sizeof(unsigned char )*imgSize);  
    55.     int lineByte = (width * 8 + 31) / 32 * 4;  //每行像素的字节数  
    56.     for(int i = 0; i < height; i++ )  
    57.     {  
    58.         for(int j = 0; j < width; j++ )  
    59.         {  
    60.             *(pXBmpData + i*lineByte + width - 1 - j) = *(pBmpData + i*lineByte + j); //水平镜像  
    61.             *(pYBmpData + (height - i - 1)*lineByte + j) = *(pBmpData + i*lineByte + j);  //垂直镜像  
    62.         }  
    63.     }  
    64. }  
    65. /** 
    66. * 函数名: writeBmp 
    67. * 参  数: fileName -- 处理完之后的bmp图像 
    68. * 功  能: 写入文件数据到相应的文件中 
    69. */  
    70. bool writeBmp(char *fileName,unsigned char *bmpData)  
    71. {  
    72.     FILE *fp = fopen(fileName,"wb"); //以二进制写方式打开  
    73.     if (NULL == fp)  
    74.     {  
    75.         cout<<"open failure!"<<endl;  
    76.         return FALSE;  
    77.     }  
    78.     int imgSize = bmpInfoHeader.biSizeImage;  
    79.     //写入数据  
    80.     fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);  
    81.     fwrite(&bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,fp);  
    82.     fwrite(pColorTable,sizeof(RGBQUAD),256,fp);  
    83.     fwrite(bmpData,sizeof(unsigned char),imgSize,fp);  
    84.     fclose(fp);  //关闭文件  
    85.     return TRUE;  
    86. }  
    87. /** 
    88. * 函数名: work 
    89. * 功  能: 主要处理 
    90. */  
    91. void work()  
    92. {  
    93.     char readFileName[] = "test.bmp";  
    94.     if (!readBmp(readFileName))  
    95.     {  
    96.         cout<<"read failure!"<<endl;  
    97.         return ;  
    98.     }  
    99.     mirror();  
    100.     char writeFileNameX[] = "X.bmp";  
    101.     char writeFileNameY[] = "Y.bmp";  
    102.     if (!writeBmp(writeFileNameX,pXBmpData))  
    103.     {  
    104.         cout<<"X write failure!"<<endl;  
    105.         return ;  
    106.     }  
    107.     if (!writeBmp(writeFileNameY,pYBmpData))  
    108.     {  
    109.         cout<<"Y write failure!"<<endl;  
    110.         return ;  
    111.     }  
    112.     //释放  
    113.     delete []pColorTable;  
    114.     delete []pBmpData;  
    115.     delete []pXBmpData;  
    116.     delete []pYBmpData;  
    117.     cout<<"mirror success!"<<endl;  
    118.   
    119. }  
    120. int main()  
    121. {  
    122.     work();  
    123.     return 0;  
    124. }  
目录
相关文章
|
数据安全/隐私保护
FileInfo的重要属性和方法
FileInfo类提供与静态File类相同的功能,但是您可以通过手动编写用于从文件读取或写入字节的代码来对文件的读/写操作具有更多控制权。
|
Docker 容器 网络协议
|
缓存 监控 网络协议
DNS缓存中毒原理
【8月更文挑战第17天】
288 1
|
安全 网络协议 网络安全
Socks5代理与Http代理该如何选择
在数字时代,网络安全至关重要,Socks5代理和Http代理成为隐私保护工具。Socks5代理支持TCP/UDP,适用于多种网络服务,提供身份验证,安全但配置复杂;Http代理专注处理Web流量,速度快,配置简单,但仅限Http协议,安全性较低。选择时需根据需求平衡性能与安全。
|
人工智能 前端开发 开发者
Pro-Chat: 一款面向未来的开源智能聊天组件
Pro-Chat: 一款面向未来的开源智能聊天组件
470 0
|
敏捷开发 数据管理 测试技术
深入探索软件测试:方法、挑战与最佳实践
【2月更文挑战第20天】 在数字化时代,软件已成为不可或缺的核心。确保软件的质量和可靠性,软件测试扮演着至关重要的角色。本文将深入探讨软件测试的各种方法,面临的挑战以及实施的最佳实践。我们将从单元测试的基础出发,逐步过渡到集成和系统测试,最后讨论自动化测试的策略。文章旨在为软件测试工程师提供深度洞见,帮助他们更有效地设计和执行测试计划,以确保软件产品的质量。
|
存储 编解码 Android开发
如何使用 VMware 安装安卓虚拟机,如何配置虚拟机的网络和存储?
如何使用 VMware 安装安卓虚拟机,如何配置虚拟机的网络和存储?
1486 0
|
Linux Docker 容器
docker配置代理
docker配置代理
1543 0
|
开发工具 git
Git 中 merge 和 rebase 的区别
$ git pull --rebase和$ git pull区别 是git fetch + git merge FETCH_HEAD的缩写,所以默认情况下,git pull就是先fetch,然后执行merge操作,如果加-rebase参数,就是使用git rebase代替git merge 。
29536 0
|
存储 SQL 固态存储
数据治理之数据生命周期管理
数据治理之数据生命周期管理