亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? wavelet.c

?? JPEG-MPEG編解碼技術(shù)書集的代碼
?? C
字號(hào):
 
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
#include <float.h>
#include <string.h>
#include "wavelet.h"


/*首先必須注意的是,在小波變換的時(shí)候采用的是串行工作方式
(即,小波系數(shù)存放在原圖象的存儲(chǔ)區(qū)內(nèi)),因此不得不對(duì)小波系數(shù)重新排序。
這樣一來,對(duì)于高速緩存的利用是十分低效率的,卻可以節(jié)省不少的空間。*/
 
static void wavelet_row(wv_pel *dst, const wv_pel *src, const int len)
{ 
	//利用的是雙正交小波提升
	int i, mid;
	const wv_pel *ptr;
	wv_pel *avg, *det;

	mid = len / 2;

	ptr = src;
	avg = dst; //直流平均值 
	det = dst + mid; //高頻細(xì)節(jié)空間 
	
	*det = ptr[1] - (ptr[2] + ptr[0]) / 2; //細(xì)節(jié)預(yù)處理 
	*avg = ptr[0] + (det[0] + det[0]) / 4;  
	ptr += 2; det++; avg++;

	for (i = 1; i < mid - 1; i++)
	{
	//左邊不存在一個(gè)奇鄰居,右邊提升兩次
		*det = ptr[1] - (ptr[2] + ptr[0]) / 2;
		*avg = ptr[0] + (det[0] + det[-1]) / 4;
		ptr += 2; det++; avg++;
	}
	//右邊不存在一個(gè)偶鄰居,左邊提升兩次 
	*det = ptr[1] - (ptr[0] + ptr[0]) / 2; 
	*avg = ptr[0] + (det[0] + det[-1]) / 4; //最近平均值計(jì)算 
}


static void inverse_wavelet_row(wv_pel *dst, const wv_pel *src, const int len)
{
	int i, mid;
	wv_pel *ptr;
	const wv_pel *avg, *det;

	mid = len / 2;

	ptr = dst;
	avg = src;  
	det = src + mid; 
	//邊界情況
	*ptr = avg[0] - det[0] / 2; 
	ptr += 2; det++; avg++;
	
	for (i = 0; i < mid - 1; i++)
	{
		ptr[0] = avg[0] - (det[0] + det[-1]) / 4;
		ptr[-1] = det[-1] + (ptr[0] + ptr[-2]) / 2;
		ptr += 2; det++; avg++;
	}
	ptr[-1] = det[-1] + ptr[-2]; //邊界 
}

 
static void wavelet_transform(wv_pel *dst, const int width, const int height, const int levels)
{
	int l;
	wv_pel *tmp_lastrow = malloc((width + height + height) * sizeof *tmp_lastrow); // 寬 
	wv_pel *tmp_column_in = tmp_lastrow + width; // 高 
	wv_pel *tmp_column_out = tmp_lastrow + width + height;  //高 
	
	for (l = 0; l < levels; l++)
	{
		int w = width >> l, h = height >> l;
		int i;
		
		// 行 
		wavelet_row(tmp_lastrow, dst + (h - 1) * width, w); // put last row in tmp_row
		// 將結(jié)果存放在一行之下,并且工作方式是從底端往上 
		for (i = (h - 2) * width; i >= 0; i -= width)
			wavelet_row(dst + i + width, dst + i, w);

		// 列 
		for (i = 0; i < w; i++)
		{
			int j;

			for (j = 1; j < h; j++)
				tmp_column_in[j - 1] = dst[j * width + i]; //矩陣轉(zhuǎn)置 
			tmp_column_in[h - 1] = tmp_lastrow[i]; //放入最近一行 
			wavelet_row(tmp_column_out, tmp_column_in, h);
			for (j = 0; j < h; j++)
				dst[j * width + i] = tmp_column_out[j]; //再轉(zhuǎn)置 
		}
	}
	free(tmp_lastrow);
}

 
static void inverse_wavelet_transform(wv_pel *dst, const int width, const int height, const int levels)
{
	int l;
	wv_pel *tmp_lastrow = malloc((width + height + height) * sizeof *tmp_lastrow);  
	wv_pel *tmp_column_in = tmp_lastrow + width;  
	wv_pel *tmp_column_out = tmp_lastrow + width + height; 
	
	for (l = levels - 1; l >= 0; l--)
	{ 
		int w = width >> l, h = height >> l;
		int i;

		//列 
		for (i = 0; i < w; i++)
		{
			int j;

			for (j = 0; j < h; j++)
				tmp_column_in[j] = dst[j * width + i];  
			inverse_wavelet_row(tmp_column_out, tmp_column_in, h);
			for (j = 0; j < h - 1; j++)
				dst[(j + 1) * width + i] = tmp_column_out[j];  
			tmp_lastrow[i] = tmp_column_out[h - 1];  //存儲(chǔ)最后一列 
		}
		
		// 行 
		for (i = 0; i < (h - 1) * width; i += width)
			inverse_wavelet_row(dst + i, dst + i + width, w);
		inverse_wavelet_row(dst + (h - 1) * width, tmp_lastrow, w);
	}
	free(tmp_lastrow);
}


