本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別涉及一種數(shù)字圖像幾何變換的處理方法及裝置。
背景技術(shù):
隨著計(jì)算機(jī)技術(shù)的發(fā)展,圖像處理技術(shù)應(yīng)用越來越廣泛。在對(duì)圖像進(jìn)行處理時(shí),會(huì)涉及圖像的翻轉(zhuǎn)、旋轉(zhuǎn)、縮放、平移等操作?,F(xiàn)有技術(shù)中,圖像的旋轉(zhuǎn)或/和翻轉(zhuǎn)操作往往使用查表法。若要在H.264碼流中實(shí)現(xiàn)圖像旋轉(zhuǎn)或/和翻轉(zhuǎn),就要求輸入H.264編碼器的數(shù)據(jù)源為已經(jīng)實(shí)現(xiàn)旋轉(zhuǎn)或/和翻轉(zhuǎn)的宏塊數(shù)據(jù)。
參閱圖1所示,待編碼的圖像數(shù)據(jù)往往以宏塊格式存儲(chǔ)在內(nèi)存中,在進(jìn)行編碼時(shí),通過總線協(xié)議(Advanced eXtensible Interface,AXI)從內(nèi)存中讀取出來,送至編碼器進(jìn)行編碼。而圖像數(shù)據(jù)在預(yù)處理階段時(shí),是以行的順序輸出的,因此輸出的圖像數(shù)據(jù)存至內(nèi)存中的過程中,要進(jìn)行行至宏塊的轉(zhuǎn)換。
現(xiàn)有技術(shù)中一般是在進(jìn)行行至宏塊的轉(zhuǎn)化的過程中完成圖像旋轉(zhuǎn)或/和翻轉(zhuǎn)的操作。若一個(gè)宏塊大小由16×16亮度像素塊組成(僅從亮度信息Y進(jìn)行說明),而行至宏塊轉(zhuǎn)化的內(nèi)部緩存往往不夠大,假設(shè)只有4行數(shù)據(jù)大小的緩存,所以,在需要進(jìn)行旋轉(zhuǎn)或/和翻轉(zhuǎn)處理時(shí),以旋轉(zhuǎn)90度為例,因旋轉(zhuǎn)90度處理后的圖像在橫、豎方向上發(fā)生了變化,因此旋轉(zhuǎn)90度后的宏塊在連續(xù)地址上只有4個(gè)有效數(shù)據(jù),也就是說,此時(shí)發(fā)起總線請(qǐng)求,其突發(fā)脈沖(即burst)長(zhǎng)度只有4個(gè)字節(jié),大大降低了訪問效率,而且,如果要增加burst長(zhǎng)度,則相應(yīng)緩存大小會(huì)急劇增加。
如果圖像需要實(shí)現(xiàn)旋轉(zhuǎn)或/和翻轉(zhuǎn)要求,在將數(shù)據(jù)寫入內(nèi)存時(shí),就需要獲取當(dāng)前數(shù)據(jù)在旋轉(zhuǎn)或/和翻轉(zhuǎn)后所從屬的宏塊坐標(biāo),并且,宏塊內(nèi)的數(shù)據(jù)也需要按 照旋轉(zhuǎn)或/和翻轉(zhuǎn)后的順序重新排列。其中,實(shí)現(xiàn)方法為,將原始圖像的像素,按照一定的地址順序,寫至內(nèi)部緩存,在數(shù)據(jù)寫至總線時(shí),按順序從緩存內(nèi)讀出,就可以達(dá)到旋轉(zhuǎn)或/和翻轉(zhuǎn)的目的。在按照一定的地址順序,寫至內(nèi)部緩存的過程中,一般是以查表法來獲取原始圖像在旋轉(zhuǎn)或/和翻轉(zhuǎn)后的宏塊坐標(biāo)和當(dāng)前數(shù)據(jù)應(yīng)寫至的緩存地址。其中,每一種旋轉(zhuǎn)或/和翻轉(zhuǎn)方式對(duì)應(yīng)一張大小為256×256的查找表,以及,一張隨圖像寬、高變化的表格用來查找宏塊坐標(biāo)。這種方法消耗的資源較大,并且隨著旋轉(zhuǎn)、翻轉(zhuǎn)方式的增加,消耗的資源也急劇增大。
綜上所述,現(xiàn)有技術(shù)中,數(shù)字圖像旋轉(zhuǎn)、翻轉(zhuǎn)一般都在圖像預(yù)處理階段進(jìn)行,在實(shí)現(xiàn)過程中,往往使用查表法,降低了總線、內(nèi)存訪問的效率,增加了帶寬消耗,也增大了功耗,硬件消耗的資源也較大,并且隨著支持的旋轉(zhuǎn)、翻轉(zhuǎn)方式的增多,消耗的資源也急劇增加。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供一種數(shù)字圖像幾何變換的處理方法及裝置,用以解決現(xiàn)有技術(shù)中數(shù)字圖像幾何變換操作降低總線、內(nèi)存訪問效率的問題。
本發(fā)明實(shí)施例提供的具體技術(shù)方案如下:
一種數(shù)字圖像幾何變換的處理方法,包括:
根據(jù)圖像的幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,確定宏塊的讀取順序,并按照所述讀取順序依次從內(nèi)存中讀取相應(yīng)的宏塊,其中,所述宏塊映射關(guān)系用于表示幾何變換后的一個(gè)宏塊的編號(hào)與該宏塊在原始圖像中的位置關(guān)系;
每讀取一個(gè)宏塊,按照所述幾何變化方式對(duì)應(yīng)的預(yù)設(shè)的地址計(jì)算方法,計(jì)算當(dāng)前讀取的宏塊內(nèi)每一個(gè)數(shù)據(jù)對(duì)應(yīng)的目標(biāo)存放地址,按照獲得的目標(biāo)存放地址將宏塊內(nèi)的每一個(gè)數(shù)據(jù)依次存入數(shù)據(jù)緩存中;
將所述數(shù)據(jù)緩存中的數(shù)據(jù)按順序讀出并發(fā)送至編碼器。
這樣,實(shí)現(xiàn)了在H.264編碼后的碼流中的圖像旋轉(zhuǎn)、翻轉(zhuǎn),在不增加總線、內(nèi)存訪問次數(shù)的基礎(chǔ)上,保障了總線、內(nèi)存的訪問效率,減少帶寬消耗及相應(yīng)的訪問功耗,并且硬件實(shí)現(xiàn)資源也較小。
較佳地,在根據(jù)圖像的幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,確定宏塊的讀取順序之前:
根據(jù)幾何變換后宏塊的編號(hào)、原始圖像中水平方向的宏塊個(gè)數(shù)以及原始圖像中垂直方向的宏塊個(gè)數(shù),確定每一種幾何變換方式對(duì)應(yīng)的宏塊映射關(guān)系;
根據(jù)將要寫入緩存的數(shù)據(jù)的編號(hào)、當(dāng)前讀取的一個(gè)宏塊在水平方向上的數(shù)據(jù)個(gè)數(shù)以及當(dāng)前讀取的一個(gè)宏塊在垂直方向上的數(shù)據(jù)個(gè)數(shù),確定每一種幾何變換方式對(duì)應(yīng)的宏塊內(nèi)數(shù)據(jù)存入緩存的地址計(jì)算方法。
較佳地,根據(jù)所述幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,確定宏塊的讀取順序,并按照所述讀取順序依次從內(nèi)存中讀取相應(yīng)的宏塊,具體包括:
根據(jù)所述幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,依次計(jì)算所述幾何變換后每一個(gè)編號(hào)的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的坐標(biāo)值;
每計(jì)算一個(gè)坐標(biāo)值,按照所計(jì)算的坐標(biāo)值所對(duì)應(yīng)的內(nèi)存地址讀取宏塊數(shù)據(jù);
其中,所述坐標(biāo)值用于表征宏塊在原始圖像宏塊陣列中的位置。
這樣,使用實(shí)時(shí)計(jì)算而非查表的方式,獲得宏塊坐標(biāo),節(jié)省資源消耗。
較佳地,根據(jù)所述幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,依次計(jì)算所述幾何變換后每一個(gè)編號(hào)的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的坐標(biāo)值,具體包括:
若所述幾何變換為水平翻轉(zhuǎn),則宏塊映射關(guān)系為以及y=W-1-(NUM%W);
若所述幾何變換為垂直翻轉(zhuǎn),則宏塊映射關(guān)系為以及y=(NUM%W);
若所述幾何變換為90°旋轉(zhuǎn),則宏塊映射關(guān)系為x=H-1-NUM%H以及
若所述幾何變換為180°旋轉(zhuǎn),則宏塊映射關(guān)系為以及y=W-1-NUM%W;
若所述幾何變換為270°旋轉(zhuǎn),則宏塊映射關(guān)系為x=NUM%H以及
若所述幾何變換為水平翻轉(zhuǎn)以及90°旋轉(zhuǎn),則宏塊映射關(guān)系為x=H-1-NUM%H以及
若所述幾何變換為垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn),則宏塊映射關(guān)系為x=NUM%H以及
其中,W表示所述原始圖像中水平方向的宏塊個(gè)數(shù),H表示所述原始圖像中垂直方向的宏塊個(gè)數(shù),NUM為幾何變換后宏塊的編號(hào),x為編號(hào)NUM的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的行坐標(biāo)值,y為編號(hào)NUM的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的列坐標(biāo)值,符號(hào)表示對(duì)符號(hào)內(nèi)的參量進(jìn)行向0方向取整操作,符號(hào)%表示取余操作;
較佳地,按照所述幾何變化方式對(duì)應(yīng)的預(yù)設(shè)的地址計(jì)算方法,計(jì)算當(dāng)前讀取的一個(gè)宏塊內(nèi)每一個(gè)數(shù)據(jù)對(duì)應(yīng)的目標(biāo)存放地址,具體包括:
若所述幾何變換方式為水平翻轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為垂直翻轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為90°旋轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為180°旋轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為270°旋轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為水平翻轉(zhuǎn)以及90°旋轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn),則地址計(jì)算方法為:
其中,w表示所述當(dāng)前讀取的一個(gè)宏塊在水平方向上的數(shù)據(jù)個(gè)數(shù),h表示所述當(dāng)前讀取的一個(gè)宏塊在垂直方向上的數(shù)據(jù)個(gè)數(shù),num表示將要寫入緩存的數(shù)據(jù)的編號(hào),D表示宏塊內(nèi)編號(hào)num的數(shù)據(jù)應(yīng)寫入緩存的地址,符號(hào)表示對(duì)符號(hào)內(nèi)的參量進(jìn)行向0方向取整操作,符號(hào)%表示取余操作。
這樣,使用實(shí)時(shí)計(jì)算,而非查表的方式,獲得數(shù)據(jù)應(yīng)寫至緩存的地址,很大程度上節(jié)省了資源消耗。
較佳地,對(duì)幾何變換后宏塊的編號(hào)以及將要寫入緩存的數(shù)據(jù)的編號(hào)皆執(zhí)行以下取值方式:
從0開始取值,按從左到右,從上到下的順序,依次加1。
一種數(shù)字圖像幾何變換的處理裝置,包括:
宏塊讀取單元,用于根據(jù)圖像幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,確定宏塊的讀取順序,并按照所述讀取順序依次從內(nèi)存中讀取相應(yīng)的宏塊,其中,所述宏塊映射關(guān)系用于表示幾何變換后的一個(gè)宏塊的編號(hào)與該宏塊在原始圖像中的位置關(guān)系;
數(shù)據(jù)存入單元,用于每讀取一個(gè)宏塊,按照所述幾何變化方式對(duì)應(yīng)的預(yù)設(shè)的地址計(jì)算方法,計(jì)算當(dāng)前讀取的一個(gè)宏塊內(nèi)每一個(gè)數(shù)據(jù)對(duì)應(yīng)的目標(biāo)存放地址,按照獲得的目標(biāo)存放地址將宏塊內(nèi)的每一個(gè)數(shù)據(jù)依次存入數(shù)據(jù)緩存中;
數(shù)據(jù)讀取單元,用于將所述數(shù)據(jù)緩存中的數(shù)據(jù)按順序讀出并發(fā)送至編碼器。
這樣,實(shí)現(xiàn)了在H.264編碼后的碼流中的圖像旋轉(zhuǎn)、翻轉(zhuǎn),在不增加總線、內(nèi)存訪問次數(shù)的基礎(chǔ)上,保障了總線、內(nèi)存的訪問效率,減少帶寬消耗及相應(yīng)的訪問功耗,并且硬件實(shí)現(xiàn)資源也較小。
較佳地,在根據(jù)圖像的幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,確定宏塊的讀取順序之前:
設(shè)置單元,用于根據(jù)幾何變換后宏塊的編號(hào)、原始圖像中水平方向的宏塊個(gè)數(shù)以及原始圖像中垂直方向的宏塊個(gè)數(shù),確定每一種幾何變換方式對(duì)應(yīng)的宏塊映射關(guān)系;以及,用于根據(jù)將要寫入緩存的數(shù)據(jù)的編號(hào)、當(dāng)前讀取的一個(gè)宏塊在水平方向上的數(shù)據(jù)個(gè)數(shù)以及當(dāng)前讀取的一個(gè)宏塊在垂直方向上的數(shù)據(jù)個(gè)數(shù),確定每一種幾何變換方式對(duì)應(yīng)的宏塊內(nèi)數(shù)據(jù)存入緩存的地址計(jì)算方法。
較佳地,在根據(jù)圖像幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,確定宏塊的讀取順序,并按照所述讀取順序依次從內(nèi)存中讀取相應(yīng)的宏塊時(shí),所述宏塊讀取單元具體用于:
根據(jù)所述幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,依次計(jì)算所述幾何變換后每一個(gè)編號(hào)的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的坐標(biāo)值;
每計(jì)算一個(gè)坐標(biāo)值,按照所計(jì)算的坐標(biāo)值所對(duì)應(yīng)的內(nèi)存地址讀取宏塊數(shù)據(jù);
其中,所述坐標(biāo)值用于表征宏塊在原始圖像宏塊陣列中的位置。
這樣,使用實(shí)時(shí)計(jì)算而非查表的方式,獲得宏塊坐標(biāo),節(jié)省資源消耗。
較佳地,在根據(jù)所述幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,依次計(jì)算所述幾何變換后每一個(gè)編號(hào)的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的坐標(biāo)值時(shí),所 述宏塊讀取單元具體用于:
若所述幾何變換為水平翻轉(zhuǎn),則宏塊映射關(guān)系為以及y=W-1-(NUM%W);
若所述幾何變換為垂直翻轉(zhuǎn),則宏塊映射關(guān)系為以及y=(NUM%W);
若所述幾何變換為90°旋轉(zhuǎn),則宏塊映射關(guān)系為x=H-1-NUM%H以及
若所述幾何變換為180°旋轉(zhuǎn),則宏塊映射關(guān)系為以及y=W-1-NUM%W;
若所述幾何變換為270°旋轉(zhuǎn),則宏塊映射關(guān)系為x=NUM%H以及
若所述幾何變換為水平翻轉(zhuǎn)以及90°旋轉(zhuǎn),則宏塊映射關(guān)系為x=H-1-NUM%H以及
若所述幾何變換為垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn),則宏塊映射關(guān)系為x=NUM%H以及
其中,W表示所述原始圖像中水平方向的宏塊個(gè)數(shù),H表示所述原始圖像中垂直方向的宏塊個(gè)數(shù),NUM為幾何變換后宏塊的編號(hào),x為編號(hào)NUM的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的行坐標(biāo)值,y為編號(hào)NUM的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的列坐標(biāo)值,符號(hào)表示對(duì)符號(hào)內(nèi)的參量進(jìn)行向0方向取整操作,符號(hào)%表示取余操作;
較佳地,在按照所述幾何變化方式對(duì)應(yīng)的預(yù)設(shè)的地址計(jì)算方法,計(jì)算當(dāng)前讀取的一個(gè)宏塊內(nèi)每一個(gè)數(shù)據(jù)對(duì)應(yīng)的目標(biāo)存放地址時(shí),所述數(shù)據(jù)存入單元具體 用于:
若所述幾何變換方式為水平翻轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為垂直翻轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為90°旋轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為180°旋轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為270°旋轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為水平翻轉(zhuǎn)以及90°旋轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn),則地址計(jì)算方法為:
其中,w表示所述當(dāng)前讀取的一個(gè)宏塊在水平方向上的數(shù)據(jù)個(gè)數(shù),h表示所述當(dāng)前讀取的一個(gè)宏塊在垂直方向上的數(shù)據(jù)個(gè)數(shù),num表示將要寫入緩存的數(shù)據(jù)的編號(hào),D表示宏塊內(nèi)編號(hào)num的數(shù)據(jù)應(yīng)寫入緩存的地址,符號(hào)表示對(duì)符號(hào)內(nèi)的參量進(jìn)行向0方向取整操作,符號(hào)%表示取余操作。
這樣,使用實(shí)時(shí)計(jì)算,而非查表的方式,獲得數(shù)據(jù)應(yīng)寫至緩存的地址,很大程度上節(jié)省了資源消耗。
較佳地,所述宏塊讀取單元以及所述數(shù)據(jù)存入單元對(duì)幾何變換后宏塊的編 號(hào)以及將要寫入緩存的數(shù)據(jù)的編號(hào)皆執(zhí)行以下取值方式:
從0開始取值,按從左到右,從上到下的順序,依次加1。
附圖說明
圖1為現(xiàn)有技術(shù)中處理幾何變換的系統(tǒng)結(jié)構(gòu)圖;
圖2為本發(fā)明實(shí)施例中處理幾何變換的系統(tǒng)結(jié)構(gòu)圖;
圖3為本發(fā)明實(shí)施例中處理幾何變換的流程圖;
圖4為本發(fā)明實(shí)施例中幾何變換之前的原圖像示意圖;
圖5為本發(fā)明實(shí)施例中水平翻轉(zhuǎn)后的圖像示意圖;
圖6a和6b為本發(fā)明實(shí)施例中垂直翻轉(zhuǎn)后的圖像示意圖;
圖7a和7b為本發(fā)明實(shí)施例中90°旋轉(zhuǎn)后的圖像示意圖;
圖8a和8b為本發(fā)明實(shí)施例中180°旋轉(zhuǎn)后的圖像示意圖;
圖9a和9b為本發(fā)明實(shí)施例中270°旋轉(zhuǎn)后的圖像示意圖;
圖10a和10b為本發(fā)明實(shí)施例中水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的圖像示意圖;
圖11a和11b為本發(fā)明實(shí)施例中垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的圖像示意圖;
圖12為本發(fā)明實(shí)施例中宏塊內(nèi)數(shù)據(jù)順序重新排列的操作示意圖;
圖13為本發(fā)明實(shí)施例中幾何變換模塊結(jié)構(gòu)圖。
具體實(shí)施方式
本發(fā)明實(shí)施例設(shè)計(jì)了一種數(shù)字圖像幾何變換的處理方法及裝置,在H.264編碼器前端的數(shù)據(jù)處理電路,基于宏塊結(jié)構(gòu),通過簡(jiǎn)單的計(jì)算方式而非查表方式,進(jìn)行圖像旋轉(zhuǎn)、翻轉(zhuǎn)處理,以將旋轉(zhuǎn)、翻轉(zhuǎn)處理后的宏塊數(shù)據(jù)輸入H.264編碼器中進(jìn)行編碼,從而實(shí)現(xiàn)在H.264編碼后的碼流中的圖像旋轉(zhuǎn)、翻轉(zhuǎn),在不增加總線、內(nèi)存訪問次數(shù)的基礎(chǔ)上,保障了總線、內(nèi)存的訪問效率,減少帶寬消耗及相應(yīng)的訪問功耗,并且硬件實(shí)現(xiàn)資源也較小。
需要說明的是,本發(fā)明實(shí)施例提供的數(shù)字圖像幾何變換的處理方法不局限 于H.264編碼,只要是基于宏塊結(jié)構(gòu),以塊為單位的編碼都適用,例如JPEG編碼、H265編碼等,因此,本發(fā)明實(shí)施例提供的方法對(duì)應(yīng)用場(chǎng)景不作限制。
下面結(jié)合附圖對(duì)本發(fā)明實(shí)施例優(yōu)選的實(shí)施方案作詳細(xì)說明。
參閱圖2所示,本發(fā)明實(shí)施例中,將圖像旋轉(zhuǎn)或/和翻轉(zhuǎn)的處理過程與行至宏塊的轉(zhuǎn)化過程分離開來,為方便敘述,將實(shí)現(xiàn)圖像旋轉(zhuǎn)或/和翻轉(zhuǎn)操作的數(shù)據(jù)處理電路稱為幾何變換模塊。
在預(yù)處理階段,預(yù)處理模塊只將圖像數(shù)據(jù)進(jìn)行行至宏塊的轉(zhuǎn)化,并將數(shù)據(jù)以宏塊格式存儲(chǔ)在內(nèi)存中,在預(yù)處理過程中,并不涉及圖像翻轉(zhuǎn)或/和旋轉(zhuǎn)的處理操作,因此,行至宏塊的轉(zhuǎn)化過程較為獨(dú)立,假設(shè)從亮度信息Y(即Luminance)進(jìn)行說明,那么,在內(nèi)部緩存只有4行的情況下,數(shù)據(jù)寫至總線,請(qǐng)求burst長(zhǎng)度可以達(dá)到64個(gè)字節(jié),從而避免了訪問效率過低的問題。
圖像數(shù)據(jù)在輸入H.264編碼器之前,由幾何變換模塊完成圖像旋轉(zhuǎn)或/和翻轉(zhuǎn)的操作,具體地,幾何變換模塊按照指定的旋轉(zhuǎn)翻轉(zhuǎn)方式,計(jì)算當(dāng)前需要取的宏塊在原始圖像宏塊陣列中的行、列坐標(biāo),并基于計(jì)算獲得的坐標(biāo)值,從內(nèi)存中讀取對(duì)應(yīng)的整個(gè)宏塊的數(shù)據(jù),然后,將宏塊內(nèi)的數(shù)據(jù)通過緩存的方式進(jìn)行重新排列,重新排列后,該宏塊內(nèi)數(shù)據(jù)順序?yàn)樾D(zhuǎn)或/和翻轉(zhuǎn)方式所要求的圖像數(shù)據(jù),并將該圖像數(shù)據(jù)送至H.264編碼器進(jìn)行編碼,這樣,可以通過計(jì)算方式而非查表方式獲得數(shù)據(jù)應(yīng)寫至緩存的地址,大大節(jié)省了資源消耗。
參閱圖3所示,本發(fā)明實(shí)施例中,在實(shí)現(xiàn)圖像幾何變化的過程中,幾何變換模塊具體執(zhí)行以下操作:
步驟300:根據(jù)圖像幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,確定宏塊的讀取順序,并按照讀取順序依次從內(nèi)存中讀取相應(yīng)的宏塊,其中,宏塊映射關(guān)系用于表示幾何變換后圖像某一個(gè)宏塊的編號(hào)與該宏塊在原始圖像中的位置關(guān)系。
在預(yù)處理階段,預(yù)處理模塊已將圖像數(shù)據(jù)進(jìn)行行至宏塊的轉(zhuǎn)化,并將數(shù)據(jù)以宏塊格式存儲(chǔ)在內(nèi)存中。
幾何變換模塊首先確定圖像的幾何變換方式,該幾何變換方式可包括不同角度的旋轉(zhuǎn)、不同形式的翻轉(zhuǎn)或兩者的組合,其中,每一種幾何變換方式都對(duì)應(yīng)著一種宏塊映射關(guān)系,該宏塊映射關(guān)系為幾何變換后圖像某宏塊的編號(hào)與該宏塊在原始圖像中的位置關(guān)系。
接著,幾何變換模塊需要按照一定的順序從內(nèi)存中將宏塊讀取出來,該順序是基于當(dāng)前的幾何變換方式及其宏塊映射關(guān)系確定的。
具體地,先為要取的宏塊設(shè)置編號(hào),該編號(hào)從0開始設(shè)置,從左到右,從上到下,每取一個(gè)宏塊,編號(hào)的數(shù)值加1,假設(shè)當(dāng)前圖像劃分為16×16=256個(gè)宏塊,則編號(hào)值依次設(shè)置為0、1、2、3、……、255。例如,取第一個(gè)宏塊時(shí),即取編號(hào)值為0的宏塊,根據(jù)當(dāng)前幾何變換方式對(duì)應(yīng)的宏塊映射關(guān)系,確定編號(hào)值為0的宏塊在原始圖像中的位置,即,計(jì)算編號(hào)值為0的宏塊在原始圖像宏塊陣列中的坐標(biāo),根據(jù)坐標(biāo)進(jìn)一步計(jì)算該坐標(biāo)值在內(nèi)存中對(duì)應(yīng)的地址信息,根據(jù)該地址信息在內(nèi)存中讀取相應(yīng)的宏塊。根據(jù)這種方式,可依次讀取編號(hào)為1、2、3、……、255的宏塊,即,可按照當(dāng)前幾何變換方式的要求從內(nèi)存中按順序依次將宏塊讀取出來。
步驟310:每讀取一個(gè)宏塊,按照幾何變化方式對(duì)應(yīng)的預(yù)設(shè)的地址計(jì)算方法,計(jì)算當(dāng)前讀取的一個(gè)宏塊內(nèi)每一個(gè)數(shù)據(jù)對(duì)應(yīng)的目標(biāo)存放地址,按照獲得的目標(biāo)存放地址將宏塊內(nèi)的每一個(gè)數(shù)據(jù)依次存入數(shù)據(jù)緩存中。
每一個(gè)宏塊在剛剛讀進(jìn)來的時(shí)候,宏塊內(nèi)的數(shù)據(jù)順序還是保持原來圖像的數(shù)據(jù)排列,因此,要將每一個(gè)宏塊內(nèi)的數(shù)據(jù)排列順序按照當(dāng)前幾何變換方式的要求重新排列。
每一種幾何變換方式預(yù)先設(shè)置一種對(duì)應(yīng)的地址計(jì)算方法,該地址計(jì)算方法用于計(jì)算宏塊內(nèi)每一個(gè)數(shù)據(jù)應(yīng)該存放到數(shù)據(jù)緩存中的地址(該地址可稱為目標(biāo)存放地址),幾何變換模塊每讀取一個(gè)宏塊,按順序依次計(jì)算當(dāng)前宏塊內(nèi)的數(shù)據(jù)的目標(biāo)存放地址,每計(jì)算一個(gè)數(shù)據(jù)的目標(biāo)存放地址,就按照該目標(biāo)存放地址將數(shù)據(jù)存放到數(shù)據(jù)緩存中去,按照該方法,依次將當(dāng)前所取的宏塊內(nèi)的所有數(shù) 據(jù)都按照當(dāng)前的幾何變換方式的要求對(duì)應(yīng)的進(jìn)行重新排列,存在數(shù)據(jù)緩存中的宏塊數(shù)據(jù)即是當(dāng)前幾何變換方式要求數(shù)據(jù)排列順序。
步驟320:將數(shù)據(jù)緩存中的數(shù)據(jù)按順序讀出并發(fā)送至編碼器。
在H.264碼流中實(shí)現(xiàn)圖像幾何變換,就要求輸入僅H.264編碼器的數(shù)據(jù)源已經(jīng)是幾何變換后的宏塊數(shù)據(jù),經(jīng)過步驟300和步驟310以后,將存在緩存中的數(shù)據(jù)按照地址順序讀出,就是按照幾何變換要求的宏塊數(shù)據(jù),這樣就能在H.264編碼后的碼流中實(shí)現(xiàn)當(dāng)前要求的幾何變換。
下面基于以下旋轉(zhuǎn)、翻轉(zhuǎn)兩種幾何變換方式對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)的說明。
參閱圖4所示,為一個(gè)編碼圖像的原圖像,在編碼之前要進(jìn)行幾何變換,由圖中可以看出,該圖像由多個(gè)宏塊組成,每一個(gè)宏塊由一個(gè)16×16亮度像素組成,圖中僅體現(xiàn)了亮度信息Y,除亮度信息之外,一個(gè)宏塊通常還附加一個(gè)U和一個(gè)V的色度信息來共同組成,下面僅以亮度信息為例進(jìn)行說明。
為了表示每一個(gè)宏塊在整個(gè)圖像中的位置,為每一個(gè)宏塊標(biāo)記一個(gè)坐標(biāo)(x,y),x用來表示一個(gè)宏塊在整個(gè)圖像宏塊陣列中位于第x行,y用來表示一個(gè)宏塊在整個(gè)圖像宏塊陣列中位于第y列。
假設(shè)整個(gè)圖像被分為16×16個(gè)宏塊,即整個(gè)圖像宏塊陣列的每一行有16個(gè)宏塊,每一列也有16個(gè)宏塊,宏塊坐標(biāo)的x值和y值從0開始標(biāo)記,四角為位于四個(gè)角落的四個(gè)宏塊的示意圖,用MB(Macro Block)來表示宏塊,如圖所示,左上角、右上角、左下角以及右下角四個(gè)宏塊坐標(biāo)分別為MB(0,0)、MB(0,15)、MB(15,0)以及MB(15,15)。
每一個(gè)宏塊內(nèi)又各包含一個(gè)16×16亮度像素,為方便描述,為宏塊內(nèi)的每一個(gè)數(shù)據(jù)記錄一個(gè)其在宏塊內(nèi)的位置信息,如圖4所示,以左上角宏塊為例,共16行、16列數(shù)據(jù),行和列數(shù)據(jù)都是從0開始計(jì),第0行的數(shù)據(jù)記錄為00_00、00_01、……、00_15,其中,00_00表示數(shù)據(jù)位于宏塊內(nèi)第0行第0列,00_01表示數(shù)據(jù)位于宏塊內(nèi)第0行第1列,……00_15表示數(shù)據(jù)位于宏塊內(nèi)第0行第 15列;第15行的數(shù)據(jù)記錄為15_00、15_01、……、15_15,其中,15_00表示數(shù)據(jù)位于宏塊內(nèi)第15行第0列,15_01表示數(shù)據(jù)位于宏塊內(nèi)第15行第1列,……,15_15表示數(shù)據(jù)位于宏塊內(nèi)第15行第15列。
假設(shè)沒有要求對(duì)該圖像進(jìn)行幾何變換,則將圖像數(shù)據(jù)從內(nèi)存中輸出,輸入到編碼器時(shí),輸入宏塊的順序?yàn)閺淖蟮接遥瑥纳系较?,即先輸入?宏塊行的宏塊,第0行的輸入順序?yàn)镸B(0,0)、MB(0,1)、MB(0,2)、……、MB(0,15),再依次輸入第1宏塊行的宏塊、第2宏塊行的宏塊、……、第15宏塊行的宏塊,輸入第i宏塊行的宏塊的順序?yàn)镸B(i,0)、MB(i,1)、MB(i,2)、……、MB(i,15)。
假設(shè)對(duì)該圖像進(jìn)行以下幾種幾何變換,則針對(duì)不同的幾何變換方式,幾何變換模塊分別執(zhí)行不同的操作。下面分別進(jìn)行說明。
一、水平翻轉(zhuǎn)
幾何變換模塊根據(jù)該幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,依次計(jì)算該幾何變換后每一個(gè)編號(hào)的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的坐標(biāo)值;
每計(jì)算一個(gè)坐標(biāo)值,按照這一個(gè)坐標(biāo)值所對(duì)應(yīng)的內(nèi)存地址獲取宏塊數(shù)據(jù),并將獲得的宏塊數(shù)據(jù)存儲(chǔ)至內(nèi)部緩存中;
其中,該坐標(biāo)值用于表征宏塊在原始圖像宏塊陣列中的位置。
具體地,幾何變換模塊從內(nèi)存中將宏塊按照一定的順序讀取出來。參閱圖5所示,為圖4所示的原圖像水平翻轉(zhuǎn)后的圖像,可以看出,由于水平翻轉(zhuǎn)后的圖像,對(duì)于宏塊陣列中的每一個(gè)宏塊行,宏塊的先后順序正好跟原來圖像宏塊的先后順序相反,即,原來第i宏塊行的宏塊順序?yàn)镸B(i,0)、MB(i,1)、MB(i,2)、……、MB(i,15),水平翻轉(zhuǎn)后的宏塊順序變?yōu)镸B(i,15)、MB(i,14)、MB(i,13)、……、MB(i,0)。因此,幾何變換模塊就要按照水平翻轉(zhuǎn)后的宏塊順序從內(nèi)存中將宏塊依次讀取出來。
從圖5中還可以看出,經(jīng)過水平翻轉(zhuǎn)后的每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序也發(fā)生了變化,宏塊內(nèi)每一行的數(shù)據(jù)先后順序也正好跟原來的圖像宏塊內(nèi)數(shù)據(jù)先后順 序相反,宏塊內(nèi)的數(shù)據(jù)順序變化規(guī)律與宏塊陣列的變化規(guī)律完全一致。
例如,原來圖像在宏塊陣列中左上角的宏塊(即MB(0,0))在水平翻轉(zhuǎn)后移到了的右上角,且這個(gè)MB(0,0)宏塊內(nèi)的數(shù)據(jù)順序發(fā)生了變化,第0行的數(shù)據(jù)從左至右的順序?yàn)?0_15,00_14,……,00_01,00_00。
由于每一個(gè)宏塊剛從內(nèi)存中讀取出來時(shí),宏塊內(nèi)的數(shù)據(jù)順序還是原來圖像宏塊內(nèi)的數(shù)據(jù)順序,因此幾何變換模塊需要將每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序按照水平翻轉(zhuǎn)后的數(shù)據(jù)順序進(jìn)行重新排列。
對(duì)于宏塊的讀取順序的確定,可以建立宏塊映射關(guān)系,該宏塊映射關(guān)系用于表示當(dāng)前要取的宏塊編號(hào)與在原始圖像中的位置坐標(biāo)之間的關(guān)聯(lián)關(guān)系。
對(duì)水平翻轉(zhuǎn)來說,宏塊映射關(guān)系可以由式[1]和式[2]計(jì)算。
y=W-1-(NUM%W) [2]
其中,W為原始圖像宏塊陣列中一行的宏塊個(gè)數(shù),NUM為水平翻轉(zhuǎn)后的圖像宏塊的編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1個(gè),符號(hào)表示向0方向取整,符號(hào)%表示取余。
計(jì)算所得的x值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊行坐標(biāo),計(jì)算所得的y值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊列坐標(biāo)。
例如,取水平翻轉(zhuǎn)后的第1個(gè)宏塊(即編號(hào)為0的宏塊),計(jì)算該編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)值,代入W為16,NUM為0,則x為0,y為15,即編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)為(0,15),幾何變換模塊從內(nèi)存中取第0宏塊行、第15宏塊列的宏塊作為第1個(gè)宏塊。
又例如,取水平翻轉(zhuǎn)后的第4個(gè)宏塊(即編號(hào)為3的宏塊),計(jì)算該編號(hào)為3的宏塊在原始圖像宏塊陣列中的坐標(biāo)值,代入W為16,NUM為3,則x為0,y為12,即編號(hào)為3的宏塊在原始圖像宏塊陣列中的坐標(biāo)為(0,12),幾何變換模塊從內(nèi)存中取第0宏塊行、第12宏塊列的宏塊作為第4個(gè)宏塊。
又例如,取水平翻轉(zhuǎn)后的第21個(gè)宏塊(即編號(hào)為20的宏塊),計(jì)算該編號(hào)為20的宏塊在原始圖像宏塊陣列中的坐標(biāo)值,代入W為16,NUM為20,則x為1,y為11,即編號(hào)為20的宏塊在原始圖像中的坐標(biāo)為(1,11),幾何變換模塊從內(nèi)存中取第1宏塊行、第11宏塊列的宏塊作為第21個(gè)宏塊。
以此方法,可以計(jì)算水平翻轉(zhuǎn)后每一個(gè)編號(hào)的宏塊在原來圖像中的位置坐標(biāo),根據(jù)計(jì)算所得的每一個(gè)坐標(biāo),按順序依次讀取宏塊,生成水平翻轉(zhuǎn)后的宏塊陣列。
接著,幾何變換模塊將讀進(jìn)來的每一個(gè)宏塊內(nèi)的數(shù)據(jù)進(jìn)行重新排列操作,在重新排列操作過程中,對(duì)一個(gè)宏塊內(nèi)的每一個(gè)數(shù)據(jù)建立編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1,按照編號(hào)順序,計(jì)算每一個(gè)數(shù)據(jù)應(yīng)該寫入緩存的地址,按照計(jì)算所得的地址將每一個(gè)數(shù)據(jù)依次寫入緩存中。
其中,對(duì)于重新排列順序的確定,可以預(yù)設(shè)一種地址計(jì)算方法,該地址計(jì)算方法用于計(jì)算數(shù)據(jù)編號(hào)與寫入緩存的地址之間的關(guān)聯(lián)關(guān)系。
對(duì)于水平翻轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)重新排列的地址計(jì)算方法如式[3]所示。
w表示宏塊的寬度,即一個(gè)宏塊內(nèi)一行的數(shù)據(jù)個(gè)數(shù),num為當(dāng)前要寫入緩存的數(shù)據(jù)的編號(hào),D表示數(shù)據(jù)應(yīng)寫入緩存的地址,符號(hào)表示向0方向取整,符號(hào)%表示取余。對(duì)于亮度信息Y來說,w和h都為16,對(duì)于色度信息U和V來說,w和h都為8。
其中,計(jì)算獲得的地址的值表征數(shù)據(jù)在調(diào)整后宏塊內(nèi)的位置,也可以理解為,將宏塊內(nèi)的數(shù)據(jù)按水平翻轉(zhuǎn)的要求寫入緩存后,每一個(gè)數(shù)據(jù)對(duì)應(yīng)一個(gè)編號(hào),編號(hào)的方式還是從0開始,從左到右,從上到下,依次遞增1,計(jì)算獲得的地址的值為13,則表示該數(shù)據(jù)在水平翻轉(zhuǎn)后宏塊內(nèi)的編號(hào)為13。
例如,計(jì)算第一個(gè)數(shù)據(jù)(即編號(hào)為0)應(yīng)寫入緩存的地址,應(yīng)用式[3]代入w=16,num=0,計(jì)算可得地址為15,即,編號(hào)為0的數(shù)據(jù)水平翻轉(zhuǎn)后的宏塊 內(nèi)的編號(hào)為15,也就是在MB(0,0)第一行的最后一個(gè)位置。
又例如,計(jì)算第18個(gè)數(shù)據(jù)(即編號(hào)為17)應(yīng)寫入緩存的地址,應(yīng)用式[3]代入w=16,num=17,計(jì)算可得地址為30,即,編號(hào)為17的數(shù)據(jù)水平翻轉(zhuǎn)后的宏塊內(nèi)的編號(hào)為30,也就是在MB(0,0)第二行的倒數(shù)第二個(gè)位置。
于此,可根據(jù)該地址計(jì)算方法將轉(zhuǎn)換前宏塊內(nèi)的數(shù)據(jù)依次寫入緩存中對(duì)應(yīng)位置,寫入緩存后的數(shù)據(jù)順序符合水平翻轉(zhuǎn)要求的宏塊內(nèi)數(shù)據(jù)順序。
以上以水平翻轉(zhuǎn)操作為例進(jìn)行了說明,其他幾何變換的操作與水平翻轉(zhuǎn)類似,同樣是根據(jù)宏塊映射關(guān)系按一定順序從內(nèi)存中讀取宏塊,接著將讀取的宏塊內(nèi)數(shù)據(jù)順序按照地址計(jì)算方法進(jìn)行重新排列。其他幾何變換的宏塊映射關(guān)系與地址計(jì)算方法與水平翻轉(zhuǎn)不同,下面對(duì)其他的幾何變換根據(jù)宏塊映射關(guān)系以及地址計(jì)算方法進(jìn)行的操作進(jìn)行說明。
二、垂直翻轉(zhuǎn)
參閱圖6a所示,為圖4所示的原圖像垂直翻轉(zhuǎn)后的圖像,可以看出,垂直翻轉(zhuǎn)以后的圖像,宏塊陣列中的宏塊順序都發(fā)生了變化,例如,原圖像左上宏塊MB(0,0)移到了左下角,并且,經(jīng)過垂直翻轉(zhuǎn)后每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序也發(fā)生了變化,如圖6b所示,為圖4所示的原圖像左上角的宏塊內(nèi)數(shù)據(jù)經(jīng)過垂直翻轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)順序,第0行的數(shù)據(jù)從左至右的順序?yàn)?5_00,15_01,……,15_14,15_15。
幾何變換模塊按照垂直翻轉(zhuǎn)后宏塊順序的要求,從內(nèi)存中依次將宏塊讀取出來,同樣,宏塊在剛剛讀取進(jìn)來的時(shí)候,宏塊內(nèi)的數(shù)據(jù)順序還是原來圖像宏塊內(nèi)的數(shù)據(jù)順序,幾何變換模塊接著將每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序按照垂直翻轉(zhuǎn)后的數(shù)據(jù)順序進(jìn)行重新排列。
其中,對(duì)于宏塊的讀取順序的確定,同樣也建立宏塊映射關(guān)系,對(duì)垂直翻轉(zhuǎn)來說,宏塊映射關(guān)系可以由式[4]和式[5]計(jì)算。
y=(NUM%W) [5]
其中,H為原始圖像宏塊陣列中一列的宏塊個(gè)數(shù),NUM為水平翻轉(zhuǎn)后的圖像宏塊的編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1個(gè),符號(hào)表示向0方向取整,符號(hào)%表示取余。
計(jì)算所得的x值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊行坐標(biāo),計(jì)算所得的y值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊列坐標(biāo)。
例如,取垂直翻轉(zhuǎn)后的第1個(gè)宏塊(即編號(hào)為0的宏塊),計(jì)算該編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)值,代入W為16,NUM為0,則x為15,y為0,即編號(hào)為0的宏塊在原始圖像中的坐標(biāo)為(15,0),幾何變換模塊從內(nèi)存中取第15宏塊行、第0宏塊列的宏塊作為第1個(gè)宏塊。
以此方法,可以計(jì)算垂直翻轉(zhuǎn)后每一個(gè)編號(hào)的宏塊在原來圖像宏塊陣列中的位置坐標(biāo),根據(jù)計(jì)算所得的每一個(gè)坐標(biāo),按順序依次讀取宏塊,生成垂直翻轉(zhuǎn)后的宏塊陣列。
接著,幾何變換模塊將讀進(jìn)來的每一個(gè)宏塊內(nèi)的數(shù)據(jù)進(jìn)行重新排列操作,在重新排列操作過程中,對(duì)一個(gè)宏塊內(nèi)的每一個(gè)數(shù)據(jù)建立編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1,按照編號(hào)順序,計(jì)算每一個(gè)數(shù)據(jù)應(yīng)該寫入緩存的地址,按照計(jì)算所得的地址將每一個(gè)數(shù)據(jù)依次寫入緩存中。
其中,對(duì)于重新排列順序的確定,同樣可以預(yù)設(shè)一種地址計(jì)算方法,該地址計(jì)算方法用于計(jì)算數(shù)據(jù)編號(hào)與寫入緩存的地址之間的關(guān)聯(lián)關(guān)系。
對(duì)于垂直翻轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)重新排列的地址計(jì)算方法如式[6]所示
其中,w表示宏塊的寬度,即一個(gè)宏塊內(nèi)一行的數(shù)據(jù)個(gè)數(shù),h表示宏塊的高度,即一個(gè)宏塊內(nèi)一列的數(shù)據(jù)個(gè)數(shù),num為當(dāng)前要寫入緩存的數(shù)據(jù)的編號(hào),D表示數(shù)據(jù)應(yīng)寫入緩存的地址,符號(hào)表示向0方向取整,符號(hào)%表示取余。
對(duì)于亮度信息Y來說,w和h都為16,對(duì)于色度信息U和V來說,w和 h都為8。
于此,可根據(jù)該地址計(jì)算方法將轉(zhuǎn)換前宏塊內(nèi)的數(shù)據(jù)依次寫入緩存中對(duì)應(yīng)位置,寫入緩存后數(shù)據(jù)順序符合垂直翻轉(zhuǎn)要求的宏塊內(nèi)數(shù)據(jù)順序。
三、90°旋轉(zhuǎn)
參閱圖7a所示,為圖4所示的原圖像垂直翻轉(zhuǎn)后的圖像,可以看出,90°旋轉(zhuǎn)以后的圖像,宏塊陣列中的宏塊順序都發(fā)生了變化,例如,原圖像左上宏塊MB(0,0)移到了右上角,并且,經(jīng)過90°旋轉(zhuǎn)后每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序也發(fā)生了變化,如圖7b所示,為圖4所示的原圖像左上角的宏塊內(nèi)數(shù)據(jù)經(jīng)過90°旋轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)順序,第0行的數(shù)據(jù)從左至右的順序?yàn)?5_00,14_00,……,01_00,00_00。
幾何變換模塊按照90°旋轉(zhuǎn)后宏塊順序的要求,從內(nèi)存中依次將宏塊讀取出來,同樣,宏塊在剛剛讀取進(jìn)來的時(shí)候,宏塊內(nèi)的數(shù)據(jù)順序還是原來圖像宏塊內(nèi)的數(shù)據(jù)順序,幾何變換模塊接著將每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序按照90°旋轉(zhuǎn)后的數(shù)據(jù)順序進(jìn)行重新排列。
其中,對(duì)于宏塊的讀取順序的確定,同樣也建立宏塊映射關(guān)系,對(duì)90°旋轉(zhuǎn)來說,宏塊映射關(guān)系可以由式[7]和式[8]計(jì)算。
x=H-1-NUM%H [7]
其中,H為圖像宏塊陣列中一列的宏塊個(gè)數(shù),NUM為水平翻轉(zhuǎn)后的圖像宏塊的編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1個(gè),符號(hào)表示向0方向取整,符號(hào)%表示取余。
計(jì)算所得的x值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊行坐標(biāo),計(jì)算所得的y值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊列坐標(biāo)。
例如,取90°旋轉(zhuǎn)后的第1個(gè)宏塊(即編號(hào)為0的宏塊),計(jì)算該編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)值,代入H為16,NUM為0,則x為 15,y為0,即編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)為(15,0),幾何變換模塊從內(nèi)存中取第15宏塊行、第0宏塊列的宏塊(即原圖像宏塊陣列中最后一行第一列的宏塊)作為第1個(gè)宏塊。
以此方法,可以計(jì)算90°旋轉(zhuǎn)后每一個(gè)編號(hào)的宏塊在原來圖像宏塊陣列中的位置坐標(biāo),根據(jù)計(jì)算所得的每一個(gè)坐標(biāo),按順序依次讀取宏塊,生成90°旋轉(zhuǎn)后的宏塊陣列。
接著,幾何變換模塊將讀進(jìn)來的每一個(gè)宏塊內(nèi)的數(shù)據(jù)進(jìn)行重新排列操作,在重新排列操作過程中,對(duì)一個(gè)宏塊內(nèi)的每一個(gè)數(shù)據(jù)建立編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1,按照編號(hào)順序,計(jì)算每一個(gè)數(shù)據(jù)應(yīng)該寫入緩存的地址,按照計(jì)算所得的地址將每一個(gè)數(shù)據(jù)依次寫入緩存中。
其中,對(duì)于重新排列順序的確定,同樣可以預(yù)設(shè)一種地址計(jì)算方法,該地址計(jì)算方法用于計(jì)算數(shù)據(jù)編號(hào)與寫入緩存的地址之間的關(guān)聯(lián)關(guān)系。
對(duì)于90°旋轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)重新排列的地址計(jì)算方法如式[9]所示
其中,w表示宏塊的寬度,即一個(gè)宏塊內(nèi)一行的數(shù)據(jù)個(gè)數(shù),h表示宏塊的高度,即一個(gè)宏塊內(nèi)一列的數(shù)據(jù)個(gè)數(shù),num為當(dāng)前要寫入緩存的數(shù)據(jù)的編號(hào),D表示數(shù)據(jù)應(yīng)寫入緩存的地址,符號(hào)表示向0方向取整,符號(hào)%表示取余。
對(duì)于亮度信息Y來說,w和h都為16,對(duì)于色度信息U和V來說,w和h都為8。
于此,可根據(jù)該地址計(jì)算方法將轉(zhuǎn)換前宏塊內(nèi)的數(shù)據(jù)依次寫入緩存中對(duì)應(yīng)位置,寫入緩存后數(shù)據(jù)順序符合90°旋轉(zhuǎn)要求的宏塊內(nèi)數(shù)據(jù)順序。
四、180°旋轉(zhuǎn)
參閱圖8a所示,為圖4所示的原圖像經(jīng)180°旋轉(zhuǎn)后的圖像,可以看出,180°旋轉(zhuǎn)以后的圖像,宏塊陣列中的宏塊順序都發(fā)生了變化,例如,原圖像左上宏塊MB(0,0)移到了右下角,并且,經(jīng)過180°旋轉(zhuǎn)后每一個(gè)宏塊內(nèi) 的數(shù)據(jù)順序也發(fā)生了變化,如圖8b所示,為圖4所示的原圖像左上角的宏塊內(nèi)數(shù)據(jù)經(jīng)過180°旋轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)順序,第0行的數(shù)據(jù)從左至右的順序?yàn)?5_15,15_14,……,15_01,15_00。
幾何變換模塊按照180°旋轉(zhuǎn)后宏塊順序的要求,從內(nèi)存中依次將宏塊讀取出來,同樣,宏塊在剛剛讀取進(jìn)來的時(shí)候,宏塊內(nèi)的數(shù)據(jù)順序還是原來圖像宏塊內(nèi)的數(shù)據(jù)順序,幾何變換模塊接著將每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序按照180°旋轉(zhuǎn)后的數(shù)據(jù)順序進(jìn)行重新排列。
其中,對(duì)于宏塊的讀取順序的確定,同樣也建立宏塊映射關(guān)系,對(duì)180°旋轉(zhuǎn)來說,宏塊映射關(guān)系可以由式[10]和式[11]計(jì)算。
y=W-1-NUM%W [11]
其中,W為原始圖像宏塊陣列中一行的宏塊個(gè)數(shù),H為原始圖像宏塊陣列中一列的宏塊個(gè)數(shù),NUM為180°旋轉(zhuǎn)后的圖像宏塊的編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1個(gè),符號(hào)表示向0方向取整,符號(hào)%表示取余。
計(jì)算所得的x值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊行坐標(biāo),計(jì)算所得的y值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊列坐標(biāo)。
例如,取180°旋轉(zhuǎn)后的第1個(gè)宏塊(即編號(hào)為0的宏塊),計(jì)算該編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)值,代入H為16,W為16,NUM為0,則x為15,y為15,即編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)為(15,15),幾何變換模塊從內(nèi)存中取第15宏塊行、第15宏塊列的宏塊(即原圖像宏塊陣列最后一行最后一列的宏塊)作為第1個(gè)宏塊。
以此方法,可以計(jì)算180°旋轉(zhuǎn)后每一個(gè)編號(hào)的宏塊在原來圖像宏塊陣列中的位置坐標(biāo),根據(jù)計(jì)算所得的每一個(gè)坐標(biāo),按順序依次讀取宏塊,生成180°旋轉(zhuǎn)后的宏塊陣列。
接著,幾何變換模塊將讀進(jìn)來的每一個(gè)宏塊內(nèi)的數(shù)據(jù)進(jìn)行重新排列操作,在重新排列操作過程中,對(duì)一個(gè)宏塊內(nèi)的每一個(gè)數(shù)據(jù)建立編號(hào),編號(hào)從0開始,從左到右從上到下,依次遞增1,按照編號(hào)順序,計(jì)算每一個(gè)數(shù)據(jù)應(yīng)該寫入緩存的地址,按照計(jì)算所得的地址將每一個(gè)數(shù)據(jù)依次寫入緩存中。
其中,對(duì)于重新排列順序的確定,同樣可以預(yù)設(shè)一種地址計(jì)算方法,該地址計(jì)算方法用于計(jì)算數(shù)據(jù)編號(hào)與寫入緩存的地址之間的關(guān)聯(lián)關(guān)系。
對(duì)于180°旋轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)重新排列的地址計(jì)算方法如式[12]所示。
其中,w表示宏塊的寬度,即一個(gè)宏塊內(nèi)一行的數(shù)據(jù)個(gè)數(shù),h表示宏塊的高度,即一個(gè)宏塊內(nèi)一列的數(shù)據(jù)個(gè)數(shù),num為當(dāng)前要寫入緩存的數(shù)據(jù)的編號(hào),D表示數(shù)據(jù)應(yīng)寫入緩存的地址,符號(hào)表示向0方向上取整,符號(hào)%表示取余。
對(duì)于亮度信息Y來說,w和h都為16,對(duì)于色度信息U和V來說,w和h都為8。
于此,可根據(jù)該地址計(jì)算方法將轉(zhuǎn)換前宏塊內(nèi)的數(shù)據(jù)依次寫入緩存中對(duì)應(yīng)位置,寫入緩存后的數(shù)據(jù)順序符合180°旋轉(zhuǎn)要求的宏塊內(nèi)數(shù)據(jù)順序。
五、270°旋轉(zhuǎn)
參閱圖9a所示,為圖4所示的原圖像經(jīng)270°旋轉(zhuǎn)后的圖像,可以看出,270°旋轉(zhuǎn)以后的圖像,宏塊陣列中的宏塊順序都發(fā)生了變化,例如,原圖像左上宏塊MB(0,0)移到了左下角,并且,經(jīng)過180°旋轉(zhuǎn)后每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序也發(fā)生了變化,如圖9b所示,為圖4所示的原圖像左上角的宏塊內(nèi)數(shù)據(jù)經(jīng)過270°旋轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)順序,第0行的數(shù)據(jù)從左至右的順序?yàn)?0_15,01_15,……,14_15,15_15。
幾何變換模塊按照270°旋轉(zhuǎn)后宏塊順序的要求,從內(nèi)存中依次將宏塊讀取出來,同樣,宏塊在剛剛讀取進(jìn)來的時(shí)候,宏塊內(nèi)的數(shù)據(jù)順序還是原來圖像宏塊內(nèi)的數(shù)據(jù)順序,幾何變換模塊接著將每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序按照270° 旋轉(zhuǎn)后的數(shù)據(jù)順序進(jìn)行重新排列。
其中,對(duì)于宏塊的讀取順序的確定,同樣也建立宏塊映射關(guān)系,對(duì)270°旋轉(zhuǎn)來說,宏塊映射關(guān)系可以由式[13]和式[14]計(jì)算。
x=NUM%H [13]
其中,W為原始圖像宏塊陣列中一行的宏塊個(gè)數(shù),H為原始圖像宏塊陣列中一列的宏塊個(gè)數(shù),NUM為水平翻轉(zhuǎn)后的圖像宏塊的編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1個(gè),符號(hào)表示向0方向取整,符號(hào)%表示取余。
計(jì)算所得的x值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊行坐標(biāo),計(jì)算所得的y值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊列坐標(biāo)。
例如,取270°旋轉(zhuǎn)后的第1個(gè)宏塊(即編號(hào)為0的宏塊),計(jì)算該編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)值,代入H為16,W為16,NUM為0,則x為0,y為15,即編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)為(0,15),幾何變換模塊從內(nèi)存中取第0宏塊行、第15宏塊列的宏塊作為第1個(gè)宏塊。
以此方法,可以計(jì)算270°旋轉(zhuǎn)后每一個(gè)編號(hào)的宏塊在原來圖像宏塊陣列中的位置坐標(biāo),根據(jù)計(jì)算所得的每一個(gè)坐標(biāo),按順序依次讀取宏塊,生成270°旋轉(zhuǎn)后的宏塊陣列。
接著,幾何變換模塊將讀進(jìn)來的每一個(gè)宏塊內(nèi)的數(shù)據(jù)進(jìn)行重新排列操作,在重新排列操作過程中,對(duì)一個(gè)宏塊內(nèi)的每一個(gè)數(shù)據(jù)建立編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1,按照編號(hào)順序,計(jì)算每一個(gè)數(shù)據(jù)應(yīng)該寫入緩存的地址,按照計(jì)算所得的地址將每一個(gè)數(shù)據(jù)依次寫入緩存中。
其中,對(duì)于重新排列順序的確定,同樣可以預(yù)設(shè)一種地址計(jì)算方法,該地址計(jì)算方法用于計(jì)算數(shù)據(jù)編號(hào)與寫入緩存的地址之間的關(guān)聯(lián)關(guān)系。
對(duì)于270°旋轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)重新排列的地址計(jì)算方法如式[15]所示。
其中,w表示宏塊的寬度,即一個(gè)宏塊內(nèi)一行的數(shù)據(jù)個(gè)數(shù),h表示宏塊的高度,即一個(gè)宏塊內(nèi)一列的數(shù)據(jù)個(gè)數(shù),num為當(dāng)前要寫入緩存的數(shù)據(jù)的編號(hào),D表示數(shù)據(jù)應(yīng)寫入緩存的地址,符號(hào)表示向0方向取整,符號(hào)%表示取余。
對(duì)于亮度信息Y來說,w和h都為16,對(duì)于色度信息U和V來說,w和h都為8。
于此,可根據(jù)該地址計(jì)算方法將轉(zhuǎn)換前宏塊內(nèi)的數(shù)據(jù)依次寫入緩存中對(duì)應(yīng)位置,寫入緩存后的數(shù)據(jù)順序符合270°旋轉(zhuǎn)要求的宏塊內(nèi)數(shù)據(jù)順序。
六、水平翻轉(zhuǎn)+90°旋轉(zhuǎn)
參閱圖10a所示,為圖4所示的原圖像經(jīng)水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的圖像,可以看出,水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)以后的圖像,宏塊陣列中的宏塊順序都發(fā)生了變化,例如,原圖像左上宏塊MB(0,0)移到了右下角,并且,經(jīng)過水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)后每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序也發(fā)生了變化,如圖10b所示,為圖4所示的原圖像左上角的宏塊內(nèi)數(shù)據(jù)經(jīng)過水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)順序,第0行的數(shù)據(jù)從左至右的順序?yàn)?5_15,14_15,……,01_15,00_15。
幾何變換模塊按照水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)后宏塊順序的要求,從內(nèi)存中依次將宏塊讀取出來,同樣,宏塊在剛剛讀取進(jìn)來的時(shí)候,宏塊內(nèi)的數(shù)據(jù)順序還是原來圖像宏塊內(nèi)的數(shù)據(jù)順序,幾何變換模塊接著將每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序按照水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的數(shù)據(jù)順序進(jìn)行重新排列。
其中,對(duì)于宏塊的讀取順序的確定,同樣也建立宏塊映射關(guān)系,對(duì)水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)來說,宏塊映射關(guān)系可以由式[16]和式[17]計(jì)算。
x=H-1-NUM%H [16]
其中,W為原始圖像宏塊陣列中一行的宏塊個(gè)數(shù),H為原始圖像宏塊陣列 中一列的宏塊個(gè)數(shù),NUM為水平翻轉(zhuǎn)后的圖像宏塊的編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1個(gè),符號(hào)表示向0方向取整,符號(hào)%表示取余。
計(jì)算所得的x值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊行坐標(biāo),計(jì)算所得的y值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊列坐標(biāo)。
例如,取水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的第1個(gè)宏塊(即編號(hào)為0的宏塊),計(jì)算該編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)值,代入H為16,W為16,NUM為0,則x為15,y為15,即編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)為(15,15),幾何變換模塊從內(nèi)存中取第15宏塊行、第15宏塊列的宏塊作為第1個(gè)宏塊。
以此方法,可以計(jì)算水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)后每一個(gè)編號(hào)的宏塊在原來圖像宏塊陣列中的位置坐標(biāo),根據(jù)計(jì)算所得的每一個(gè)坐標(biāo),按順序依次讀取宏塊,生成水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的宏塊陣列。
接著,幾何變換模塊將讀進(jìn)來的每一個(gè)宏塊內(nèi)的數(shù)據(jù)進(jìn)行重新排列操作,在重新排列操作過程中,對(duì)一個(gè)宏塊內(nèi)的每一個(gè)數(shù)據(jù)建立編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1,按照編號(hào)順序,計(jì)算每一個(gè)數(shù)據(jù)應(yīng)該寫入緩存的地址,按照計(jì)算所得的地址將每一個(gè)數(shù)據(jù)依次寫入緩存中。
其中,對(duì)于重新排列順序的確定,同樣可以預(yù)設(shè)一種地址計(jì)算方法,該地址計(jì)算方法用于計(jì)算數(shù)據(jù)編號(hào)與寫入緩存的地址之間的關(guān)聯(lián)關(guān)系。
對(duì)于水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)重新排列的地址計(jì)算方法如式[18]所示。
其中,w表示宏塊的寬度,即一個(gè)宏塊內(nèi)一行的數(shù)據(jù)個(gè)數(shù),h表示宏塊的高度,即一個(gè)宏塊內(nèi)一列的數(shù)據(jù)個(gè)數(shù),num為當(dāng)前要寫入緩存的數(shù)據(jù)的編號(hào), D表示數(shù)據(jù)應(yīng)寫入緩存的地址,符號(hào)表示向0方向取整,符號(hào)%表示取余。
對(duì)于亮度信息Y來說,w和h都為16,對(duì)于色度信息U和V來說,w和h都為8。
于此,可根據(jù)該地址計(jì)算方法將轉(zhuǎn)換前宏塊內(nèi)的數(shù)據(jù)依次寫入緩存中對(duì)應(yīng)位置,寫入緩存后的數(shù)據(jù)順序符合水平翻轉(zhuǎn)以及90°旋轉(zhuǎn)要求的宏塊內(nèi)數(shù)據(jù)順序。
七、垂直翻轉(zhuǎn)+90°旋轉(zhuǎn)
參閱圖11a所示,為圖4所示的原圖像經(jīng)垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的圖像,可以看出,垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)以后的圖像,宏塊陣列中的宏塊順序都發(fā)生了變化,例如,原圖像第0行的宏塊移到了第0列,原圖像左上角的宏塊依然在左上角,但是,經(jīng)過垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)后每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序發(fā)生了變化,如圖11b所示,為圖4所示的原圖像左上角的宏塊內(nèi)數(shù)據(jù)經(jīng)過垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)順序,第0行的數(shù)據(jù)從左至右的順序?yàn)?0_00,01_00,……,14_00,15_00。
幾何變換模塊按照垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)后宏塊順序的要求,從內(nèi)存中依次將宏塊讀取出來,同樣,宏塊在剛剛讀取進(jìn)來的時(shí)候,宏塊內(nèi)的數(shù)據(jù)順序還是原來圖像宏塊內(nèi)的數(shù)據(jù)順序,幾何變換模塊接著將每一個(gè)宏塊內(nèi)的數(shù)據(jù)順序按照垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的數(shù)據(jù)順序進(jìn)行重新排列。
其中,對(duì)于宏塊的讀取順序的確定,同樣也建立宏塊映射關(guān)系,對(duì)垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)來說,宏塊映射關(guān)系可以由式[19]和式[20]計(jì)算。
x=NUM%H [19]
其中,W為原始圖像宏塊陣列中一行的宏塊個(gè)數(shù),H為原始圖像宏塊陣列中一列的宏塊個(gè)數(shù),NUM為水平翻轉(zhuǎn)后的圖像宏塊的編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1個(gè),符號(hào)表示向0方向取整,符號(hào)%表示取余。
計(jì)算所得的x值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊行坐標(biāo),計(jì)算所得的y值即為當(dāng)前編號(hào)對(duì)應(yīng)的宏塊在原來圖像宏塊陣列中的宏塊列坐標(biāo)。
例如,取垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的第1個(gè)宏塊(即編號(hào)為0的宏塊),計(jì)算該編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)值,代入H為16,W為16,NUM為0,則x為0,y為0,即編號(hào)為0的宏塊在原始圖像宏塊陣列中的坐標(biāo)為(0,0),幾何變換模塊從內(nèi)存中取第0宏塊行、第0宏塊列的宏塊作為第1個(gè)宏塊。
又例如,取垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的第17個(gè)宏塊(即編號(hào)為16的宏塊),計(jì)算該編號(hào)為16的宏塊在原始圖像宏塊陣列中的坐標(biāo)值,代入H為16,W為16,NUM為16,則x為0,y為1,即編號(hào)為16的宏塊在原始圖像宏塊陣列中的坐標(biāo)為(0,1),幾何變換模塊從內(nèi)存中取第0宏塊行、第1宏塊列的宏塊作為第17個(gè)宏塊。
以此方法,可以計(jì)算垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)后每一個(gè)編號(hào)的宏塊在原來圖像宏塊陣列中的位置坐標(biāo),根據(jù)計(jì)算所得的每一個(gè)坐標(biāo),按順序依次讀取宏塊,生成垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的宏塊陣列。
接著,幾何變換模塊將讀進(jìn)來的每一個(gè)宏塊內(nèi)的數(shù)據(jù)進(jìn)行重新排列操作,在重新排列操作過程中,對(duì)一個(gè)宏塊內(nèi)的每一個(gè)數(shù)據(jù)建立編號(hào),編號(hào)從0開始,從左到右,從上到下,依次遞增1,按照編號(hào)順序,計(jì)算每一個(gè)數(shù)據(jù)應(yīng)該寫入緩存的地址,按照計(jì)算所得的地址將每一個(gè)數(shù)據(jù)依次寫入緩存中。
其中,對(duì)于重新排列順序的確定,同樣可以預(yù)設(shè)一種地址計(jì)算方法,該地址計(jì)算方法用于計(jì)算數(shù)據(jù)編號(hào)與寫入緩存的地址之間的關(guān)聯(lián)關(guān)系。
對(duì)于垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)后的宏塊內(nèi)數(shù)據(jù)重新排列的地址計(jì)算方法如式[21]所示。
其中,w表示宏塊的寬度,即一個(gè)宏塊內(nèi)一行的數(shù)據(jù)個(gè)數(shù),h表示宏塊的 高度,即一個(gè)宏塊內(nèi)一列的數(shù)據(jù)個(gè)數(shù),num為當(dāng)前要寫入緩存的數(shù)據(jù)的編號(hào),D表示數(shù)據(jù)應(yīng)寫入緩存的地址,符號(hào)表示向0方向取整,符號(hào)%表示取余。
對(duì)于亮度信息Y來說,w和h都為16,對(duì)于色度信息U和V來說,w和h都為8。
于此,可根據(jù)該地址計(jì)算方法將轉(zhuǎn)換前宏塊內(nèi)的數(shù)據(jù)依次寫入緩存中對(duì)應(yīng)位置,寫入緩存后的數(shù)據(jù)順序符合垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn)要求的宏塊內(nèi)數(shù)據(jù)順序。
以上是對(duì)部分旋轉(zhuǎn)、翻轉(zhuǎn)方式及幾種旋轉(zhuǎn)翻轉(zhuǎn)結(jié)合的方式進(jìn)行的舉例說明,其他旋轉(zhuǎn)、翻轉(zhuǎn)以及旋轉(zhuǎn)翻轉(zhuǎn)結(jié)合的幾何變換方式的操作方法相同,只是宏塊映射關(guān)系與地址計(jì)算方法不同。
另外需要說明的是,上述幾種幾何變換方式中的宏塊映射關(guān)系與地址計(jì)算方法只是本發(fā)明實(shí)施例的一種舉例,計(jì)算公式并不局限于此,可在本發(fā)明實(shí)施例列舉的公式的基礎(chǔ)上采取任何可以達(dá)到宏塊映射或地址計(jì)算目的的數(shù)學(xué)計(jì)算方法進(jìn)行修改。
在通過宏塊映射關(guān)系計(jì)算宏塊在原圖像中的位置,并按照一定順序從內(nèi)存中讀取宏塊的過程中,可以將宏塊映射關(guān)系中的宏塊行、宏塊列坐標(biāo)的映射關(guān)系看成兩個(gè)部分組成,第一部分可以看作是與宏塊陣列的寬或高相關(guān)的部分,第二部分可以看作是通過取余或者取商計(jì)算的部分。表1是上述幾種幾何變換方式下每一部分的計(jì)算式,式中W為原始圖像宏塊陣列水平方向的宏塊個(gè)數(shù)(即宏塊陣列的寬度),H為原始圖像宏塊陣列垂直方向的宏塊個(gè)數(shù)(即宏塊陣列的高度)。
表1
在計(jì)算的過程中,按照表1中的記錄,通過選擇器可簡(jiǎn)單實(shí)現(xiàn)選擇宏塊行、宏塊列坐標(biāo)的第一部分值,通過兩組計(jì)數(shù)器,可實(shí)現(xiàn)選擇宏塊行、宏塊列坐標(biāo)的第二部分值。關(guān)于宏塊陣列寬度取商及取余操作對(duì)應(yīng)一組計(jì)數(shù)器(例如cnt_w_q和cnt_w_r),關(guān)于宏塊陣列高度取商及取余操作對(duì)應(yīng)一組計(jì)數(shù)器(例如cnt_h_q和cnt_h_r)。這兩組計(jì)數(shù)器設(shè)置為只有在每取一個(gè)宏塊開始時(shí)進(jìn)行如下操作一次:關(guān)于宏塊陣列寬、高的取余計(jì)數(shù)器(即cnt_w_r和cnt_h_r)自加1,實(shí)現(xiàn)NUM%W以及NUM%H的計(jì)算,因其分別以W-1及H-1為模,即兩個(gè)取余計(jì)數(shù)器當(dāng)分別計(jì)算到W-1及H-1時(shí),對(duì)應(yīng)計(jì)數(shù)器各自清零,再取下一個(gè)宏塊時(shí)從零開始計(jì)數(shù);而關(guān)于宏塊陣列寬、高取商的計(jì)數(shù)器(即cnt_w_q和cnt_h_q)實(shí)現(xiàn)以及的計(jì)算,分別以H-1及W-1為模,只有相應(yīng) 的取余計(jì)數(shù)器各自記到模值時(shí),該兩個(gè)計(jì)數(shù)器才會(huì)分別自加1。
參照表1中記錄的計(jì)算表達(dá)式,當(dāng)實(shí)施不同方式的幾何變換時(shí),根據(jù)表1中記錄的第一部分及第二部分的計(jì)算表達(dá)式,選擇相應(yīng)的計(jì)數(shù)器,進(jìn)行計(jì)算,并將第一部分與第二部分的值進(jìn)行相加,即得宏塊映射后的宏塊行、宏塊列坐標(biāo),其中,第二部分若為負(fù)值,需將對(duì)應(yīng)計(jì)數(shù)器計(jì)算的值進(jìn)行取負(fù)操作。
通過計(jì)數(shù)器計(jì)算當(dāng)前要取的宏塊在宏塊陣列中的行、列坐標(biāo)后,按照計(jì)算所得的坐標(biāo)通過總線將存于內(nèi)存中對(duì)應(yīng)的宏塊數(shù)據(jù)讀取出來,之后進(jìn)行宏塊內(nèi)的數(shù)據(jù)順序的重新排列,通過內(nèi)部的塊緩存實(shí)現(xiàn),如圖12所示,為宏塊內(nèi)數(shù)據(jù)順序重新排列的示意圖。
地址計(jì)算電路計(jì)算原宏塊內(nèi)的每一個(gè)數(shù)據(jù)應(yīng)寫入緩存的地址,根據(jù)地址按順序?qū)⒃陦K內(nèi)的每一個(gè)數(shù)據(jù)寫入相應(yīng)的數(shù)據(jù)緩存。在讀出時(shí),按順序讀出即可。
與宏塊映射類似,原宏塊內(nèi)的數(shù)據(jù)的寫地址也可分成三部分來實(shí)現(xiàn)。這三部分的計(jì)算表達(dá)式如表2所示。
表2
幾何變換在宏塊內(nèi),按Y(亮度信息)、U、V(色度信息)獨(dú)立成塊實(shí)現(xiàn)。表2中w為宏塊內(nèi)一行數(shù)據(jù)的寬度,h為宏塊內(nèi)一列數(shù)據(jù)的高度,Y塊的大小為16X16,故對(duì)于Y來說,w,h都為16;而對(duì)于U、V數(shù)據(jù)來說,根據(jù)其格式,塊大小不同,在4:2:0時(shí)為8X8,w、h都為8。因Y、U、V三者操作一致,故在此只Y操作進(jìn)行說明。
同樣,通過一組計(jì)數(shù)器來實(shí)現(xiàn)取余及取商操作,即計(jì)算num%w及并通過簡(jiǎn)單的乘法,即可得到表2中第二部分和第三部分的值,與第一部分值進(jìn)行相加后,即可得到當(dāng)前數(shù)據(jù)寫入緩存的地址。
如此,在一個(gè)宏塊數(shù)據(jù)輸入完成后,本地緩存的數(shù)據(jù)已是重新排列過順序的,之后按地址先后順序讀出數(shù)據(jù)即可。
另外,在實(shí)現(xiàn)宏塊內(nèi)數(shù)據(jù)順序調(diào)整時(shí),還可以采用以下方式。
在寫入緩存時(shí)不對(duì)原宏塊內(nèi)的數(shù)據(jù)順序進(jìn)行調(diào)整,而在讀取的時(shí)候,按照一定的地址計(jì)算公式實(shí)時(shí)計(jì)算讀取的順序,按一定的順序讀出。
該地址計(jì)算公式如表3所示。
表3
同樣,幾何變換在宏塊內(nèi),按Y(亮度信息)、U、V(色度信息)獨(dú)立成塊實(shí)現(xiàn)。表3中W為宏塊內(nèi)一行數(shù)據(jù)的寬度,H為宏塊內(nèi)一列數(shù)據(jù)的高度,Y塊的大小為16X16,故對(duì)于Y來說,w,h都為16;而對(duì)于U、V數(shù)據(jù)來說,根據(jù)其格式,塊大小不同,在4:2:0時(shí)為8X8,w、h都為8。因Y、U、V三者操作一致,故在此只Y操作進(jìn)行說明。
基于上述實(shí)施例,如圖13所示,本發(fā)明還設(shè)計(jì)了一種數(shù)字圖像幾何變換的處理裝置,包括:
宏塊讀取單元131,用于根據(jù)圖像幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,確定宏塊的讀取順序,并按照讀取順序依次從內(nèi)存中讀取相應(yīng)的宏塊,其中,宏塊映射關(guān)系用于表示幾何變換后的一個(gè)宏塊的編號(hào)與該宏塊在原始圖像中的位置關(guān)系;
數(shù)據(jù)存入單元132,用于每讀取一個(gè)宏塊,按照幾何變化方式對(duì)應(yīng)的預(yù)設(shè)的地址計(jì)算方法,計(jì)算當(dāng)前讀取的一個(gè)宏塊內(nèi)每一個(gè)數(shù)據(jù)對(duì)應(yīng)的目標(biāo)存放地址,按照獲得的目標(biāo)存放地址將宏塊內(nèi)的每一個(gè)數(shù)據(jù)依次存入數(shù)據(jù)緩存中;
數(shù)據(jù)讀取單元133,用于將數(shù)據(jù)緩存中的數(shù)據(jù)按順序讀出并發(fā)送至編碼器。
較佳地,在根據(jù)圖像的幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,確定宏塊的讀取順序之前:
設(shè)置單元130,用于根據(jù)幾何變換后宏塊的編號(hào)、原始圖像宏塊陣列中水平方向的宏塊個(gè)數(shù)以及原始圖像宏塊陣列中垂直方向的宏塊個(gè)數(shù),確定每一種幾何變換方式對(duì)應(yīng)的宏塊映射關(guān)系;以及,用于根據(jù)將要寫入緩存的數(shù)據(jù)的編號(hào)、當(dāng)前讀取的一個(gè)宏塊在水平方向上的數(shù)據(jù)個(gè)數(shù)以及當(dāng)前讀取的一個(gè)宏塊在垂直方向上的數(shù)據(jù)個(gè)數(shù),確定每一種幾何變換方式對(duì)應(yīng)的地址計(jì)算方法。
較佳地,在根據(jù)圖像幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,確定宏塊的讀取順序,并按照讀取順序依次從內(nèi)存中讀取相應(yīng)的宏塊時(shí),宏塊讀取單元131具體用于:
根據(jù)幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,依次計(jì)算幾何變換后每一個(gè)編號(hào)的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的坐標(biāo)值;
每計(jì)算一個(gè)坐標(biāo)值,按照所計(jì)算的坐標(biāo)值所對(duì)應(yīng)的內(nèi)存地址讀取宏塊數(shù)據(jù);
其中,坐標(biāo)值用于表征宏塊在原始圖像宏塊陣列中的位置。
較佳地,在根據(jù)幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,依次計(jì)算幾何變換后每一個(gè)編號(hào)的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的坐標(biāo)值時(shí),宏塊讀取單元133具體用于:
若所述幾何變換為水平翻轉(zhuǎn),則宏塊映射關(guān)系為以及y=W-1-(NUM%W);
若所述幾何變換為垂直翻轉(zhuǎn),則宏塊映射關(guān)系為以及y=(NUM%W);
若所述幾何變換為90°旋轉(zhuǎn),則宏塊映射關(guān)系為x=H-1-NUM%H以及
若所述幾何變換為180°旋轉(zhuǎn),則宏塊映射關(guān)系為以及y=W-1-NUM%W;
若所述幾何變換為270°旋轉(zhuǎn),則宏塊映射關(guān)系為x=NUM%H以及
若所述幾何變換為水平翻轉(zhuǎn)以及90°旋轉(zhuǎn),則宏塊映射關(guān)系為x=H-1-NUM%H以及
若所述幾何變換為垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn),則宏塊映射關(guān)系為x=NUM%H以及
其中,W表示原始圖像宏塊陣列中水平方向的宏塊個(gè)數(shù),H表示原始圖像宏塊陣列中垂直方向的宏塊個(gè)數(shù),NUM為幾何變換后宏塊的編號(hào),x為編號(hào)NUM的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的宏塊行坐標(biāo)值,y為編號(hào)NUM的宏塊在原始圖像宏塊陣列中對(duì)應(yīng)的宏塊列坐標(biāo)值,符號(hào)表示對(duì)符號(hào)內(nèi)的參量進(jìn)行向0方向取整操作,符號(hào)%表示取余操作;
較佳地,在按照幾何變化方式對(duì)應(yīng)的預(yù)設(shè)的地址計(jì)算方法,計(jì)算當(dāng)前讀取的一個(gè)宏塊內(nèi)每一個(gè)數(shù)據(jù)對(duì)應(yīng)的目標(biāo)存放地址時(shí),數(shù)據(jù)存入單元132具體用于:
若所述幾何變換方式為水平翻轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為垂直翻轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為90°旋轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為180°旋轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為270°旋轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為水平翻轉(zhuǎn)以及90°旋轉(zhuǎn),則地址計(jì)算方法為:
若所述幾何變換方式為垂直翻轉(zhuǎn)以及90°旋轉(zhuǎn),則地址計(jì)算方法為:
其中,w表示當(dāng)前讀取的一個(gè)宏塊在水平方向上的數(shù)據(jù)個(gè)數(shù),h表示當(dāng)前讀取的一個(gè)宏塊在垂直方向上的數(shù)據(jù)個(gè)數(shù),num表示將要寫入緩存的數(shù)據(jù)的編號(hào),D表示宏塊內(nèi)編號(hào)num的數(shù)據(jù)應(yīng)寫入緩存的地址,符號(hào)表示對(duì)符號(hào)內(nèi)的參量進(jìn)行向0方向取整操作,符號(hào)%表示取余操作。
較佳地,宏塊讀取單元131以及數(shù)據(jù)存入單元132對(duì)幾何變換后宏塊的編號(hào)以及將要寫入緩存的數(shù)據(jù)的編號(hào)皆執(zhí)行以下取值方式:
從0開始取值,按從左到右,從上到下的順序,依次加1。
綜上所述,本發(fā)明實(shí)施例中,根據(jù)圖像的幾何變換方式對(duì)應(yīng)的預(yù)設(shè)的宏塊映射關(guān)系,確定宏塊的讀取順序,并按照所述讀取順序依次從內(nèi)存中讀取相應(yīng)的宏塊,每讀取一個(gè)宏塊,按照該幾何變化方式對(duì)應(yīng)的預(yù)設(shè)的地址計(jì)算方法,計(jì)算當(dāng)前讀取的一個(gè)宏塊內(nèi)每一個(gè)數(shù)據(jù)對(duì)應(yīng)的目標(biāo)存放地址,按照獲得的目標(biāo)存放地址將宏塊內(nèi)的每一個(gè)數(shù)據(jù)依次存入數(shù)據(jù)緩存中,將數(shù)據(jù)緩存中的數(shù)據(jù)按順序讀出并發(fā)送至編碼器,這樣,實(shí)現(xiàn)了在H.264編碼后的碼流中的圖像旋轉(zhuǎn)、翻轉(zhuǎn),在不增加總線、內(nèi)存訪問次數(shù)的基礎(chǔ)上,保障了總線、內(nèi)存的訪問效率,減少帶寬消耗及相應(yīng)的訪問功耗,并且硬件實(shí)現(xiàn)資源也較小。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合。可提供這些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入 式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
盡管已描述了本發(fā)明的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對(duì)這些實(shí)施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本發(fā)明范圍的所有變更和修改。
顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明實(shí)施例進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明實(shí)施例的精神和范圍。這樣,倘若本發(fā)明實(shí)施例的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。