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

以下文字内容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 plaincopy

    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. int main()

    120. {

    121. work();

    122. return 0;

    123. }

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

时间: 2024-10-09 22:44:09

图像编程学习笔记5——图像镜像的相关文章

图像编程学习笔记7——图像缩放

假设放大因子为ratio,(为了避免新图过大或过小,我们在程序中限制0.25≤ratio≤4),缩放(zoom)的变换矩阵很简单: (2.13) 缩放变换的源代码如下,因为和转置的那段程序很类似,程序中的注释就简单一些. [cpp] view plaincopy /** * 函数名: zoom * 参  数: ratio -- 缩放率 * 功  能: 对图片进行水平和垂直镜像操作 *         只保存原图大小的图像数据,如果没有就用白色填充 */ void zoom(double rati

图像编程学习笔记6——图像转置

转置(transpose)是指将x,y坐标对换,图2.2的转置如图2.15所示. 图2.2 图2.15   图2.2的转置 要注意的是,转置和旋转900是有区别的,不信你可以试试:怎么旋转,图2.2也转不出图2.15来.另外,转置后图的宽高对换了.转置的变换矩阵很简单: (2.12) 镜象变换的源代码如下,因为和旋转的那段程序很类似,程序中的注释就简单一些: 由于很多代码和之前的重复,所以只给出主要功能代码(win32 控制台程序) [cpp] view plaincopy void trans

图像编程学习笔记8——图像的平滑(去噪)

第一种方法:高斯模版 以下文字内容copy于<<数字图像处理编程入门>>,code为自己实现,是win32控制台程序. 先举个例子说明一下什么是平滑(smoothing),如下面两幅图所示:可以看到,图3.2比图3.1柔和一些(也模糊一些).是不是觉得很神奇?其实实现起来很简单.我们将原图中的每一点的灰度和它周围八个点的灰度相加,然后除以9,作为新图中对应点的灰度,就能实现上面的效果. 这么做并非瞎蒙,而是有其道理的.大概想一想,也很容易明白.举个例子,就象和面一样,先在中间加点水

图像编程学习笔记9——图像的锐化

锐化(sharpening)和平滑恰恰相反,它是通过增强高频分量来减少图象中的模糊,因此又称为高通滤波(high passfilter).锐化处理在增强图象边缘的同时增加了图象的噪声. 常用的锐化模板是拉普拉斯(Laplacian)模板(见(3.4)式),又是个数学家的名字,可见学好数学,走遍天下都不怕. (3.4) 容易看出拉普拉斯模板的作法:先将自身与周围的8个象素相减,表示自身与周围象素的差别:再将这个差别加上自身作为新象素的灰度.可见,如果一片暗区出现了一个亮点,那么锐化处理的结果是这个

OpenCV2学习笔记:图像的读取与显示

1. 图像读取:imread() Mat imread(const string& ?lename, int ?ags=1 ) 参数介绍: filename: 待加载的文件名称. flags: 此标志用来指定被加载图像的颜色类型(color type).这个标志的取值可以有: -- CV_LOAD_IMAGE_ANYDEPTH : 如果设置这个标志的话,如果图像为16位或32位深度的图像,则返回对应深度的图像:否则,将图像转换为8位深度图像再返回. -- CV_LOAD_IMAGE_COLOR

Java并发编程学习笔记

Java编程思想,并发编程学习笔记. 一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现Runnable接口并编写run方法,使得该任务可以执行你的命令.   class MyTask implements Runnable {    private String mName;     public MyTask(String name) {    mName = name;   }  

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

JAVA GUI编程学习笔记目录

1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之GUI编程窗体事件 6.JAVA之GUI编程Action事件 7.JAVA之GUI编程鼠标事件 8.JAVA之GUI编程键盘码查询器 9.JAVA之GUI编程列出指定目录内容 10.JAVA之GUI编程弹出对话框Dialog 11.JAVA之GUI编程菜单 12.JAVA之GUI编程打开与保存文件 13.JAVA之GUI编程将程序打包jar JA