第一篇:三級(jí)項(xiàng)目報(bào)告圖像匹配算法的實(shí)現(xiàn)及分析
三級(jí)項(xiàng)目設(shè)計(jì)(論文)
圖像匹配算法的實(shí)現(xiàn)及分析
摘要
圖像匹配是計(jì)算機(jī)視覺和圖像處理領(lǐng)域中非常重要的工作,當(dāng)我們需要在一副圖像中尋找是否存在一個(gè)物體或一個(gè)小場(chǎng)景,并確定其位置,這時(shí)候我們就應(yīng)當(dāng)將具有灰度相關(guān)的圖像進(jìn)行匹配,實(shí)現(xiàn)圖像匹配算法,通過計(jì)算它們之間的相關(guān)系數(shù),確定協(xié)方差,進(jìn)而進(jìn)行圖像匹配,確定其存在與否,并定位。
關(guān)鍵詞:灰度相關(guān);圖像匹配;相關(guān)系數(shù);協(xié)方差
前言
隨著科技的進(jìn)步,圖像匹配技術(shù)已經(jīng)成為信息處理領(lǐng)域極為重要和基本的技術(shù)。在軍事上,它普遍應(yīng)用于導(dǎo)彈的地圖/地形匹配制導(dǎo),飛機(jī)的導(dǎo)航等;在民用上,它普遍應(yīng)用于運(yùn)載工具自動(dòng)導(dǎo)航儀,儀表導(dǎo)航,環(huán)境導(dǎo)航,環(huán)境保護(hù),材料檢測(cè),機(jī)器人,交通等。
圖像匹配是指通過一定的匹配算法在兩幅或多幅圖像之間識(shí)別同名點(diǎn),如二維圖像匹配中通過比較目標(biāo)區(qū)和搜索區(qū)中相同大小的窗口的相關(guān)系數(shù),取搜索區(qū)中相關(guān)系數(shù)最大所對(duì)應(yīng)的窗口中心點(diǎn)作為同名點(diǎn)。其實(shí)質(zhì)是在基元相似性的條件下,運(yùn)用匹配準(zhǔn)則的最佳搜索問題。常見方法有:像素灰度相關(guān)匹配,圖像特征匹配等等。圖像匹配是數(shù)字圖像處理重要的研究課題之一。
正文
一.圖像匹配方法原理與實(shí)現(xiàn)步驟
本項(xiàng)目要求,要用一個(gè)較小的圖像,即模板與目標(biāo)圖像進(jìn)行比較,以確定在目標(biāo)圖像中是否存在與該模板相同或相似的區(qū)域,若該區(qū)域存在,還可確定其位置。下面介紹幾種常見的匹配方法 1.基于圖像特征的配準(zhǔn)方法
需要對(duì)圖像進(jìn)行預(yù)處理,然后提取圖像中保持不變的特征,如邊緣點(diǎn)、閉區(qū)域的中心、線特征、2.基于模型的匹配方法
在計(jì)算機(jī)視覺領(lǐng)域中的應(yīng)用非常廣泛,它可以分為剛體形狀匹配和變形模板匹配[4]兩大類。Kass提出的Snake主動(dòng)輪廓模型是比較典型的自由式變形模板模型。3.基于變換域的匹配的方法
有基于傅立葉變換、基于Gabor變換和基于小波變換的匹配,這些匹配方法對(duì)噪聲不敏感,檢測(cè)結(jié)果不受照度變化影響,可以較好的處理圖像之間的旋轉(zhuǎn)和尺度變化。
綜合看來:選擇變換域的匹配方法可以較好的進(jìn)行圖像匹配。
根據(jù)相關(guān)定理,若f(x,y)和g(x,y)為二維時(shí)域函數(shù),那么,定義以下相關(guān)運(yùn)算: f(x,y)?g(x,y)???????????f(???)g(x??,y??)d?d?
式中,?符號(hào)表示相關(guān)運(yùn)算。
*??F'f(x,y)?g(x,y)?F(u,v)?G(u,v)
式中,F(xiàn)'表示傅里葉變換,F(xiàn)(u,v)是f(x,y)的傅里葉變換;G(u,v)是g(x,y)的傅里葉變換;G*(u,v)是G(u,v)的共軛。
也就是說,由于相關(guān)定理表示兩個(gè)物體的相關(guān)程度,相關(guān)程度越高,說明兩個(gè)物體越相似。那么我們根據(jù)定理,利用傅里葉變換,對(duì)兩個(gè)圖像做相關(guān),然后觀察出現(xiàn)的峰值,若峰值越高,表明兩個(gè)物體越相似,并確定最高峰值的位置,則可以確定模板圖在目標(biāo)圖中的位置。根據(jù)所給的條件,具體實(shí)現(xiàn)步驟如下:
1、制作模板圖和目標(biāo)圖。根據(jù)所給的模板,利用畫圖工具重新制作一個(gè)模板圖和目標(biāo)圖,要求目標(biāo)圖中間與左上角位置有與模板同樣的圖形,其他位置在畫出另外三個(gè)圖形。(如下圖1、2、3)
2、將模板圖與目標(biāo)圖數(shù)字化。即將模板圖與目標(biāo)圖分別讀入Matlab中,并存入相關(guān)矩陣,為了減少計(jì)算量,可將兩幅圖的數(shù)據(jù)矩陣轉(zhuǎn)換為二值圖像數(shù)據(jù)矩陣。
3、做傅里葉變換。根據(jù)相關(guān)定理,時(shí)域的相關(guān),等于頻域的乘積。所以要將模板圖與目標(biāo)圖分別做傅里葉變換,變換的頻域中去。(如下圖4、5)
4、相關(guān)。模板圖與目標(biāo)圖經(jīng)傅里葉變換后,兩圖所得矩陣數(shù)乘,其中目標(biāo)圖的矩陣要先取共軛,然后經(jīng)過反傅里葉變換到頻域中去,并利用fftshift函數(shù)將低頻部分移到中間去,并將圖形旋轉(zhuǎn)180度,得到正確的坐標(biāo)軸,然后觀察出現(xiàn)的五個(gè)峰值。(如下圖6)
5、定位。求出相應(yīng)矩陣中的最大值,根據(jù)最大值設(shè)置一閾值,找出高于此閾值的坐標(biāo),即為模板圖在目標(biāo)圖中的位置。(如下圖7)二.實(shí)現(xiàn)過程舉例
根據(jù)上面所述實(shí)現(xiàn)步驟,具體實(shí)現(xiàn)過程如下 第一步所對(duì)應(yīng)圖形:
模板圖 目標(biāo)圖
第三步所對(duì)應(yīng)圖形:
圖4 模板圖的傅里葉變換頻譜
圖5 目標(biāo)圖的傅里葉變換頻譜
第四步所對(duì)應(yīng)的圖形:
圖6 模板圖與目標(biāo)圖相關(guān)后的圖形
第五步所對(duì)應(yīng)的圖形:
圖7 模板圖在目標(biāo)圖中的位置(最高峰值出現(xiàn)的位置)
三.程序?qū)崿F(xiàn) 具體實(shí)現(xiàn)程序如下:
function y=imagePosition()%圖像匹配
%在一目標(biāo)圖像中,檢測(cè)特定模板圖像,并確定其位置
templet=imread('mig25_2.tif');%將模板圖中的數(shù)據(jù)讀入templet矩陣中 level=graythresh(templet);%設(shè)置黑白轉(zhuǎn)換閥值 bw=im2bw(templet,level);%轉(zhuǎn)換為二值圖像數(shù)據(jù)
F=fft2(bw);%對(duì)模板圖做快速傅里葉變換
figure,mesh(fftshift(abs(F)));%繪制模板圖經(jīng)過傅里葉變換后的三維圖 title('模板圖的傅里葉變換頻譜');%圖像題目
target=imread('mig25_3.tif');%將目標(biāo)圖中的數(shù)據(jù)讀入target矩陣中 level=graythresh(target);BW=im2bw(target,level);F2=fft2(BW);%對(duì)目標(biāo)圖做快速傅里葉變換 %打開新的圖形窗口,并繪制目標(biāo)圖經(jīng)過傅里葉變換后的三維圖 figure,mesh(fftshift(abs(F2)));title('目標(biāo)圖的傅里葉變換頻譜');%在頻域內(nèi)用F點(diǎn)乘F2的共軛,相當(dāng)于在時(shí)域內(nèi)模板圖與目標(biāo)圖做相關(guān)運(yùn)算 %然后在做反傅里葉變換到時(shí)域,用fftshift函數(shù)將傅里葉變換的零頻率部分移到數(shù)組中間
R=fftshift(abs(ifft2(F.*conj(F2))));R=rot90(R,2);%將R矩陣逆時(shí)針旋轉(zhuǎn)180度,得到正確的坐標(biāo)圖 figure,mesh(R)%打開新的圖形窗口,并繪制相關(guān)后的三維圖,觀察五個(gè)峰值 title('兩個(gè)圖相關(guān)后的頻譜');thresh=max(R(:));%求矩陣R中的最大值
%求矩陣中最大值的所在的數(shù)組下標(biāo),即圖像中最大峰值的位置 [row col]=find(R>thresh-1);figure,imshow(BW);%顯示原始目標(biāo)圖
hold on %在當(dāng)前坐標(biāo)圖形里添加繪制圖形
%以找到的峰值的坐標(biāo)為圓心,在原圖上畫圓做標(biāo)記,即在目標(biāo)圖上標(biāo)記模板圖 for i=1:1:length(row)angle=0:0.1:2*pi;%采用極坐標(biāo)法,其中半徑設(shè)為10 plot(10*cos(angle)+col(i),10*sin(angle)+row(i),'LineWidth',3);End 四.結(jié)果分析
根據(jù)結(jié)果顯示在目標(biāo)圖像中,與模板圖像相同的圖形被圈上了藍(lán)圓圈,在相似圖像的位置上有傅里葉函數(shù)變換頻譜的峰值,進(jìn)以證明圖像在此相似度高,圖像匹配。同時(shí)定位了相似圖像的位置。通過對(duì)圖像的像素的灰度值計(jì)算,可以充分利用圖像的所有信息來高精度地區(qū)分不同對(duì)象,但因此處理的信息量很大,計(jì)算復(fù)雜度很高。同時(shí)不能分辨目標(biāo)圖片旋轉(zhuǎn),拉伸或壓縮后的圖像匹配問題。五.擴(kuò)展解決方案
現(xiàn)如今為解決計(jì)算復(fù)雜度很高的問題可以通過SSDA算法,它的匹配精度與理論值相同,相位相關(guān)法匹配時(shí)間介于SSDA算法和ABS算法二者中間,也存在一個(gè)像素的誤差; 為解決不能分辨目標(biāo)圖片旋轉(zhuǎn),拉伸或壓縮后的圖像匹配問題可以使用基于圖像特征的匹配算法,應(yīng)用圖像邊緣特征和頻域相關(guān)相結(jié)合的圖像處理技術(shù)進(jìn)行圖像匹配,能夠達(dá)到較高精確地定位,具有自動(dòng)匹配的優(yōu)點(diǎn)。在帶有旋轉(zhuǎn)誤差的圖像匹配中,具有較好的穩(wěn)定性,極大的減少了人為因素帶來的誤差,縮短了匹配時(shí)間,匹配效果良好。
這些方法都是進(jìn)一步不錯(cuò)的解決圖像匹配問題的方法,在這里不做過多的描述。
結(jié)論
1.基于傅立葉變換的匹配,這些匹配方法對(duì)噪聲不敏感,檢測(cè)結(jié)果不受照度變化影響,可以較好的處理圖像之間的旋轉(zhuǎn)和尺度變化。所以采用此變換方式來進(jìn)行研究。
2.此匹配方法的優(yōu)點(diǎn):對(duì)噪聲不敏感,檢測(cè)結(jié)果不受光照變化影響。有成熟的快速算法并且易于硬件實(shí)現(xiàn)。缺點(diǎn):該方法僅符合存在平移量的劇像間的配準(zhǔn),然而在實(shí)際中,圖像間不僅存在平移量的不同,而且還有旋轉(zhuǎn)角度、縮放尺度等的不同。
3.經(jīng)過此次三級(jí)項(xiàng)目的制作與學(xué)習(xí),不僅使我們對(duì)圖像匹配算法有了更深的了解和認(rèn)識(shí),還加強(qiáng)了我們組內(nèi)成員之間的溝通協(xié)作能力,讓我們最感興趣的是大家在一起共同探究,集思廣益,各抒己見,這種形式讓大家的觀點(diǎn)來得更直接、更樸素、更真實(shí)。在交流中得到啟發(fā),得到快樂。
參考文獻(xiàn):
1.西安電子科技大學(xué)碩士學(xué)位論文“圖像匹配算法研究” 2.哈爾濱工程大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 “特定圖像的檢測(cè)與定位”
第二篇:C++ 八種排序算法總結(jié)及實(shí)現(xiàn)
八種排序算法總結(jié)之C++版本
五種簡(jiǎn)單排序算法
一、冒泡排序
【穩(wěn)定的】
void BubbleSort(int* a,int Count)//實(shí)現(xiàn)從小到大的最終結(jié)果 { int temp;for(int i=1;i for(int j=Count-1;j>=i;j--) if(a[j] < a[j-1]) { temp = a[j]; a[j] = a[j-1]; a[j-1] = temp; } } 現(xiàn)在注意,我們給出O方法的定義: 若存在一常量K和起點(diǎn)n0,使當(dāng)n>=n0時(shí),有f(n)<=K*g(n),則f(n)= O(g(n))。(呵呵,不要說沒學(xué)好數(shù)學(xué)呀,對(duì)于編程數(shù)學(xué)是非常重要的!?。?/p> 現(xiàn)在我們來看1/2*(n-1)*n,當(dāng)K=1/2,n0=1,g(n)=n*n時(shí),1/2*(n-1)*n<=1/2*n*n=K*g(n)。所以f(n)=O(g(n))=O(n*n)。所以我們程序循環(huán)的復(fù)雜度為O(n*n)。 二、交換排序 【穩(wěn)定的】 void ExchangeSort(int *a,int Count){ int temp;for(int i=0;i for(int j=i+1;j if(a[j] < a[i]) { temp = a[j]; a[j] = a[i]; a[i] = temp; } } 時(shí)間復(fù)雜度為O(n*n)。 三、選擇法 【不穩(wěn)定的】 void SelectSort(int *a,int Count){ int temp;//一個(gè)存儲(chǔ)值 int pos;//一個(gè)存儲(chǔ)下標(biāo) for(int i=0;i temp = a[i]; pos = i; for(int j=i+1;j if(a[j] < temp)//選擇排序法就是用第一個(gè)元素與最小的元素交換 { temp = a[j]; pos = j;//下標(biāo)的交換賦值,記錄當(dāng)前最小元素的下標(biāo)位置 } a[pos] = a[i]; a[i] = temp;} } 遺憾的是算法需要的循環(huán)次數(shù)依然是1/2*(n-1)*n。所以算法復(fù)雜度為O(n*n)。 我們來看他的交換。由于每次外層循環(huán)只產(chǎn)生一次交換(只有一個(gè)最小值)。所以f(n)<=n 所以我們有f(n)=O(n)。所以,在數(shù)據(jù)較亂的時(shí)候,可以減少一定的交換次數(shù)。 四、插入法 【穩(wěn)定的】 void InsertSort(int *a,int Count){ int temp;//一個(gè)存儲(chǔ)值 int pos;//一個(gè)存儲(chǔ)下標(biāo) for(int i=1;i { temp = a[i];//當(dāng)前要插入的元素 pos = i-1; while(pos>=0 && temp { a[pos+1] = a[pos];//將前一個(gè)元素后移一位 pos--; } a[pos+1] = temp;} } 其復(fù)雜度仍為O(n*n)。 最終,我個(gè)人認(rèn)為,在簡(jiǎn)單排序算法中,直接插入排序是最好的。 五、希爾排序法 【不穩(wěn)定的】 /* * 希爾排序,n為數(shù)組的個(gè)數(shù) */ void ShellSort(int arr[], int n){ int temp,pos;int d = n;//增量初值 do{ d = d/3 + 1; for(int i= d;i { temp = arr[i]; pos = i-d; while(pos>=0 && temp < arr[pos]){ arr[ pos + d ] = arr[pos]; pos-= d; } arr[ pos + d ] = temp; } } while(d > 1);} //實(shí)現(xiàn)增量為d的插入排序 三種高級(jí)排序算法 一、快速排序 輔助空間復(fù)雜度為O(1) 【不穩(wěn)定的】 void QuickSort(int *a,int left, int right){ int i,j,middle,temp;i = left;j = right;middle = a[(left+right)/2 ];do { while(a[i] i++; while(a[j]>middle && j>left)//從右掃描小于中值的數(shù) j--; if(i<=j)//找到了一對(duì)值 { temp = a[i]; a[i] = a[j]; } a[j] = temp; i++; j--;} } while(i 注意,在掃描過程中,對(duì)于給定參考值,對(duì)于向右(左)掃描,如果掃描值大(小)于或等于參考值,就需要進(jìn)行交換。最終得到的結(jié)果是,j左邊的值都小于參考值,而i右邊的值都大于參考值,j和i之間的值都等于參考值。對(duì)j左邊和i右邊的分別使用遞歸,就可以完成最終的排序。 這里我沒有給出行為的分析,因?yàn)檫@個(gè)很簡(jiǎn)單,我們直接來分析算法:首先我們考慮最理想的情況 1.數(shù)組的大小是2的冪,這樣分下去始終可以被2整除。假設(shè)為2的k次方,即k=log2(n)。 2.每次我們選擇的值剛好是中間值,這樣,數(shù)組才可以被等分。 第一層遞歸,循環(huán)n次,第二層循環(huán)2*(n/2)......所以共有n+2(n/2)+4(n/4)+...+n*(n/n)= n+n+n+...+n=k*n=log2(n)*n 所以算法復(fù)雜度為O(log2(n)*n) 其他的情況只會(huì)比這種情況差,最差的情況是每次選擇到的middle都是最小值或最大值,那么他將變 成交換法(由于使用了遞歸,情況更糟),但是糟糕的情況只會(huì)持續(xù)一個(gè)流程,到下一個(gè)流程的時(shí)候就很可能已經(jīng)避開了該中間的最大和最小值,因?yàn)閿?shù)組下標(biāo)變化了,于是中間值不在是那個(gè)最大或者最小值。但是你認(rèn)為這種情況發(fā)生的幾率有多大??呵呵,你完全不必?fù)?dān)心這個(gè)問題。實(shí)踐證明,大多數(shù)的情況,快速排序總是最好的。 如果你擔(dān)心這個(gè)問題,你可以使用堆排序,這是一種穩(wěn)定的O(log2(n)*n)算法,但是通常情況下速度要慢 于快速排序(因?yàn)橐亟M堆)。 二、歸并排序(兩種實(shí)現(xiàn)方法均要掌握) 【穩(wěn)定的】 歸并排序是一種極好的外部排序方法,即針對(duì)數(shù)據(jù)保存在磁盤上而不是高速內(nèi)存中的問題。 //以下程序參考數(shù)據(jù)結(jié)構(gòu)課本P286頁的模板,為使用指針鏈表實(shí)現(xiàn)的 #include struct node{ //鏈表的節(jié)點(diǎn)數(shù)據(jù) int value;node *next;}; node * divide_from(node * head){ node * position, * midpoint, * second_half;if((midpoint=head)== NULL)//List is empty return NULL;position = midpoint->next;while(position!= NULL)//Move position twice for midpoint's one move { position = position->next; if(position!= NULL) { midpoint = midpoint->next; position = position->next; } } second_half = midpoint->next;midpoint->next = NULL;//在這里將原鏈拆斷,分為兩段 return second_half;} node * merge(node * first, node * second){ node * last_sorted;//當(dāng)前已經(jīng)鏈接好的有序鏈中的最后一個(gè)節(jié)點(diǎn) node combined;//啞節(jié)點(diǎn) last_sorted = &combined;while(first!=NULL && second!=NULL){ if(first->value < second->value){ last_sorted->next = first; last_sorted = first; first = first->next; }else { last_sorted->next = second; last_sorted = second; second = second->next; } } if(first==NULL) last_sorted->next = second;else last_sorted->next = first;return combined.next;//返回啞節(jié)點(diǎn)的后繼指針,即為合并后的鏈表的頭指針 } //這里的參數(shù)必須是引用調(diào)用,需要這個(gè)指引去允許函數(shù)修改調(diào)用自變量 void MergeSort(node * &head){ if(head!= NULL && head->next!= NULL)//如果只有一個(gè)元素,則不需排序 { node * second_half = divide_from(head); MergeSort(head); MergeSort(second_half); head = merge(head, second_half);} } int main(){ node a,b,c,d;node *p1, *p2, *p3, *p4,*head;p1 = &a;p2 = &b;p3 = &c;p4 = &d;a.value = 2;b.value = 4;c.value = 3;d.value = 1;a.next = p2;b.next = p3;c.next = p4;d.next = NULL;//調(diào)用歸并排序前的結(jié)果 head = p1;while(head!= NULL){ cout< head = head->next;} cout< head = p1;while(head!= NULL){ cout< head = head->next;} cout< //以下程序?yàn)槭褂脭?shù)組實(shí)現(xiàn)的歸并排序,輔助空間復(fù)雜度為O(n) #include void Merge(int data[], int left, int mid, int right){ int n1,n2,k,i,j;n1 = midmid;int *L = new int[n1];//兩個(gè)指針指向兩個(gè)動(dòng)態(tài)數(shù)組的首地址 int *R = new int[n2];for(i=0,k=left;i L[i] = data[k];for(i=0,k=mid+1;i R[i] = data[k];for(k=left,i=0,j=0;i if(L[i] < R[j]){ //取小者放前面 data[k] = L[i]; i++; } else { data[k] = R[j]; j++; } } if(i for(j=i;j < n1;j++,k++) } /* * left:數(shù)組的開始下標(biāo),一般為0;right:數(shù)組的結(jié)束下標(biāo),一般為(n-1)*/ void MergeSort(int data[], int left, int right){ if(left < right){ int mid = left +(right-left)/ 2;//mid=(right+left)/2,防止溢出 MergeSort(data, left, mid); MergeSort(data , mid+1, right); Merge(data , left, mid , right);} } int main(){ int data[] = {9,8,7,2,5,6,3,55,1};//排序前的輸出 for(int i=0;i<9;i++) cout< for(int i=0;i<9;i++) cout< 三、堆排序 【不穩(wěn)定的】 /* * 向堆中插入current元素的函數(shù) */ void insert_heap(int data[], const int ¤t, int low, int high) data[k] = L[j];else //if(j for(i=j;i data[k] = R[i];delete []L;//回收內(nèi)存 delete []R;{ int large;//元素data[low]左右兒子中,大者的位置 large = 2*low + 1;while(large <= high){ if(large < high && data[large] < data[ large+1]) large++; if(current > data[ large ])//待插入元素的值比它的兩個(gè)兒子都大 break; else { data[ low ] = data[ large ];//將其左右兒子的大者上移 low = large; large = 2 * large + 1; } } data[ low ] = current;} /* * 建立堆函數(shù),num為數(shù)組data的元素個(gè)數(shù) * 只有一個(gè)結(jié)點(diǎn)的<2-樹>自動(dòng)滿足堆的屬性,因此不必?fù)?dān)心樹中的任何樹葉,即 * 不必?fù)?dān)心表的后一半中的元素。如果從表的中間點(diǎn)開始并從后向前工作,就 * 能夠使用函數(shù)insert_heap去將每個(gè)元素插入到包含了所有后面元素的部分堆 * 中,從而創(chuàng)建完整的堆。*/ void build_heap(int data[], int num){ int current;for(int low = num/2-1;low>=0;low--){ current = data[ low ]; insert_heap(data, current, low, num-1);} } /* * 堆排序主函數(shù),num為數(shù)組data的元素個(gè)數(shù) */ void heap_sort(int data[], int num){ int current, last_sorted;build_heap(data, num);//建立堆 for(last_sorted = num-1;last_sorted>0;last_sorted--){ //逐個(gè)元素處理 current = data[ last_sorted ];//data[0]在整個(gè)數(shù)組排序結(jié)束前,存儲(chǔ)的是待排序元素中最大的元素 data[last_sorted] = data[0]; insert_heap(data, current, 0, last_sorted-1);} } int main(){ //用于排序算法的輸入輸出 int a[8] = {5,7,1,2,9,4,6,3,};for(int i=0;i< sizeof(a)/sizeof(int);i++) cout< for(int i=0;i< sizeof(a)/sizeof(int);i++) cout< 1,插值算法(3種): (1)最鄰近插值(近鄰取樣法): 最鄰近插值的的思想很簡(jiǎn)單,就是把這個(gè)非整數(shù)坐標(biāo)作一個(gè)四舍五入,取最近的整數(shù)點(diǎn)坐標(biāo)處的點(diǎn)的顏色??梢姡钹徑逯岛?jiǎn)單且直觀,速度也最快,但得到的圖像質(zhì)量不高。 最鄰近插值法的MATLAB源代碼為: A = imread('F:lena.jpg');%讀取圖像信息 imshow(A);%顯示原圖 title('原圖128*128'); Row = size(A,1);Col = size(A,2);%圖像行數(shù)和列數(shù) nn=8;%放大倍數(shù) m = round(nn*Row);%求出變換后的坐標(biāo)的最大值 n = round(nn*Col); B = zeros(m,n,3);%定義變換后的圖像 for i = 1 : m for j = 1 : n x = round(i/nn);y = round(j/nn);%最小臨近法對(duì)圖像進(jìn)行插值 if x==0 x = 1;end if y==0 y = 1;end if x>Row x = Row;end if y>Col y = Col;end B(i,j,:)= A(x,y,:); end end B = uint8(B);%將矩陣轉(zhuǎn)換成8位無符號(hào)整數(shù) figure;imshow(B); title('最鄰近插值法放大8倍1024*1024'); 運(yùn)行程序后,原圖如圖1所示: 圖1 用最鄰近插值法放大4倍后的圖如圖2所示: 圖2 (2)雙線性內(nèi)插值法: 在雙線性內(nèi)插值法中,對(duì)于一個(gè)目的像素,設(shè)置坐標(biāo)通過反向變換得到的浮點(diǎn)坐標(biāo)為(i+u,j+v),其中i、j均為非負(fù)整數(shù),u、v為[0,1)區(qū)間的浮點(diǎn)數(shù),則這個(gè)像素得值 f(i+u,j+v)可由原圖像中坐標(biāo)為(i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所對(duì)應(yīng)的周圍四個(gè)像素的值決定,即: f(i+u,j+v)=(1-u)(1-v)f(i,j)+(1-u)vf(i,j+1)+ u(1-v)f(i+1,j)+ uvf(i+1,j+1)其中f(i,j)表示源圖像(i,j)處的的像素值,以此類推。 這就是雙線性內(nèi)插值法。雙線性內(nèi)插值法計(jì)算量大,但縮放后圖像質(zhì)量高,不會(huì)出現(xiàn)像素值不連續(xù)的的情況。由于雙線性插值具有低通濾波器的性質(zhì),使高頻分量受損,所以可能會(huì)使圖像輪廓在一定程度上變得模糊。 在MATLAB中,可用其自帶的函數(shù)imresize()來實(shí)現(xiàn)雙線性內(nèi)插值算法。 雙線性內(nèi)插值算法的MATLAB源代碼為: A=imread('F:lena.jpg');imshow(A); title('原圖128*128'); C=imresize(A,8,'bilinear');%雙線性插值 figure;imshow(C); title('雙線性內(nèi)插值法放大8倍1024*1024'); 程序運(yùn)行后,原圖如圖3所示: 圖3 雙線性內(nèi)插值法放大8倍后的圖如圖4所示: 圖4 (3)雙三次插值法: 雙三次插值法能夠在很大程度上克服以上兩種算法的不足,該算法計(jì)算精度高,但計(jì)算量大,它考慮一個(gè)浮點(diǎn)坐標(biāo)(i+u,j+v)周圍的16個(gè)鄰點(diǎn)。 目的像素值f(i+u,j+v)可由如下插值公式得到:f(i+u,j+v)= [A] * [B] * [C] 其中[A]=[ S(u + 1)S(u + 0)S(u2)];[C]=[ S(v + 1)S(v + 0)S(v2)];而[B]是周圍16個(gè)鄰點(diǎn)組成的4*4的矩陣;S(x)是對(duì) Sin(x*π)/x 的逼近。 在MATLAB中,可用其自帶的函數(shù)imresize()來實(shí)現(xiàn)雙三次插值算法。MATLAB源代碼為: A=imread('F:lena.jpg');%讀取原圖像 D=imresize(A,8,'bicubic');%雙三次插值放大8倍 figure; T imshow(D);title('三次卷積法放大8倍1024*1024'); MATLAB自帶雙三次插值法運(yùn)行結(jié)果如圖5所示: 圖5 也可以自己編寫雙三次插值算法MATLAB代碼如下: clc,clear; ff=imread('F:lena.jpg');%讀取圖像到ff k=8;%設(shè)置放大倍數(shù) [m,n,color]=size(ff); f=zeros(m,n);%將彩色圖像ff轉(zhuǎn)換為黑白圖像f for i=1:m for j=1:n f(i,j)=ff(i,j); end end a=f(1,:);c=f(m,:);%將待插值圖像矩陣前后各擴(kuò)展兩行兩列,共擴(kuò)展四行四列 b=[f(1,1),f(1,1),f(:,1)',f(m,1),f(m,1)];d=[f(1,n),f(1,n),f(:,n)',f(m,n),f(m,n)];a1=[a;a;f;c;c];a1'; b1=[b;b;a1';d;d];f=b1';f1=double(f); for i=1:k*m %利用雙三次插值公式對(duì)新圖象所有像素賦值 u=rem(i,k)/k;i1=floor(i/k)+2;A=[sw(1+u)sw(u)sw(1-u)sw(2-u)]; for j=1:k*n v=rem(j,k)/k;j1=floor(j/k)+2;C=[sw(1+v);sw(v);sw(1-v);sw(2-v)]; B=[f1(i1-1,j1-1)f1(i1-1,j1)f1(i1-1,j1+1)f1(i1-1,j1+2)f1(i1,j1-1)f1(i1,j1)f1(i1,j1+1)f1(i1,j1+2)f1(i1,j1-1)f1(i1+1,j1)f1(i1+1,j1+1)f1(i1+1,j1+2)f1(i1+2,j1-1)f1(i1+2,j1)f1(i1+2,j1+1)f1(i1+2,j1+2)];g1(i,j)=(A*B*C); end end g=uint8(g1);%將矩陣轉(zhuǎn)換成8位無符號(hào)整數(shù) imshow(g); title('自編雙三次插值法放大8倍圖像'); 其中子函數(shù)sw代碼如下: function A=sw(w1)w=abs(w1);if w<1&&w>=0 A=1-2*w^2+w^3;elseif w>=1&&w<2 A=4-8*w+5*w^2-w^3;else A=0;end 與MATLAB自帶函數(shù)相比,以上手工編寫的MATLAB代碼只能完成黑白圖像輸出,且運(yùn)行時(shí)間遠(yuǎn)比MATLAB自帶函數(shù)的運(yùn)行時(shí)間長(zhǎng)。手工編寫雙三次插值算法MATLAB代碼的運(yùn)行結(jié)果如圖6所示: 圖6 2,其他算法簡(jiǎn)介: 傳統(tǒng)的圖像放大方法有重復(fù)放大線性放大和高次多項(xiàng)式插值放大。重復(fù)放大最簡(jiǎn)單,但會(huì)產(chǎn)生明顯的方塊效應(yīng)線性放大消除了方塊效應(yīng),但會(huì)造成圖像的模糊 高次多項(xiàng)式插值放大效果較好,但運(yùn)算復(fù)雜。由于傳統(tǒng)方法的固有缺陷,誕生了新一代圖像放大方法,主要有小波放大、鄰域交換內(nèi)插和分形放大等。 下面簡(jiǎn)單介紹一下增強(qiáng)系數(shù)小波放大算法: 算法示意圖如圖7所示: 圖7 通過二維離散小波變換,經(jīng)分析高通濾波器和分析低通濾波器,可將一幅分辨率為p的二維圖像分解為分辨率為p/2的離散逼近信號(hào)A1和水平、垂直、對(duì)角三個(gè)細(xì)節(jié)信號(hào)H1、V1、D1。這四個(gè)分量都只有原圖像大小的1/4。之后又可以對(duì)A1進(jìn)行同樣的分解如圖7所示。這個(gè)過程可以一直重復(fù)下去。通過二維離散小波反變換,用相應(yīng)的綜合高通濾波器和綜合低通濾波器可將各分量重構(gòu)為原圖像。 對(duì)于一個(gè)圖像,低頻成分包含了基本特征,即原圖像的近似,高頻成分反應(yīng)其細(xì)節(jié)?;诖?,我們將原圖像作為低頻成分A1,其他3個(gè)細(xì)節(jié)部分置0,進(jìn)行小波重構(gòu),便可得到放大4倍的圖像。但是由于能量守恒,放大后的圖像能量分散會(huì)顯得較暗??梢詫⒃瓐D像灰度值矩陣乘2,再進(jìn)行上述變換,便可解決這一問題。小波分解重構(gòu)是一種全局運(yùn)算,不會(huì)造成重復(fù)放大中的方塊效應(yīng),同時(shí)較好地保持圖像邊緣的清晰。 ××公司目標(biāo)利潤(rùn)實(shí)現(xiàn)分析報(bào)告 2007年公司制訂的目標(biāo)利潤(rùn)值是××萬元,為了達(dá)到此目標(biāo),采取了節(jié)約生產(chǎn)成本,加大宣傳力度,制訂合理的銷售計(jì)劃等措施,順利完成了預(yù)期目標(biāo)。詳細(xì)的銷售利潤(rùn)情況表(略)。 一、利潤(rùn)情況分析 由上表可以看出,目標(biāo)銷售收入為××萬元,實(shí)際銷售額約為××萬元,超過目標(biāo)銷售額將近××萬元。預(yù)計(jì)單位產(chǎn)品成本為××元,實(shí)際銷售時(shí)的單位成本為××元,則可計(jì)算出。 (1)預(yù)期利潤(rùn)=(產(chǎn)品計(jì)劃銷售單價(jià)-預(yù)估單位產(chǎn)品成本)×產(chǎn)品計(jì)劃銷售量,約為××萬元。 (2)實(shí)際利潤(rùn)=(產(chǎn)品實(shí)際銷售單價(jià)-實(shí)際銷售單位成本)×產(chǎn)品實(shí)際銷售量,約為××萬元。由此可以看出,雖然實(shí)際銷售收入大于目標(biāo)銷售額,但實(shí)際銷售利潤(rùn)僅比目標(biāo)銷售利潤(rùn)高出××萬元,這說明在產(chǎn)品銷售工作上投入成本較高,沒有實(shí)現(xiàn)更高的利潤(rùn)收入。 二、對(duì)問題提出解決建議 針對(duì)利潤(rùn)分析得出的問題,提出以下幾點(diǎn)建議。 (1)產(chǎn)品銷售前進(jìn)行詳細(xì)的市場(chǎng)調(diào)研,根據(jù)調(diào)研信息制訂切實(shí)可行的銷售策略。 (2)加強(qiáng)成本核算管理,嚴(yán)格控制成本投入。 (3)加強(qiáng)費(fèi)用管理,嚴(yán)格控制費(fèi)用支出。 綜上所述,當(dāng)前市場(chǎng)表現(xiàn)良好,但仍有改進(jìn)空間,請(qǐng)相關(guān)部門參考。 ×××公司財(cái)務(wù)部 ××年×月×日 程序: #include lfsr(int a,int b,int c,int d,int T[]);void main(){ int A[19]={1,0,1,1,0,0,1,1,0,0,0,0,1,0,1,0,1,0,1}; int B[22]={0,0,1,0,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1};int C[23]={1,0,0,0,1,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,1,0,1};for(int i=0;i { printf(“%d”,A[18]^B[21]^C[22]); lfsr(13,16,17,18,A); lfsr(12,16,20,21,B); lfsr(17,18,21,22,C);} else if(j==1) { printf(“%d”,A[18]^B[21]^C[22]); if(A[9]==0) lfsr(13,16,17,18,A); if(B[11]==0) lfsr(12,16,20,21,B); if(C[11]==0) lfsr(17,18,21,22,C);} else if(j==2) { printf(“%d”,A[18]^B[21]^C[22]); if(A[9]==1) lfsr(13,16,17,18,A); if(B[11]==1) lfsr(12,16,20,21,B); if(C[11]==1) lfsr(17,18,21,22,C);} else if(j==3) { printf(“%d”,A[18]^B[21]^C[22]); lfsr(13,16,17,18,A); lfsr(12,16,20,21,B); lfsr(17,18,21,22,C); } } printf(“n n”);} lfsr(int a,int b,int c,int d,int T[]){ int i; for(i=d;i>0;i--) { T[i]=T[i-1]; } T[0]=T[a]^T[b]^T[c]^T[d]; return(T[0]);} 密鑰流: A[19]={1,0,1,1,0,0,1,1,0,0,0,0,1,0,1,0,1,0,1}; B[22]={0,0,1,0,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1};C[23]={1,0,0,0,1,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,1,0,1};密鑰流序列: 1111 1111 1101 1010 1101 0101 0111 0001 1110 0000 1010 1000 0101 1100 0100 0000第三篇:圖像放大算法總結(jié)及MATLAB源程序
第四篇:利潤(rùn)實(shí)現(xiàn)分析報(bào)告
第五篇:A5算法C語言實(shí)現(xiàn)報(bào)告(寫寫幫推薦)