模擬火車(chē)售票退票系統(tǒng)及圖像二維整數(shù)離散余弦變換(dct)-變換算法和dsp實(shí)現(xiàn)課程設(shè)計(jì)_第1頁(yè)
模擬火車(chē)售票退票系統(tǒng)及圖像二維整數(shù)離散余弦變換(dct)-變換算法和dsp實(shí)現(xiàn)課程設(shè)計(jì)_第2頁(yè)
模擬火車(chē)售票退票系統(tǒng)及圖像二維整數(shù)離散余弦變換(dct)-變換算法和dsp實(shí)現(xiàn)課程設(shè)計(jì)_第3頁(yè)
模擬火車(chē)售票退票系統(tǒng)及圖像二維整數(shù)離散余弦變換(dct)-變換算法和dsp實(shí)現(xiàn)課程設(shè)計(jì)_第4頁(yè)
模擬火車(chē)售票退票系統(tǒng)及圖像二維整數(shù)離散余弦變換(dct)-變換算法和dsp實(shí)現(xiàn)課程設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Java網(wǎng)絡(luò)編程報(bào)告姓名:學(xué)號(hào):題目:模擬火車(chē)售票退票系統(tǒng)一、作業(yè)要求:模擬火車(chē)售票退票系統(tǒng)實(shí)現(xiàn)一個(gè)服務(wù)器為多個(gè)客戶服務(wù),要求服務(wù)器用線程池,線程容量為4,座位數(shù)為60個(gè),即01-60號(hào)座.客戶通過(guò)網(wǎng)絡(luò)發(fā)送請(qǐng)求可以退票可以買(mǎi)票,先來(lái)先服務(wù),買(mǎi)票還是退票由隨機(jī)數(shù)決定,退票必須是該用戶買(mǎi)過(guò)的有效票,先買(mǎi)的票先退。若退票時(shí)該用戶已沒(méi)有買(mǎi)到的票,則改為買(mǎi)票。若服務(wù)器票已售完,則需等待,先來(lái)先服務(wù),哪個(gè)客戶先來(lái),服務(wù)器將先為哪個(gè)客戶服務(wù)。服務(wù)器每次接收一個(gè)客戶請(qǐng)求需打印該客戶的端口號(hào)、IP和該用戶是買(mǎi)票還是退票,處理該請(qǐng)求之前目前剩余的票所有座號(hào),處理之后剩余的座號(hào)也要打印出來(lái),并延遲一個(gè)隨機(jī)處理時(shí)間,以模擬對(duì)每個(gè)客戶處理的時(shí)間不同。將處理結(jié)果發(fā)給客戶??蛻羰盏浇Y(jié)果后打印到屏幕。注意資源共享的問(wèn)題,適當(dāng)時(shí)可用同步代碼,不允許用同步方法。注意線程之間的協(xié)作。演示時(shí)開(kāi)放4-5個(gè)用戶,并演示一次退票無(wú)效的情況(即要退的票在服務(wù)器中還沒(méi)有賣(mài)出去,要求2是正常情況)主要設(shè)計(jì)思路:1、該程序包括以下幾個(gè)類(lèi):1)、EchoClient.java2)、EchoServer.java3)、Node.java定義了線性表的一個(gè)節(jié)點(diǎn)的結(jié)構(gòu),并對(duì)節(jié)點(diǎn)進(jìn)行初始化4)、LList.java接口類(lèi),包含以下幾個(gè)方法:booleanisEmpty();//判斷線性表是否為空intlength();//返回線性表長(zhǎng)度Tget(inti);//返回第i(i>0)個(gè)元素voidinsert(inti,Tx);//插入x作為第i個(gè)元素voidinsert1(Tx); //按順序插入一個(gè)數(shù)到鏈表中Tremove(inti);//刪除第i個(gè)元素并返回被刪對(duì)象voidappend(Tx);//在線性表最后插入x元素5)、SingleLinkList.java實(shí)現(xiàn)接口LList。6)、Customer.java定義了choise,cus_tickets兩個(gè)屬性和choice()方法,其中choise是一個(gè)隨機(jī)產(chǎn)生的0或1,用來(lái)決定客戶買(mǎi)票或退票。cus_list是一個(gè)線性表,用來(lái)存儲(chǔ)客戶所買(mǎi)到的所有票。7)、Tickets.java定義了number和list兩個(gè)屬性,其中number用來(lái)表示服務(wù)器售出的票號(hào),list是一個(gè)線性表,用來(lái)存儲(chǔ)剩余火車(chē)票。包含了售票票方法sell()和退票方法return_ticket()。思路及流程圖1)、首先客戶端通過(guò)調(diào)用Customer類(lèi)的choice()方法,由choice()方法來(lái)決定客戶是買(mǎi)票還是退票。若choise==1,則客戶買(mǎi)票,若choise==0,則客戶退票。流程圖如下:客戶買(mǎi)票choice客戶買(mǎi)票choice=(int)(Math.random()*2)choise==1客戶退票票是否、若客戶買(mǎi)票,則通過(guò)輸出流將買(mǎi)票信息發(fā)送給服務(wù)器端。若客戶退票,則通過(guò)“customer.cus_list.isEmpty()”這個(gè)語(yǔ)句判斷客戶是否有票可退,若客戶有票可退,則通過(guò)輸出流將退票信息及所退票號(hào)發(fā)送給服務(wù)器端;若客戶無(wú)票可退,則改為買(mǎi)票,通過(guò)輸出流將信息發(fā)送給服務(wù)器端。流程圖如下:客戶買(mǎi)票發(fā)送買(mǎi)票信息給服務(wù)器端客戶買(mǎi)票發(fā)送買(mǎi)票信息給服務(wù)器端否是客戶退票客戶擁有的票是否為空發(fā)送退票信息給服務(wù)器端發(fā)送買(mǎi)票信息給服務(wù)器端、服務(wù)器端通過(guò)輸入流接收客戶端的信息,接收信息后,隨機(jī)產(chǎn)生一個(gè)時(shí)間,線程休眠,模擬網(wǎng)絡(luò)延遲。然后判斷客戶是買(mǎi)票還是退票,若是買(mǎi)票,則調(diào)用Tickets類(lèi)中的sell()方法進(jìn)行售票處理;若是退票,則調(diào)用Tickets類(lèi)中的return_ticket()方法進(jìn)行退票處理。流程圖如下:否是接收客戶端的信息否是接收客戶端的信息線程休眠一段時(shí)間客戶是否買(mǎi)票tickets.sell()Tickets.return_ticket()4)、若客戶是買(mǎi)票的,則通過(guò)“l(fā)ist.isEmpty()”判斷是否有票可售,若有票可售,則進(jìn)行售票處理(即將list線性表中的第一個(gè)節(jié)點(diǎn)刪除,表示此票已售出),處理后將信息反饋給客戶;客戶收到服務(wù)器端的信息后,將反饋信息打印輸出,同時(shí)將所買(mǎi)到的票添加到cus_list線性表的最后。若無(wú)票可售,則線程等待,將線程加入等待隊(duì)列,當(dāng)線程被喚醒后,進(jìn)行售票處理,處理后將信息反饋給客戶。客戶收到服務(wù)器端的信息后,輸出反饋的信息,同時(shí),將所買(mǎi)到的票添加到cus_list線性表的最后。否是否有票可售否是否有票可售售票處理是售票線程等待線程被喚醒后進(jìn)行售票處理將線程加入等待隊(duì)列將反饋信息發(fā)送到客戶端客戶收到服務(wù)器端反饋信息打印輸出信息cus_list.append()、若客戶是退票的,首先判斷客戶所退的票是否是已售出的票,若不是,則非法退票,退票失敗,將反饋信息發(fā)送給客戶端;若是,則進(jìn)行退票處理(將所要退的票按大小添加到線性表list中),退票處理后,將反饋信息發(fā)送給客戶端,然后該線程將已經(jīng)退了的票從cus_list中刪除(即cus_list.remove())。判斷是否有線程在等待隊(duì)列中,若有,則將隊(duì)列中的第一個(gè)線程喚醒,進(jìn)行售票處理,然后將反饋信息發(fā)送給客戶端。否等待隊(duì)列是否空退票否等待隊(duì)列是否空退票該票是否已售出否非法退票,退票失敗是退票處理將所退的票售給第一個(gè)等待的線程將反饋信息發(fā)送到客戶端退票是否成功打印輸出退票成功信息cus_list.remove()是輸出退票失敗信息客戶端收到服務(wù)器端的反饋信息關(guān)鍵代碼for(i=1;i<=5for(i=1;i<=500;i++){ System.out.println("客戶第"+i+"次請(qǐng)求");// msg=customer.choice(); //choice產(chǎn)生隨機(jī)數(shù)來(lái)確定客戶是買(mǎi)票還是退票 if(msg.equals("buy")) { pw.println(msg);//將客戶買(mǎi)票的信息傳給服務(wù)器 System.out.println(br.readLine()); //輸出服務(wù)器傳給客戶的買(mǎi)到票的信息 customer.cus_list.append(br.readLine());//將客戶買(mǎi)到的票放入鏈表的最后 System.out.println(customer.cus_list+"\n"); //輸出客戶所擁有的所有票,cus_list:用一個(gè)鏈表存儲(chǔ)客戶所擁有的所有票 } elseif(msg.equals("refund")) { if(!customer.cus_list.isEmpty())//若客戶所擁有的票不是空的,就退票 { pw.println(msg); //將客戶退票的信息傳給服務(wù)器 pw.println(cus_number=customer.cus_list.get(1));//獲取客戶最先買(mǎi)到的那張票,將其傳給服務(wù)器 msg=br.readLine(); //接收服務(wù)器的反饋信息 if(!msg.equals("非法退票!退票失敗!")) { System.out.println(msg); customer.cus_list.remove(1); //將客戶所退了的票從客戶所擁有的票中移除 System.out.println(customer.cus_list+"\n");//輸出客戶所擁有的所有票 } else System.out.println(msg); } else //否則,轉(zhuǎn)為買(mǎi)票 { System.out.println("客戶沒(méi)有票可退,轉(zhuǎn)為買(mǎi)票"); pw.println("buy"); //將買(mǎi)票信息傳給服務(wù)器 System.out.println(br.readLine()); //輸出服務(wù)器傳給客戶的買(mǎi)到票的信息 customer.cus_list.append(br.readLine()); //將客戶買(mǎi)到的票放入鏈表的最后 System.out.println(customer.cus_list+"\n"); //輸出客戶所擁有的所有票,cus_list:用一個(gè)鏈表存儲(chǔ)客戶所擁有的所有票 } } }publicclassEchoServer{privateintport=8001;publicclassEchoServer{privateintport=8001;privateServerSocketserverSocket;privateExecutorServiceexecutorService;//線程池privatefinalintPOOL_SIZE=4;//單個(gè)CPU時(shí)線程池中工作線程的數(shù)目List<Socket>socketList=newArrayList<Socket>();//排隊(duì)序列publicEchoServer()throwsIOException{ serverSocket=newServerSocket(port); serverSocket.setReceiveBufferSize(50);//創(chuàng)建線程池executorService=Executors.newFixedThreadPool(POOL_SIZE);System.out.println("服務(wù)器啟動(dòng)");}publicvoidservice(){while(true){Socketsocket=null;try{socket=serverSocket.accept();executorService.execute(newHandler(socket,socketList));}catch(IOExceptione){e.printStackTrace();}}}publicstaticvoidmain(Stringargs[])throwsIOException{newEchoServer().service();}}classHandlerimplementsRunnable{privateSocketsocket;privateTicketsticket=newTickets();List<Socket>socketList=newArrayList<Socket>();//排隊(duì)序列publicHandler(Socketsocket,List<Socket>socketList){this.socket=socket;this.socketList=socketList;}privatePrintWritergetWriter(Socketsocket)throwsIOException{OutputStreamsocketOut=socket.getOutputStream();returnnewPrintWriter(socketOut,true);}privateBufferedReadergetReader(Socketsocket)throwsIOException{InputStreamsocketIn=socket.getInputStream();returnnewBufferedReader(newInputStreamReader(socketIn));}publicStringecho(Stringmsg){return"echo:"+msg;}@SuppressWarnings("static-access")publicvoidrun(){try{System.out.println("Newconnectionaccepted"+socket.getInetAddress()+":"+socket.getPort());BufferedReaderbr=getReader(socket);PrintWriterpw=getWriter(socket);Stringmsg=null; Stringcus_number=null;while((msg=br.readLine())!=null){ //模擬售票的網(wǎng)絡(luò)延遲try{Thread.sleep((long)(Math.random()*3000));//產(chǎn)生一個(gè)隨機(jī)處理時(shí)間}catch(InterruptedExceptione){e.printStackTrace();} if(msg.equals("buy")){ ticket.sell(socketList,socket,pw); } elseif(msg.equals("refund")){ ticket.return_ticket(cus_number=br.readLine(),socket,socketList,pw); }}}catch(IOExceptione){e.printStackTrace();}finally{try{if(socket!=null)socket.close();}catch(IOExceptione){e.printStackTrace();}}}}publicclassTickets{publicclassTickets{ Stringnumber;//售出票的序號(hào) staticStringtickets[]={"1","2","3","4","5","6","7","8","9","10", "11","12","13","14","15","16","17","18","19","20", "21","22","23","24","25","26","27","28","29","30", "31","32","33","34","35","36","37","38","39","40", "41","42","43","44","45","46","47","48","49","50", "51","52","53","54","55","56","57","58","59","60"};staticSingleLinkList<String>list=newSingleLinkList<String>(tickets);//用list鏈表存儲(chǔ)火車(chē)票publicvoidsell(List<Socket>socketList,Socketsocket,PrintWriterpw){ synchronized(list){System.out.println(socket.getPort()+"客戶買(mǎi)票"); System.out.print("客戶買(mǎi)票前剩余火車(chē)票為:"); System.out.println(this.list);//打印還剩多少?gòu)埰笨少u(mài) if(list.isEmpty()) //若無(wú)票可售,則將線程加入等待隊(duì)列 { System.out.println("暫時(shí)無(wú)票!排隊(duì)中"); socketList.add(socket); System.out.println("客戶:"+socket.getInetAddress()+":"+socket.getPort()+",隊(duì)列長(zhǎng)度:"+socketList.toArray().length); System.out.println("等待隊(duì)列的第一個(gè)客戶為:"+socketList.get(0).getPort()+"\n"); try{ list.wait(); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } number=list.remove(1); System.out.println("票號(hào):"+number+"被隊(duì)首:"+socketList.get(0).getPort()+"預(yù)定成功\n"); socketList.remove(0); pw.println("客戶買(mǎi)到的票的票號(hào)為:"+number); //將客戶買(mǎi)到票的信息傳回給客戶 pw.println(number);//將客戶買(mǎi)到的票號(hào)傳給客戶 } else {//若符合條件進(jìn)行售票 number=list.remove(1);//每次票號(hào)最小的票售出,將已售出的票從火車(chē)票鏈表中移除 System.out.println("售出票的序號(hào)為"+number); //打印售出票的信息 System.out.print("客戶買(mǎi)票后剩余火車(chē)票為:"); System.out.println(list+"\n"); //打印售票后所剩余的火車(chē)票 pw.println("客戶買(mǎi)到的票的票號(hào)為:"+number); //將客戶買(mǎi)到票的信息傳回給客戶 pw.println(number);//將客戶買(mǎi)到的票號(hào)傳給客戶}}}publicvoidreturn_ticket(Stringcus_number,Socketsocket,List<Socket>socketList,PrintWriterpw){ //將客戶所退的票按順序添加的票號(hào)里面 synchronized(list){ inti; for(i=1;i<=list.length();i++) { if(list.get(i).equals(cus_number)) //判斷客戶所退的票是否是服務(wù)器以售出的票,若不是,則非法退票 { pw.println("非法退票!退票失敗!"); System.out.println("非法退票!退票失??!\n"); return; } } list.insert1(cus_number);//將客戶退的票按順序插入到火車(chē)票鏈表中 System.out.println(socket.getPort()+"客戶退票,所退票號(hào)為:"+cus_number); System.out.print("客戶退票后剩余火車(chē)票為:"); System.out.println(list+"\n"); pw.println("客戶退票,所退票號(hào)為:"+cus_number);//將客戶退票信息傳回給客戶 if(!socketList.isEmpty()) //退票后判斷隊(duì)列中是否有客戶在等待買(mǎi)票,若是,則將所退的票買(mǎi)給隊(duì)列中的第一個(gè)客戶 { list.notify();//喚醒線程 } }}}程序運(yùn)行截圖1)、服務(wù)器端截圖當(dāng)票已售完時(shí),客戶請(qǐng)求買(mǎi)票就將客戶加入一個(gè)等待隊(duì)列,如果有另一個(gè)客戶來(lái)退票,則將所退的票售給等待隊(duì)列中的第一個(gè)客戶。當(dāng)所非法退票情況演示:控制客戶退票號(hào)為20的票,因?yàn)?0號(hào)票還未售出,所以退票失??!2)、客戶端截圖客戶請(qǐng)求退票時(shí),客戶無(wú)票可退,轉(zhuǎn)為買(mǎi)票情況。實(shí)驗(yàn)總結(jié)通過(guò)本次實(shí)驗(yàn),掌握了ServerSocket的用法和多線程編程的的原理、還有同步代碼塊的使用、線程等待和喚醒的使用,在實(shí)驗(yàn)過(guò)程中遇到了很多不明白的問(wèn)題,通過(guò)找書(shū)、與同學(xué)討論都一一解決了。第一次實(shí)驗(yàn)的時(shí)候,基本上不知道從何處入手,但是通過(guò)慢慢的摸索和研究,一步一步地將一個(gè)個(gè)小問(wèn)題解決,才能將程序編寫(xiě)出來(lái)。在調(diào)試過(guò)程中,遇到了很多奇奇怪怪的問(wèn)題,很多時(shí)候是因?yàn)樽约旱目紤]不夠全面和邏輯出來(lái)的錯(cuò)誤所引起的,在同學(xué)的幫助下,把這些問(wèn)題都一一解決了。課程設(shè)計(jì)課程名稱(chēng)光電圖像處理綜合課程設(shè)計(jì)題目名稱(chēng)圖像二維整數(shù)離散余弦變換(DCT)變換算法和DSP實(shí)現(xiàn)目錄一、離散余弦變換……………21、概念2、離散余弦變換用于圖像處理3、量化二、流程圖……………………5三、程序中實(shí)現(xiàn)………………6四、輸出結(jié)果…………………11一、離散余弦變換1、概念離散余弦變換(DCTforDiscreteCosineTransform)是與傅里葉變換相關(guān)的一種變換,它類(lèi)似于離散傅里葉變換(DFTforDiscreteFourierTransform),但是只使用實(shí)數(shù)。離散余弦變換相當(dāng)于一個(gè)長(zhǎng)度大概是它兩倍的離散傅里葉變換,這個(gè)離散傅里葉變換是對(duì)一個(gè)實(shí)偶函數(shù)進(jìn)行的(因?yàn)橐粋€(gè)實(shí)偶函數(shù)的傅里葉變換仍然是一個(gè)實(shí)偶函數(shù)),在有些變形里面需要將輸入或者輸出的位置移動(dòng)半個(gè)單位(DCT有8種標(biāo)準(zhǔn)類(lèi)型,其中4種是常見(jiàn)的)。最常用的一種離散余弦變換的類(lèi)型是下面給出的第二種類(lèi)型,通常我們所說(shuō)的離散余弦變換指的就是這種。它的逆,也就是下面給出的第三種類(lèi)型,通常相應(yīng)的被稱(chēng)為"反離散余弦變換","逆離散余弦變換"或者"IDCT"。有兩個(gè)相關(guān)的變換,一個(gè)是離散正弦變換(DSTforDiscreteSineTransform),它相當(dāng)于一個(gè)長(zhǎng)度大概是它兩倍的實(shí)奇函數(shù)的離散傅里葉變換;另一個(gè)是改進(jìn)的離散余弦變換(MDCTforModifiedDiscreteCosineTransform),它相當(dāng)于對(duì)交疊的數(shù)據(jù)進(jìn)行離散余弦變換。離散余弦變換,尤其是它的第二種類(lèi)型,經(jīng)常被信號(hào)處理和圖像處理使用,用于對(duì)信號(hào)和圖像(包括靜止圖像和運(yùn)動(dòng)圖像)進(jìn)行有損數(shù)據(jù)壓縮。這是由于離散余弦變換具有很強(qiáng)的"能量集中"特性:大多數(shù)的自然信號(hào)(包括聲音和圖像)的能量都集中在離散余弦變換后的低頻部分,而且當(dāng)信號(hào)具有接近馬爾科夫過(guò)程(Markovprocesses)的統(tǒng)計(jì)特性時(shí),離散余弦變換的去相關(guān)性接近于K-L變換(Karhunen-Loève變換--它具有最優(yōu)的去相關(guān)性)的性能。2、離散余弦變換用于圖像處理:圖像數(shù)據(jù)一般有較強(qiáng)的相關(guān)性,若所選用的正交矢量空間的基矢量與圖像本身的主要特征相近,在該正交矢量空間中描述圖像數(shù)據(jù)則會(huì)變得更簡(jiǎn)單。經(jīng)過(guò)正交變換,會(huì)把原來(lái)分散在原空間的圖像數(shù)據(jù)在新的坐標(biāo)空間中得到集中。對(duì)于大多數(shù)圖像,大量變換系數(shù)很小,只要?jiǎng)h除接近于零的系數(shù),并且對(duì)較小的系數(shù)進(jìn)行粗量化,而保留包含圖像主要信息的系數(shù),以此進(jìn)行壓縮編碼。在重建圖像進(jìn)行解碼時(shí),所損失的將是一些不重要的信息,幾乎不會(huì)引起圖像的失真。在變換編碼中,首先要將圖像數(shù)據(jù)分割成子圖像,然后對(duì)子圖像數(shù)據(jù)塊實(shí)施某種變換,如DCT變換,那么子圖像尺寸取多少好呢?根據(jù)實(shí)踐證明子圖像尺寸取4×4、8×8、16×16適合作圖像的壓縮,這是因?yàn)椋?lt;1>如果子圖像尺寸取得太小,雖然計(jì)算速度快,實(shí)現(xiàn)簡(jiǎn)單,但壓縮能力有一定的限制。<2>如果子圖像尺寸取得太大,雖然去相關(guān)效果變好,因?yàn)橄驞FT、DCT等正弦型變換均具有漸近最佳性,但也漸趨飽和。若尺寸太大,由于圖像本身的相關(guān)性很小,反而使其壓縮效果不顯示,而且增加了計(jì)算的復(fù)雜性。8*8FDCT和IDCT的普通算法如下:其中:離散余弦變換(DiscreteCosineTranform,簡(jiǎn)稱(chēng)DCT)是一種與傅立葉變換緊密相關(guān)的數(shù)學(xué)運(yùn)算。在傅立葉級(jí)數(shù)展開(kāi)式中,如果被展開(kāi)的函數(shù)式是偶函數(shù),那么其傅立葉級(jí)數(shù)中只包含余弦項(xiàng),再將其離散化可導(dǎo)出余弦變換,因此稱(chēng)之為離散余弦變換。時(shí)間域中信號(hào)需要許多數(shù)據(jù)點(diǎn)表示;在x軸表示時(shí)間,在y軸表示幅度。信號(hào)一旦用傅立葉變換轉(zhuǎn)換到頻率域,就只需要幾點(diǎn)就可以表示這個(gè)相同的信號(hào)。如我們已經(jīng)看到的那樣,原因就是信號(hào)只含有少量的頻率成分。這允許在頻率域中只用幾個(gè)數(shù)據(jù)點(diǎn)就可以表示信號(hào),而在時(shí)間域中表示則需要大量數(shù)據(jù)點(diǎn)。這一技術(shù)可以應(yīng)用到彩色圖像上。彩色圖像有像素組成,這些像素具有RGB彩色值。每個(gè)像素都帶有x,y坐標(biāo),對(duì)每種原色使用8x8或者16x16矩陣。在灰度圖像中像素具有灰度值,它的x,y坐標(biāo)由灰色的幅度組成。為了在JPEG中壓縮灰度圖像,每個(gè)像素被翻譯為亮度或灰度值。為了壓縮RGB彩色圖像,這項(xiàng)工作必須進(jìn)行三遍,因?yàn)镴PEG分別得處理每個(gè)顏色成分,R成分第一個(gè)被壓縮,然后是G成分,最后是B成分。而一個(gè)8x8矩陣的64個(gè)值,每個(gè)值都帶有各自的x,y坐標(biāo),這樣我們就有了一個(gè)像素的三維表示法,稱(chēng)作控件表達(dá)式或空間域。通過(guò)DCT變換,空間表達(dá)式就轉(zhuǎn)化為頻譜表達(dá)式或頻率域。從而到達(dá)了數(shù)據(jù)壓縮的目的。DCT式目前最佳的圖像變換,它有很多優(yōu)點(diǎn)。DCT是正交變換,它可以將8x8圖像空間表達(dá)式轉(zhuǎn)換為頻率域,只需要用少量的數(shù)據(jù)點(diǎn)表示圖像;DCT產(chǎn)生的系數(shù)很容易被量化,因此能獲得好的塊壓縮;DCT算法的性能很好,它有快速算法,如采用快速傅立葉變換可以進(jìn)行高效的運(yùn)算,因此它在硬件和軟件中都容易實(shí)現(xiàn);而且DCT算法是對(duì)稱(chēng)的,所以利用逆DCT算法可以用來(lái)解壓縮圖像。為什么采用8x8的圖像塊,其原因是由于計(jì)算量和像素之間關(guān)系的數(shù)量,許多研究表明,在15或20個(gè)像素之后,像素間的相關(guān)性開(kāi)始下降。就是說(shuō),一列相似的像素通常會(huì)持續(xù)15到20個(gè)像素那么長(zhǎng),在此之后,像素就會(huì)改變幅度水平(或反向)。模擬圖像經(jīng)采樣后成為離散化的亮度值然后分成一個(gè)個(gè)宏塊,而一個(gè)宏塊有分成8x8大小的塊,可以用一個(gè)矩陣來(lái)表示這個(gè)塊。在這里,N=8,矩陣中元素f(i,j)表示塊中第i行、第j列像素的亮度值。把該矩陣看作一個(gè)空間域,顯然,塊中這些亮度值的大小有一定的隨機(jī)性,無(wú)序性,或者說(shuō)亮度值的分布沒(méi)有什么特征;DCT變換就是來(lái)解決這個(gè)問(wèn)題的,把這些隨機(jī)的數(shù)據(jù)變的有序,便于對(duì)數(shù)據(jù)進(jìn)行編碼壓縮。3、量化 量化過(guò)程實(shí)際上就是對(duì)DCT系數(shù)的一個(gè)優(yōu)化過(guò)程。它是利用了人眼對(duì)高頻部分不敏感的特性來(lái)實(shí)現(xiàn)數(shù)據(jù)的大幅簡(jiǎn)化。量化過(guò)程實(shí)際上是簡(jiǎn)單地把頻率領(lǐng)域上每個(gè)成份,除以一個(gè)對(duì)于該成份的常數(shù),且接著四舍五入取最接近的整數(shù)。這是整個(gè)過(guò)程中的主要有損運(yùn)算。以這個(gè)結(jié)果來(lái)說(shuō),經(jīng)常會(huì)把很多高頻率的成份四舍五入而接近0,且剩下很多會(huì)變成小的正或負(fù)數(shù)。整個(gè)量化的目的是減小非“0”系數(shù)的幅度以及增加“0”值系數(shù)的數(shù)目。量化是圖像質(zhì)量下降的最主要原因。因?yàn)槿搜蹖?duì)亮度信號(hào)比對(duì)色差信號(hào)更敏感,因此使用了兩種量化表:亮度量化值和色差量化值??傮w上來(lái)說(shuō),DCT變換實(shí)際是空間域的低通濾波器。對(duì)Y分量采用細(xì)量化,對(duì)UV采用粗量化。量化表是控制JPEG壓縮比的關(guān)鍵,這個(gè)步驟除掉了一些高頻量;另一個(gè)重要原因是所有圖片的點(diǎn)與點(diǎn)之間會(huì)有一個(gè)色彩過(guò)渡的過(guò)程,大量的圖像信息被包含在低頻率中,經(jīng)過(guò)量化處理后,在高頻率段,將出現(xiàn)大量連續(xù)的零。二、流程圖基于DCT的圖像壓縮編碼的程序?qū)崿F(xiàn)的流程圖如圖3-1所示。開(kāi)始開(kāi)始輸入圖片輸入圖片分成8*8分成8*8像素塊,DCT變換輸入量化表,對(duì)變換系數(shù)量化輸入量化表,對(duì)變換系數(shù)量化對(duì)量化系數(shù)進(jìn)行掃描對(duì)量化系數(shù)進(jìn)行掃描選擇一幅圖對(duì)其進(jìn)行不同的壓縮比變換選擇一幅圖對(duì)其進(jìn)行不同的壓縮比變換反量化反量化反反DCT變換顯示所選圖像的信噪比顯示所選圖像的信噪比結(jié)束結(jié)束圖3-1程序流程圖三、程序中實(shí)現(xiàn)/************************************************************************//*學(xué)號(hào): 姓名: *//************************************************************************/#include<stdio.h>#include<math.h>#defineN8#definePI3.1415926intf1[N][N]={ {139,144,149,153,155,155,155,155}, {144,151,153,156,159,156,156,156}, {150,155,160,163,158,156,156,156}, {159,161,162,160,160,159,159,159}, {159,160,161,162,162,155,155,155}, {161,161,161,161,160,157,157,157}, {162,162,161,163,162,157,157,157}, {162,162,161,161,163,158,158,158},};intq1[N][N]= //定義色度量化系數(shù){ {17,18,24,47,99,99,99,99}, {18,21,26,66,99,99,99,99}, {24,26,56,99,99,99,99,99}, {47,66,99,99,99,99,99,99}, {99,99,99,99,99,99,99,99}, {99,99,99,99,99,99,99,99}, {99,99,99,99,99,99,99,99}, {99,99,99,99,99,99,99,99},}; intq2[N][N]= //定義亮度量化系數(shù){ {16,11,10,16,24,40,51,61}, {12,12,14,19,26,58,60,55}, {14,13,16,24,40,57,69,56}, {14,17,22,29,51,87,80,62}, {18,22,37,56,68,109,103,77}, {24,35,55,64,81,104,113,92}, {49,64,78,87,103,121,120,101}, {72,92,95,98,112,100,103,99} };voidshowMat_d(double**matShow);voidshowMat_i(int**matShow); //顯示函數(shù),輸出為整形數(shù)據(jù)voidDCT(int**f,double**F); //經(jīng)過(guò)FDCT變換,f為輸入數(shù)據(jù),F(xiàn)為輸出數(shù)據(jù)voidIDCT(int**f,int**F); //經(jīng)過(guò)逆變換,f為輸入數(shù)據(jù),F(xiàn)為輸出數(shù)據(jù)voidquant(double**f,int**F); //量化過(guò)程,f為傳進(jìn)的DCT數(shù)據(jù),F(xiàn)為量化后的數(shù)據(jù)voidiQuant(int**f,int**F); //逆量化過(guò)程,f為量化后的數(shù)據(jù),F(xiàn)為消除了量化的數(shù)據(jù)voidmain(){ doubleF[N][N]={0}; //初始化輸出數(shù)組 intf_1[N][N]={0}; //初始化逆變換的輸出數(shù)組 intf2[N][N]={0}; //自定義輸入數(shù)組的數(shù)據(jù) intfq[N][N]={0}; //定義量化后的數(shù)組。 intfq_1[N][N]={0}; //定義經(jīng)過(guò)逆變化后的數(shù)組 inti=0,j=0; ////////////////////////////////////////////////////////////////////////// printf("輸入數(shù)據(jù)f(x,y)為:\n"); showMat_i((int**)f1); //輸出原始數(shù)據(jù) for(i=0;i<N;i++) for(j=0;j<N;j++) f1[i][j]-=128; //減128 printf("\nDCT之后,數(shù)據(jù)F(u,v)為:\n"); DCT((int**)f1,(double**)F); //DCT變換 showMat_d((double**)F); //輸出DCT數(shù)據(jù) quant((double**)F,(int**)fq); //量化 printf("\n量化后的DCT為:\n"); showMat_i((int**)fq); //輸出量化后的DCT數(shù)據(jù) iQuant((int**)fq,(int**)fq_1); //經(jīng)過(guò)逆量化處理 printf("\n逆量化后的數(shù)為:\n"); showMat_i((int**)fq_1); printf("\nIDCT之后,數(shù)據(jù)f'(x,y)為:\n"); IDCT((int**)fq_1,(int**)f_1); //IDCT變換 for(i=0;i<N;i++) for(j=0;j<N;j++) f_1[i][j]+=128; //加128 showMat_i((int**)f_1); //輸出數(shù)據(jù) //////////////////////////////////////////////////////////////////////////}voidshowMat_d(double**matShow){ inti=0; intj=0; for(i=0;i<N;i++) { for(j=0;j<N;j++) { printf("%5.1f",((*((double*)matShow+i*N+j)))); } printf("\n"); }}voidshowMat_i(int**matShow){ inti=0; intj=0; for(i=0;i<N;i++) { for(j=0;j<N;j++) { printf("%3d",((*((int*)matShow+i*N+j)))); } printf("\n"); }}voidquant(double**f,int**F){ inti=0; intj=0; doubletemp[N][N]={0.0}; for(i=0;i<N;i++) for(j=0;j<N;j++) { *((double*)temp+i*N+j)=(*((double*)f+i*N+j)/((*((int*)q2+i*N+j)))); if(((*((double*)temp+i*N+j))<0)) { *((int*)F+i*N+j)=(int)((*((double*)temp+i*N+j))-0.5); //-0.5為四舍五入取整 } else *((int*)F+i*N+j)=(int)

溫馨提示

  • 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)論