- Visual C++數字圖像模式識別技術詳解
- 馮偉興 唐墨 賀波等編著
- 750字
- 2018-12-31 15:10:08
2.3 實踐拓展
由于圖像處理算法很多,如圖像特效顯示、圖像變換、圖像平滑、圖像增強、圖像分割等。這些算法都是本章所設計的ImageDib類所無法實現的。解決的方法有兩個,一個是在ImageDib類中直接添加成員函數來實現這些算法。但這勢必導致ImageDib類變得冗長和效率低下;另一個辦法就是利用Visual C++提供的派生類來實現這些算法。
ImageDib類的派生類設計原則如下:讓ImageDib類處理基本的圖像處理功能。如圖像讀取,顯示和存儲。而將需要處理的算法定義為ImageDib類的派生類。由于派生類對ImageDib基類中的保護或公有成員可以直接使用,不需要聲明,因此,在派生類中僅僅定義各種處理圖像數據的函數即可。這樣使不同處理功能歸結在不同的ImageDib派生類中,結構簡潔。
ImageDib類的派生類具有如下功能:
1)由于該類是從ImageDib類派生而來,因此具有ImageDib類的所有功能。
2)ImageDib類的派生類又擴充了一些功能,這些功能隨圖像處理算法的不同而不同。在編程中需要將圖像處理算法函數寫在該類中。每個處理算法編寫成從ImageDib類派生出的類的函數,因此,函數中可以直接使用ImageDib類中的變量和函數,不必加以聲明和定義。
例如,定義ImageDib基類的圖像反色變換派生類ImageTransform如下。
class ImageTransform:public ImageDib { public: unsigned char * m_pImgDataOut; //存儲圖像處理后數據 ImageTransform(); ~ ImageTransform(); Void Transform(); //圖像反色變換 };
而圖像反色變換處理實現函數如下。
ImageTransform::Transform() { m_nBitCount; m_imgWidth; m_imgHeight; //每行像素占字節數,必須為4的倍數 int lineByte=(m_imgWidth*m_nBitCount/8+3)/4*4; //申請空間,存放變換后結果 m_pImgDataOut=new unsigned char[lineByte*m_imgHeight]; //循環變量,圖像的坐標 int i,j; //每像素占字節數 int pixelByte=m_nBitCount/8; //循環變量,遍歷每個像素的每個分量,比如彩色圖像三個分量 int k; //求反轉 for(i=0;i<m_imgHeight;i++){ for(j=0;j<m_imgWidth;j++){ for(k=0;k<pixelByte;k++) *(m_pImgDataOut+i*lineByte+j*pixelByte+k) =255-*(m_pImgData+i*lineByte+j*pixelByte+k); } } }
在此函數中待處理的圖像數據及其圖像屬性完全來自于基類ImageDib,即基類中指向圖像數據區的指針m_pImgData,圖像寬m_imgWidth,圖像高m_imgHeight和每像素所占位數m_nBitCount。而派生類ImageTransform則僅實現具體圖像處理算法Transform(),并把處理結果存入指針變量m_pImgDataOut所指的存儲區中。這樣,不論基類ImageDib加載的是什么樣的圖像,派生類ImageTransform都可以順利實現自己的圖像處理功能。
- Visual C++程序設計教程
- C#高級編程(第10版) C# 6 & .NET Core 1.0 (.NET開發經典名著)
- Node.js Design Patterns
- 微服務與事件驅動架構
- Leap Motion Development Essentials
- Java 11 Cookbook
- 微信小程序項目開發實戰
- R語言與網絡輿情處理
- Mastering openFrameworks:Creative Coding Demystified
- Learning AWS
- SciPy Recipes
- Android應用開發深入學習實錄
- Android應用開發實戰
- 大數據時代的企業升級之道(全3冊)
- Python Projects for Kids