<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    圖像編程學習筆記5――圖像鏡像

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    以下文字內容copy于<<數字圖像處理編程入門>>,code為自己實現,是win32控制臺程序。

     

    鏡象(mirror)分水平鏡象和垂直鏡象兩種。圖2.2的水平鏡象和垂直鏡象分別如圖2.13和圖2.14所示

    RFID設備管理軟件

    圖2.13   圖2.2的水平鏡象

                                                                                     RFID設備管理軟件

     

    圖2.14   圖2.2的垂直鏡象

    鏡象的變換矩陣很簡單。設原圖寬為w,高為h,變換后,圖的寬和高不變。

    水平鏡象的變化矩陣為:

                                                                                             RFID設備管理軟件 

     

    (2.10)

    垂直鏡象的變化矩陣為:

                                                                                             RFID設備管理軟件 

     

    (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. }  
      120. int main()  
      121. {  
      122.     work();  
      123.     return 0;  
      124. }  
    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全