QT實(shí)現(xiàn)圖像處理-傅立葉變換、傅立葉反變換、平滑、銳化與模板匹配_第1頁(yè)
QT實(shí)現(xiàn)圖像處理-傅立葉變換、傅立葉反變換、平滑、銳化與模板匹配_第2頁(yè)
QT實(shí)現(xiàn)圖像處理-傅立葉變換、傅立葉反變換、平滑、銳化與模板匹配_第3頁(yè)
QT實(shí)現(xiàn)圖像處理-傅立葉變換、傅立葉反變換、平滑、銳化與模板匹配_第4頁(yè)
QT實(shí)現(xiàn)圖像處理-傅立葉變換、傅立葉反變換、平滑、銳化與模板匹配_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 HYPERLINK blo/qytan36/archive/2010/04/04/1704226.html QT實(shí)現(xiàn)圖像處理-傅立葉變換、傅立葉反變換、平滑、銳化與模板匹配 實(shí)驗(yàn)環(huán)境:1,Linux操作系統(tǒng)2,QT3編程開發(fā)環(huán)境3,C+編程語(yǔ)言傅立葉變換和傅立葉反變換1.1. 主要源代碼readImage() 從圖像中讀取數(shù)據(jù)writeImage() 往圖像中寫入數(shù)據(jù)fft() 快速傅立葉變換ifft() 快速傅立葉反變換adjustImageSize() 調(diào)整圖像大小fourier() 傅立葉變換ifourier() 傅立葉反變換 1.1.1 從圖像中讀取數(shù)據(jù) void ImageProc

2、ess:readImage(complex data, const QImage &srcImage) byte *pImageBytes = srcImage.bits(); /數(shù)據(jù)首地址 int depth = srcImage.depth(); /每個(gè)像素的bit數(shù) int lineBytes = srcImage.bytesPerLine(); /每行的字節(jié)數(shù) int w = srcImage.width(); /寬 int h = srcImage.height(); /高 byte *pByte; /遍歷讀取每個(gè)像素,并轉(zhuǎn)換為灰度值 int i, j; for(i = 0; i h

3、; i+) for(j = 0; j w; j+) if(8 = depth) /采用了256色調(diào)色板,8位顏色索引 pByte = pImageBytes + i * lineBytes + j; datai * w + j = complex( *pByte, 0); else if(32 = depth)/32位表示,數(shù)據(jù)格式為0 xFFBBGGRR或0 xAABBGGRR pByte = pImageBytes + i * lineBytes + j * 4; /根據(jù)RGB模式轉(zhuǎn)化成YIQ色彩模式的方式,取Y作為灰度值 byte pixelValue = (byte)(0.299 *

4、(float)pByte0 + 0.587 * (float)pByte1 + 0.114 * (float)pByte2); datai * w + j = complex( pixelValue, 0); else cout invalid format. depth = depth n; return; 1.1.2 將數(shù)據(jù)寫入圖像 /coef為比例系數(shù),主要用來(lái)調(diào)整灰度值以便于觀察 void ImageProcess:writeImage(QImage &destImage, const complex data, double coef) int lineBytes = destIma