static void quantize(wv_pel* dst, const int num, const int T)
{
	if (T > 1)
	{
		int i;

		for (i = 0; i < num; i++)
			*dst++ /= T;
	}
}
 
#define dead_zone_dequant(v, f) (((v) > 0) ? (((v) * 10 + 5) * (f)) / 10 : ((v) < 0) ? (((v) * 10 - 5) * (f)) / 10 : 0)

static void dequantize(wv_pel* dst, const int num, const int T)
{
	if (T > 1)
	{
		int i;

		//以閾值T1開始小波系數(shù)恢復(fù) 
		for (i = 0; i < num; i++)
			*dst++ = dead_zone_dequant(*dst, T);
	}
}


static float log2(const double max_val)
{
	return (float)(log10(max_val) / log10(2.0));
}

/*標(biāo)題5版式*****************************************************************
函數(shù)輸入:	int max_val:	對(duì)數(shù)函數(shù)的自變量(比如log2i(0) = 0)
功能描述:	對(duì)給定的一個(gè)整數(shù)作底為2的對(duì)數(shù)運(yùn)算
函數(shù)輸出:	函數(shù)返回對(duì)數(shù)運(yùn)算的取整結(jié)果
***************************************************************************/
WAVELET_DLL_API int WAVELET_DLL_CC log2i(int max_val)
{
	int i;
	for (i = 0; max_val > 0; max_val >>= 1, i++) ;
	return i;
}


 
//本函數(shù)利用比特交錯(cuò)將重排序索引轉(zhuǎn)換稱(x,y)形式的坐標(biāo)
static void get_zig_zag_idx(const int idx, const int maxx, const int maxy, int* xx, int* yy)
{
	int xbits = log2i(maxx) - 1;
	int ybits = log2i(maxy) - 1;
	int mask;

	mask = 1 << (xbits + ybits - 1);
	*xx = *yy = 0;
	if (ybits >= xbits)
	{
		while (ybits > 0)
		{
			*yy <<= 1;
			*yy |= (idx & mask) > 0;
			mask >>= 1;
			ybits--;
			if (xbits > 0)
			{
				*xx <<= 1;
				*xx |= (idx & mask) > 0;
				mask >>= 1;
				xbits--;
			}
		}
	}
	else
	{
		while (xbits > 0)
		{
			*xx <<= 1;
			*xx |= (idx & mask) > 0;
			mask >>= 1;
			xbits--;
			if (ybits > 0)
			{
				*yy <<= 1;
				*yy |= (idx & mask) > 0;
				mask >>= 1;
				ybits--;
			}
		}
	}
 
}

static int** init_reorder_tables(const int width, const int owidth, const int height, const int oheight, const int levels)
{
	int** tables = NULL;

	if (width > 2 && height > 2)
	{
		int l;
		
		tables = malloc((levels + 1) * sizeof *tables);
		for (l = 1; l <= levels + 1; l++)
		{
						//確定一塊小波系數(shù)在坐標(biāo)值的大小
			int block_size_x = width >> l; 
			int block_size_y = height >> l; 
			int unused_size_x, unused_size_y;
			int *cur_table;
			int i, j;

			tables[l - 1] = cur_table = malloc(block_size_x * block_size_y * sizeof *tables[l - 1]);
						
			unused_size_x = (width - owidth) >> l;
			unused_size_y = (height - oheight) >> l;
			for (i = 0; i < block_size_x * block_size_y; i++)
			{
				int k;

				get_zig_zag_idx(i, block_size_x, block_size_y, &j, &k);
				if (j <= (block_size_x - unused_size_x) && k <= (block_size_y - unused_size_y))
					*cur_table++ = k * width + j;
			}
			// 現(xiàn)在求和所有未用的1(原本應(yīng)該全部為0)  
			for (i = 0; i < min(block_size_y, block_size_y - unused_size_y + 1); i++)
				for (j = block_size_x - unused_size_x + 1; j < block_size_x; j++)
					*cur_table++ = i * width + j;
			for (i = block_size_y - unused_size_y + 1; i < block_size_y; i++)
				for (j = 0; j < block_size_x; j++)
					*cur_table++ = i * width + j;
		}
	}
	return tables;
}


