圖像編程學習筆記5――圖像鏡像
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
以下文字內容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- /**
- * 程序名: Mirror.cpp
- * 功 能: 實現灰度圖像的水平鏡像和垂直鏡像
- * 測試圖片test.bmp放在工程目錄下
- */
- #include <iostream>
- #include <windows.h>
- #include <fstream>
- #include <cstring>
- using namespace std;
- 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;
- }