5、ge.bytesPerLine(); int depth = destImage.depth(); int w = destImage.width(); int h = destImage.height(); byte *pImageBytes = destImage.bits(); byte *pByte; for(int i = 0; i h; i+) for(int j = 0; j 255 ? 255 : spectral; /根據(jù)圖像格式寫數(shù)據(jù) if(8 = depth) pByte = pImageBytes + i * lineBytes + j; *pByte = spectr

6、al; else if(32 = depth) pByte = pImageBytes + i * lineBytes + j * 4; pByte0 = pByte1 = pByte2 = spectral; else return; 1.1.3 遞歸形式的快速傅立葉變換 /數(shù)組a為輸入,數(shù)組y為輸出,2的power次方為數(shù)組的長(zhǎng)度 void ImageProcess:fft(const complex a, complex y, int power) if(0 = power) y0 = a0; return; int n = 1 power; double angle = 2 * PI

7、/ n; complex wn(cos(angle), sin(angle); complex w(1, 0); complex *a0 = new complexn / 2; complex *a1 = new complexn / 2; complex *y0 = new complexn / 2; complex *y1 = new complexn / 2; for(int i = 0; i n / 2; i +) a0i = a2 * i; a1i = a2 * i + 1; /分開成兩個(gè)子fft過(guò)程 fft(a0, y0, power - 1); fft(a1, y1, power

8、 - 1); complex u; for(int k = 0; k n / 2; k+) /蝶形算法 u = w * y1k; yk = y0k + u; yk + n / 2 = y0k - u; w = w * wn; delete a0; delete a1; delete y0; delete y1; 1.1.4 快速傅立葉反變換 /y為輸入,a為輸出,2的power次方為數(shù)組的長(zhǎng)度 void ImageProcess:ifft(const complex y, complex a, int power) int count = 1 power; complex *x = new c

9、omplexcount; memcpy(x, y, sizeof(complex) * count); int i; for(i = 0; i count; i+) xi = complex(xi.real(), -xi.imag(); /共軛復(fù)數(shù) fft(x, a, power); /調(diào)用快速傅立葉變換算法 for(i = 0; i count; i+) ai = complex(ai.real() / count, -ai.imag() / count); /共軛復(fù)數(shù) delete x; 1.1.5 調(diào)整圖像的大小 /寬和高都截取為2的指數(shù)倍 void ImageProcess:adjus

10、tImageSize(QImage &image) int w = 1; int h = 1; int width = image.width(); int height = image.height(); wp = 0, hp = 0; while(w * 2 = width) w *= 2; wp+; while(h * 2 = height) h *= 2; hp+; QImage adjustedImage(w, h, image.depth(), image.numColors(), image.bitOrder(); byte *destBytes = adjustedImage.

11、bits(); byte *srcBytes = image.bits(); int lineBytes = image.bytesPerLine(); int bytesPerPixel = image.depth() / 8; /每個(gè)象素的字節(jié)數(shù) for(int i = 0; i h; i+) /拷貝數(shù)據(jù) memcpy(destBytes + i * w * bytesPerPixel, srcBytes + i * lineBytes, sizeof(byte) * w * bytesPerPixel); image = adjustedImage; /更新圖像 1.1.6 傅立葉變換的

12、主過(guò)程 void ImageProcess:fourier() int w = currentImage.width(); int h = currentImage.height(); if(needAdjust) /調(diào)整圖像的大小為2的冪次以便于快速傅立葉變換 adjustImageSize(currentImage); /調(diào)整大小 needAdjust = false; if(currentImageData) delete currentImageData; currentImageData = new complexw * h; readImage(currentImageData,

13、currentImage); /讀取數(shù)據(jù) else if(NULL = currentImageData) currentImageData = new complexw * h; readImage(currentImageData, currentImage); /讀取數(shù)據(jù) w = currentImage.width(); /更新寬和高 h = currentImage.height(); complex *TD = currentImageData; /當(dāng)前讀取的數(shù)據(jù)為時(shí)域 complex *FD = new complexw * h; /申請(qǐng)空間保存變換結(jié)果 int i, j; fo

14、r(i = 0; i h; i+) /在x方向上對(duì)按行進(jìn)行快速傅立葉變換 fft(&TDw * i, &FDw * i, wp); memcpy(TD, FD, sizeof(complex) * w * h); complex *columnt = new complexh; complex *columnf = new complexh; for(i = 0; i w; i+) /調(diào)整行列數(shù)據(jù),在y方向上按列進(jìn)行快速傅立葉變換 for(j = 0; j h; j+) columntj = TDj * w + i; fft(columnt, columnf, hp); for(j = 0;

15、j setPixmap(QPixmap(currentImage); 1.1.7 傅立葉反變換 傅立葉反變換的思想與傅立葉變化相似,只是時(shí)域和頻域互換,然后調(diào)用快速傅立葉反變換ifft而不是快速傅立葉變換fft。 1.2. 運(yùn)行截圖1.2.1 正方形 輸入一個(gè)256*256的圖形,背景為白色,中間有一黑色的正方形,如圖1-1所示。經(jīng)過(guò)傅立葉變換后的結(jié)果如圖1-2所示(注:沒(méi)有采用平移到中心的方法)。 圖1-1 圖1-2 1.2.2 旋轉(zhuǎn)45度 將圖1-1旋轉(zhuǎn)45度后的輸入如圖1-3所示。其傅立葉變換結(jié)果如圖1-4所示。 圖1-3 圖1-4 1.2.3 輸入長(zhǎng)方形圖像 輸入圖像如圖1-5所示。傅

16、立葉變換結(jié)果如圖1-6所示。 圖1-5 圖1-6 1.2.4 傅立葉反變換 對(duì)傅立葉變換結(jié)果圖1-2進(jìn)行傅立葉反變換,其結(jié)果與原圖1-1相同,如圖1-7所示: 圖1-7 圖像增強(qiáng)圖像增強(qiáng)是一種很重要的圖像處理技術(shù),為了方便人們觀察以及機(jī)器處理而去處理給定的一幅圖像。有很多圖像增強(qiáng)的方法,以下這部分實(shí)現(xiàn)了其中的平滑和銳化這兩種方法。 2.1. 主要源碼2.1.1 平滑 平滑采用的模板是, 實(shí)現(xiàn)如下: void ImageProcess:smooth() int w = currentImage.width(); int h = currentImage.height(); if(NULL = c

17、urrentImageData) /判斷是否需要重新讀取數(shù)據(jù) currentImageData = new complexw * h; readImage(currentImageData, currentImage); /拷貝一份數(shù)據(jù)便于計(jì)算 complex *buffer = new complexw * h; memcpy(buffer, currentImageData, sizeof(complex) * w * h); /根據(jù)模板進(jìn)行計(jì)算 /為了簡(jiǎn)化編碼忽略了圖像邊界(i =0 or h, j =0 or w),對(duì)于整體效果沒(méi)有影響 int i, j; for(i = 1; i h

18、 - 1; i+) for(j = 1; j w - 1; j+) complex k; k = buffer(i - 1) * w + j - 1; k += buffer(i - 1) * w + j; k += buffer(i - 1) * w + j + 1; k += bufferi * w + j - 1; k += bufferi * w + j; k += bufferi * w + j + 1; k += buffer(i + 1) * w + j - 1; k += buffer(i + 1) * w + j; k += buffer(i + 1) * w + j + 1

19、; k = complex(k.real() / 9, 0); currentImageDatai * w + j = k; writeImage(currentImage, currentImageData); pDispLabel-setPixmap(QPixmap(currentImage); 2.1.2 銳化 采用拉普拉斯銳化,其模板為,其實(shí)現(xiàn)如下: void ImageProcess:sharp() int w = currentImage.width(); int h = currentImage.height(); if(NULL = currentImageData) /判斷是

20、否需要讀取數(shù)據(jù) currentImageData = new complexw * h; readImage(currentImageData, currentImage); /拷貝一份數(shù)據(jù)便于計(jì)算 complex *buffer = new complexw * h; memcpy(buffer, currentImageData, sizeof(complex) * w * h); /根據(jù)模板進(jìn)行計(jì)算 /為了簡(jiǎn)化編碼忽略了圖像邊界(i =0 or h, j =0 or w),對(duì)于整體效果沒(méi)有影響 int i, j; complex k; for(i = 1; i h - 1; i+) fo

21、r(j = 1; j w - 1; j+) k = bufferi * w + j; k = complex(k.real() * 5, 0); k -= buffer(i - 1) * w + j; k -= bufferi * w + j - 1; k -= bufferi * w + j + 1; k -= buffer(i + 1) * w + j; currentImageDatai * w + j = k; writeImage(currentImage, currentImageData); pDispLabel-setPixmap(QPixmap(currentImage);

22、2.2. 運(yùn)行截圖輸入圖像2-1,其平滑結(jié)果為圖2-2,銳化結(jié)果為 圖2-3。 圖2-1原來(lái)的圖像 圖2-2 平滑后的圖像 圖2-3 銳化后的圖像 圖像分析這部分主要實(shí)現(xiàn)了圖像的模板匹配。模板匹配是一種非常原始的模式識(shí)別方法。有很多模板匹配的算法。這里采用的算法是計(jì)算二者之間的相似度,在目標(biāo)圖像中選取一個(gè)坐標(biāo),將以該坐標(biāo)為左上角選定一塊區(qū)域,計(jì)算該區(qū)域與模板的相似度,相似度最大的點(diǎn)即為匹配之處。通過(guò)二者之間的差異度來(lái)判斷其相似程度,差異度的計(jì)算:m = 。即將累加其像素之間的差值,為了提高計(jì)算速度,可以設(shè)置閥值,當(dāng)m大于閥值時(shí),認(rèn)定該塊區(qū)域不匹配,繼續(xù)尋找下一區(qū)域。 3.1. 主要源碼void

23、 ImageProcess:match() /讓用戶選取模板 QString fileName = QFileDialog:getOpenFileName(/home/tanqiyu, Images (*.png *.xpm .jpg), this, open file dialog, Choose a model image); if(QString:null = fileName) return; /讀取模板數(shù)據(jù) QImage modelImage(fileName); int mw = modelImage.width(); int mh = modelImage.height(); c

24、omplex *modelImageData = new complexmw * mh; readImage(modelImageData, modelImage); unsigned long t = mw * mh * 8; /根據(jù)匹配模板的大小設(shè)置一定的閥值 unsigned long m = t; /初始差異度 int ri = -1; /z左上角坐標(biāo)(ri, rj) int rj = -1; int w = currentImage.width(); int h = currentImage.height(); if(NULL = currentImageData) /判斷是否需要讀取目標(biāo)圖像數(shù)據(jù) currentIma

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論