static void free_reorder_tables(int** tables, const int levels)
{
	if (tables)
	{
		int i;

		for (i = 0; i <= levels; i++)
			free(tables[i]);
		free(tables);
	}
}

//本函數(shù)用來重排序小波變換系數(shù),輸出是自定義的表
static void reorder(wv_pel *dst, const wv_pel* src, const int** tables, const int width, const int height, const int levels)
{
	if (tables)
	{
		int i, l;
		const int *idx;
		
		//輸出基頻均值 
		idx = tables[levels];
		for (i = 0; i < (width >> (levels + 1)) * (height >> (levels + 1)); i++)
			*dst++ = src[*idx++];
		for (l = levels + 1; l >= 1; l--)
		{
			//確定一塊小波系數(shù)在坐標(biāo)值的大小
			int block_size_x = width >> l; 
			int block_size_y = height >> l; 

			//交替輸出LH端/HL端的小波系數(shù)
			idx = tables[l - 1];
			for (i = 0; i < block_size_y * block_size_x; i++)
			{
				*dst++ = src[*idx + block_size_x]; // LH端的小波系數(shù)以逐行順序存放 
				*dst++ = src[*idx + block_size_y * width]; // HL小波系數(shù)也按逐行順序存放 
				idx++;
			}
			//現(xiàn)在是右邊下端的塊 
			idx = tables[l - 1];
			for (i = 0; i < block_size_x * block_size_y; i++)
				*dst++ = src[*idx++ + block_size_y * width + block_size_x];
		}
	}
	else
		memcpy(dst, src, width * height * sizeof *dst);
}

