图像编程学习笔记5——图像镜像
2023-09-27 14:29:33 时间
镜象(mirror)分水平镜象和垂直镜象两种。图2.2的水平镜象和垂直镜象分别如图2.13和图2.14所示
图2.13 图2.2的水平镜象
图2.14 图2.2的垂直镜象
镜象的变换矩阵很简单。设原图宽为w,高为h,变换后,图的宽和高不变。
水平镜象的变化矩阵为:
(2.10)
垂直镜象的变化矩阵为:
(2.11)
镜象变换的源代码如下,因为和平移的那段程序很类似,程序中的注释就简单一些。
BITMAPFILEHEADER bmpFileHeader; //bmp文件头 BITMAPINFOHEADER bmpInfoHeader; //bmp信息头 RGBQUAD *pColorTable; //bmp颜色表 unsigned char *pBmpData; //bmp位图数据 unsigned char *pXBmpData; //水平镜像bmp位图数据 unsigned char *pYBmpData; //垂直镜像bmp位图数据 * 函数名: readBmp * 参 数: fileName -- 指向文件名的指针 * 功 能: 读取将要处理的图片的信息,成功返回TRUE bool readBmp(char *fileName) FILE *fp = fopen(fileName,"rb"); //以二进制读方式打开 if (NULL == fp) { cout "open failure!" endl; return FALSE; } //获得图片数据 fread( bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp); fread( bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,fp); pColorTable = new RGBQUAD[256]; fread(pColorTable,sizeof(RGBQUAD),256,fp); int imgSize = bmpInfoHeader.biSizeImage; pBmpData = new unsigned char[imgSize]; //因为大小没有改变,所以一起处理了 pXBmpData = new unsigned char[imgSize]; pYBmpData = new unsigned char[imgSize]; fread(pBmpData,sizeof(unsigned char),imgSize,fp); fclose(fp); //关闭文件 return TRUE; * 函数名: mirror * 功 能: 对图片进行水平和垂直镜像操作 void mirror() int height = bmpInfoHeader.biHeight; int width = bmpInfoHeader.biWidth; int imgSize = bmpInfoHeader.biSizeImage; memset(pXBmpData,0,sizeof(unsigned char )*imgSize); memset(pYBmpData,0,sizeof(unsigned char )*imgSize); int lineByte = (width * 8 + 31) / 32 * 4; //每行像素的字节数 for(int i = 0; i height; i++ ) { for(int j = 0; j width; j++ ) { *(pXBmpData + i*lineByte + width - 1 - j) = *(pBmpData + i*lineByte + j); //水平镜像 *(pYBmpData + (height - i - 1)*lineByte + j) = *(pBmpData + i*lineByte + j); //垂直镜像 } } * 函数名: writeBmp * 参 数: fileName -- 处理完之后的bmp图像 * 功 能: 写入文件数据到相应的文件中 bool writeBmp(char *fileName,unsigned char *bmpData) FILE *fp = fopen(fileName,"wb"); //以二进制写方式打开 if (NULL == fp) { cout "open failure!" endl; return FALSE; } int imgSize = bmpInfoHeader.biSizeImage; //写入数据 fwrite( bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp); fwrite( bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,fp); fwrite(pColorTable,sizeof(RGBQUAD),256,fp); fwrite(bmpData,sizeof(unsigned char),imgSize,fp); fclose(fp); //关闭文件 return TRUE; * 函数名: work * 功 能: 主要处理 void work() char readFileName[] = "test.bmp"; if (!readBmp(readFileName)) { cout "read failure!" endl; return ; } mirror(); char writeFileNameX[] = "X.bmp"; char writeFileNameY[] = "Y.bmp"; if (!writeBmp(writeFileNameX,pXBmpData)) { cout "X write failure!" endl; return ; } if (!writeBmp(writeFileNameY,pYBmpData)) { cout "Y write failure!" endl; return ; } //释放 delete []pColorTable; delete []pBmpData; delete []pXBmpData; delete []pYBmpData; cout "mirror success!" endl; int main() work(); return 0;
【OpenVI】老片图像上色,一键开源体验 随着摄影技术的演进,彩色照片在现在已经非常普及,但仍然有大量历史黑白照片遗留。图像上色可以对这些宝贵的旧时代遗产进行修复,令老照片重获新生。
相关文章
- 【ROS学习笔记】6.发布者Publisher的编程实现(C++和Python)
- Haskell 学习笔记-06:矩阵问题——函数式编程真不容易
- Haskell 学习笔记-03:函数式编程与量子计算
- 网页编程学习笔记
- 网络编程学习笔记一:Socket编程
- 传智播客java教程视频资源,附学习笔记+面试整理+进阶书籍
- Linux学习笔记之安装报错/lib/ld-linux.so.2: bad ELF interpreter
- ELK学习笔记之CentOS 7下ELK(6.2.4)++LogStash+Filebeat+Log4j日志集成环境搭建
- Python Web学习笔记之socket编程
- Java马士兵高并发编程视频学习笔记(二)
- tkinter GUI编程(学习笔记-1 窗口组件与布局)
- 黑马程序员&传智播客python 协程greenlet gevent学习笔记
- webdriver(python)学习笔记一
- JSP&Servlet学习笔记----第5章
- C++学习笔记30,指针的引用(2)
- Flex 布局学习笔记
- 图像编程学习笔记8——图像的平滑(去噪)
- 图像编程学习笔记5——图像镜像
- 图像编程学习笔记6——图像转置
- 图像编程学习笔记2——bmp位图平移
- C语言学习笔记——结构体章节
- 【PMP】Head First PMP 学习笔记 第五章 范围管理
- 图像编程学习笔记9——图像的锐化
- 图像编程学习笔记4——24位真彩色转换为灰度图像
- 图像编程学习笔记3——图像旋转