//本函數(shù)用于將重排序函數(shù)所自定義的交替順序恢復(fù)為直接可用的數(shù)據(jù)
static void unreorder(wv_pel* dst, const wv_pel* src, const int** tables, const int width, const int height, const int levels)
{
	if (tables)
	{
		int i, l;
		const int *idx;

		//輸出基頻均值 
		idx = tables[levels];
		for (i = 0; i < (width >> (levels + 1)) * (height >> (levels + 1)); i++)
			dst[*idx++] = *src++;
		for (l = levels + 1; l >= 1; l--)
		{
			//確定一塊小波系數(shù)在坐標(biāo)值的大小
			int block_size_x = width >> l;  
			int block_size_y = height >> l;  

			//交替輸出LH端/HL端的小波系數(shù) 
			idx = tables[l - 1];
			for (i = 0; i < block_size_y * block_size_x; i++)
			{
				dst[*idx + block_size_x] = *src++; //LH端的小波系數(shù)按“鋸齒”順序存放 
				dst[*idx + block_size_y * width] = *src++; //HL端的系數(shù)同樣按“鋸齒”順序存放

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产综合久久久久久漫画| 在线国产亚洲欧美| 亚洲精品中文在线影院| 91精品婷婷国产综合久久| 在线视频综合导航| 成人午夜免费av| 久久精品国产亚洲a| 亚洲不卡一区二区三区| 玉米视频成人免费看| 日韩美女视频一区二区| 国产女人18水真多18精品一级做| 日韩视频免费观看高清在线视频| 欧美日韩卡一卡二| 欧美午夜精品久久久久久孕妇| 99久久国产综合精品麻豆| 不卡大黄网站免费看| 欧美日韩在线直播| 国内精品久久久久影院一蜜桃| 天天av天天翘天天综合网色鬼国产 | 成人午夜视频福利| 成人sese在线| 91麻豆国产精品久久| 91国产丝袜在线播放| 在线视频综合导航| 91精品午夜视频| 亚洲精品一区二区三区精华液| 欧美一二三在线| 国产午夜精品福利| 国产精品视频yy9299一区| 亚洲欧洲成人精品av97| 夜夜亚洲天天久久| 日韩电影在线一区| 狠狠狠色丁香婷婷综合激情| 国产91精品露脸国语对白| 精品国产乱码久久久久久闺蜜| 成人性生交大片免费看视频在线| 成人午夜在线播放| 欧美亚洲高清一区| 日韩一区二区电影| 久久久亚洲精品一区二区三区| 国产精品国产精品国产专区不片| 亚洲午夜日本在线观看| 五月天久久比比资源色| 国产在线精品一区二区三区不卡 | 欧美大肚乱孕交hd孕妇| 久久久久一区二区三区四区| 国产精品国产三级国产三级人妇 | 自拍av一区二区三区| 91黄色免费看| 99r精品视频| 欧美一卡二卡在线观看| 国产精品青草久久| 美女尤物国产一区| 91免费版在线看| 久久综合色一综合色88| 香蕉久久夜色精品国产使用方法 | 老司机精品视频线观看86| 99精品视频免费在线观看| 精品美女在线播放| 亚洲精选在线视频| 99热在这里有精品免费| 久久综合网色—综合色88| 五月婷婷另类国产| 91丨porny丨中文| 国产欧美日韩在线视频| 久久99热99| 欧美一区二区三区爱爱| 国产一区二三区好的| www.欧美日韩国产在线| 欧美大片国产精品| 蜜臀av性久久久久av蜜臀妖精 | 久久国产日韩欧美精品| 欧美日韩mp4| 亚洲福利一二三区| 91福利国产精品| 椎名由奈av一区二区三区| 国产激情偷乱视频一区二区三区| 欧美日韩亚洲国产综合| 亚洲自拍偷拍欧美| 欧洲视频一区二区| 亚洲自拍偷拍av| 色国产精品一区在线观看| 久久精品无码一区二区三区| 国产一区二区女| 国产三级精品三级在线专区| 韩国一区二区在线观看| 久久色在线观看| 国产白丝网站精品污在线入口| 久久久久99精品一区| 国产成人午夜视频| 国产欧美久久久精品影院| 亚洲人精品午夜| 国产精品九色蝌蚪自拍| 中文字幕av一区二区三区高 | 久久疯狂做爰流白浆xx| 欧美日产国产精品| 奇米精品一区二区三区在线观看 | 91久久精品一区二区三| 午夜电影一区二区三区| 欧美一级二级三级乱码| 成人爱爱电影网址| 亚洲精品成人悠悠色影视| 欧美日韩免费电影| 紧缚奴在线一区二区三区| 国产精品久久久久久久久搜平片| 91蜜桃在线免费视频| 午夜视频久久久久久| 2021久久国产精品不只是精品| 高清成人在线观看| 麻豆一区二区三| 欧美男同性恋视频网站| 九九国产精品视频| 亚洲黄色免费网站| 精品区一区二区| 99久久久精品免费观看国产蜜| 午夜视频在线观看一区| 中文字幕一区二区日韩精品绯色| 欧美精品高清视频| 懂色av中文字幕一区二区三区| 亚洲成精国产精品女| 国产精品美女久久久久aⅴ国产馆| 欧美日韩黄色影视| 99久久精品免费精品国产| 麻豆91免费看| 亚洲大片一区二区三区| 国产精品美日韩| 欧美精品一区二区精品网| 欧美日韩国产高清一区| 色婷婷一区二区| 国产高清久久久| 久久成人久久爱| 日韩精品午夜视频| 亚洲电影视频在线| 亚洲蜜臀av乱码久久精品| 国产欧美一区二区在线观看| 一区二区三区四区视频精品免费 | 一区二区三区蜜桃| 久久精品亚洲一区二区三区浴池| 欧美三级三级三级| 91蝌蚪porny| 99久久免费精品高清特色大片| 国产精品一区二区三区99| 老司机精品视频导航| 久久精品噜噜噜成人av农村| 日韩av二区在线播放| 日韩经典中文字幕一区| 亚洲蜜臀av乱码久久精品蜜桃| 中文字幕视频一区二区三区久| 欧美激情综合五月色丁香小说| 久久久久9999亚洲精品| 亚洲国产成人一区二区三区| 亚洲国产电影在线观看| 日韩毛片精品高清免费| 尤物在线观看一区| 午夜视频在线观看一区二区三区| 丝袜美腿亚洲综合| 精品综合免费视频观看| 国产乱子伦视频一区二区三区| 国产盗摄一区二区三区| 日韩一区二区在线看| 色综合久久久久| 欧美日韩一区二区电影| 欧美一区二区视频在线观看| 日韩欧美国产系列| 国产欧美日韩视频在线观看| 成人欧美一区二区三区白人| 亚洲国产欧美日韩另类综合| 日产欧产美韩系列久久99| 精品一区二区日韩| 91色综合久久久久婷婷| 欧美日韩成人一区| 国产精品毛片大码女人| 亚洲最大成人网4388xx| 国产一区二区三区免费看| 97久久超碰国产精品| 日韩欧美一区二区免费| 国产精品麻豆一区二区| 日本vs亚洲vs韩国一区三区二区| 国产高清不卡一区| 在线视频一区二区免费| 国产无人区一区二区三区| 亚洲精品中文在线| 激情文学综合插| 欧美亚洲一区二区三区四区| 国产婷婷色一区二区三区在线| 亚洲成人午夜影院| 国产成人av自拍| 欧美日本国产视频| 国产欧美日韩另类一区| 日本不卡一区二区| 26uuu另类欧美亚洲曰本| 精品嫩草影院久久| 亚欧色一区w666天堂| 色综合久久天天| 欧美激情在线观看视频免费| 久久99精品国产.久久久久久| 欧美日韩视频在线一区二区| 国产精品另类一区| 国产成人av一区二区三区在线观看| 制服丝袜亚洲色图|