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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? wavelet.c

?? jpeg and mpeg 編解碼技術源代碼
?? C
字號:
 
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
#include <float.h>
#include <string.h>
#include "wavelet.h"


/*首先必須注意的是,在小波變換的時候采用的是串行工作方式
(即,小波系數存放在原圖象的存儲區內),因此不得不對小波系數重新排序。
這樣一來,對于高速緩存的利用是十分低效率的,卻可以節省不少的空間。*/
 
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; //高頻細節空間 
	
	*det = ptr[1] - (ptr[2] + ptr[0]) / 2; //細節預處理 
	*avg = ptr[0] + (det[0] + det[0]) / 4;  
	ptr += 2; det++; avg++;

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


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
		// 將結果存放在一行之下,并且工作方式是從底端往上 
		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]; //矩陣轉置 
			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]; //再轉置 
		}
	}
	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];  //存儲最后一列 
		}
		
		// 行 
		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開始小波系數恢復 
		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));
}

/*標題5版式*****************************************************************
函數輸入:	int max_val:	對數函數的自變量(比如log2i(0) = 0)
功能描述:	對給定的一個整數作底為2的對數運算
函數輸出:	函數返回對數運算的取整結果
***************************************************************************/
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;
}


 
//本函數利用比特交錯將重排序索引轉換稱(x,y)形式的坐標
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++)
		{
						//確定一塊小波系數在坐標值的大小
			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;
			}
			// 現在求和所有未用的1(原本應該全部為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);
	}
}

//本函數用來重排序小波變換系數,輸出是自定義的表
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--)
		{
			//確定一塊小波系數在坐標值的大小
			int block_size_x = width >> l; 
			int block_size_y = height >> l; 

			//交替輸出LH端/HL端的小波系數
			idx = tables[l - 1];
			for (i = 0; i < block_size_y * block_size_x; i++)
			{
				*dst++ = src[*idx + block_size_x]; // LH端的小波系數以逐行順序存放 
				*dst++ = src[*idx + block_size_y * width]; // HL小波系數也按逐行順序存放 
				idx++;
			}
			//現在是右邊下端的塊 
			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);
}

//本函數用于將重排序函數所自定義的交替順序恢復為直接可用的數據
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--)
		{
			//確定一塊小波系數在坐標值的大小
			int block_size_x = width >> l;  
			int block_size_y = height >> l;  

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久精品国产精品久久| 国产欧美精品一区二区三区四区| 大桥未久av一区二区三区中文| 欧美一区二区日韩| 天天综合色天天综合| 欧美日韩一区二区三区高清| 亚洲精品欧美专区| 欧美日韩成人在线| 久久精品国内一区二区三区| 欧美精品一区在线观看| 欧美体内she精高潮| 91麻豆6部合集magnet| 亚洲一二三级电影| 欧美一级欧美一级在线播放| 精品亚洲国内自在自线福利| 久久久久久久久久久久久久久99 | 一区免费观看视频| 在线观看日韩毛片| 日本视频中文字幕一区二区三区| 欧美va日韩va| 不卡一区在线观看| 婷婷丁香久久五月婷婷| 久久精品999| 日韩理论片网站| 欧美一区二区三区在线观看视频 | 欧美极品美女视频| 日本久久电影网| 奇米精品一区二区三区在线观看 | 51精品国自产在线| 久久精品99国产精品日本| 国产精品美女一区二区| 欧美午夜影院一区| 国产九九视频一区二区三区| 亚洲精品乱码久久久久久黑人 | 欧美另类变人与禽xxxxx| 久久99国产精品久久99果冻传媒| 国产精品嫩草影院com| 欧美一区二区精品在线| 91最新地址在线播放| 久久精品国产99| 亚洲午夜在线观看视频在线| 国产午夜亚洲精品午夜鲁丝片| 欧美三电影在线| 成人午夜在线播放| 国产乱人伦偷精品视频免下载| 欧美网站大全在线观看| 国产成人亚洲精品青草天美| 日韩中文字幕亚洲一区二区va在线 | 7777精品伊人久久久大香线蕉经典版下载 | 97精品久久久午夜一区二区三区 | 国产成人亚洲精品狼色在线| 亚洲成人自拍偷拍| 国产精品天干天干在观线| 日韩欧美电影一二三| 在线看日本不卡| 99久久精品国产网站| 国产成人av电影免费在线观看| 日韩成人dvd| 亚洲福利视频一区二区| 亚洲精品大片www| 亚洲欧美一区二区在线观看| 久久品道一品道久久精品| 欧美一区二区三区视频在线| 欧美午夜宅男影院| 欧美午夜精品一区二区三区| 成人av高清在线| 国产成人av电影| 成人国产精品免费观看| 国产成人免费视频| 国产乱淫av一区二区三区| 麻豆国产欧美一区二区三区| 日韩国产在线观看一区| 亚洲v精品v日韩v欧美v专区| 一二三区精品视频| 精品国产免费一区二区三区四区| 午夜国产精品一区| 亚洲国产日韩av| 性欧美疯狂xxxxbbbb| 午夜精品久久久久影视| 亚洲成人一二三| 亚洲成人高清在线| 五月天婷婷综合| 天天爽夜夜爽夜夜爽精品视频| 亚洲综合免费观看高清完整版在线| 亚洲男人的天堂在线观看| 中文字幕佐山爱一区二区免费| 日本一区免费视频| 欧美国产日韩a欧美在线观看| 国产亚洲精久久久久久| 日本一区二区三区在线不卡| 欧美国产精品中文字幕| 一区二区三区中文字幕在线观看| 一区二区三区在线视频观看58| 一区二区三区四区在线免费观看| 亚洲香蕉伊在人在线观| 日韩精品每日更新| 麻豆国产精品官网| 国产久卡久卡久卡久卡视频精品| 成人亚洲一区二区一| 91麻豆123| 欧美一区在线视频| 久久亚区不卡日本| 亚洲欧洲精品成人久久奇米网| 尤物在线观看一区| 日韩av电影免费观看高清完整版| 精品一区二区三区在线播放| 国产成人精品午夜视频免费| 91同城在线观看| 欧美日韩高清在线| 国产亚洲精品aa| 亚洲综合在线五月| 麻豆精品久久久| 中文字幕欧美激情| 亚洲成av人片观看| 国产一区欧美一区| 日本高清免费不卡视频| 欧美videos中文字幕| 国产精品国产三级国产aⅴ无密码| 日本一区二区不卡视频| 久久久99免费| 亚洲一区二区不卡免费| 精品午夜一区二区三区在线观看 | 自拍偷在线精品自拍偷无码专区| 国产精品乱码一区二区三区软件| 亚洲一级不卡视频| 国产精品一卡二| 欧美日韩在线播放三区| 国产欧美日韩精品在线| 亚洲成人动漫在线观看| 国产盗摄精品一区二区三区在线| 欧美综合欧美视频| 国产人久久人人人人爽| 亚洲第四色夜色| 99re66热这里只有精品3直播| 日韩精品综合一本久道在线视频| 亚洲欧美日韩中文播放 | 在线观看区一区二| 久久久久88色偷偷免费| 亚洲电影中文字幕在线观看| 粉嫩嫩av羞羞动漫久久久| 欧美精品久久一区| 亚洲六月丁香色婷婷综合久久| 国产在线一区二区| 91精品国产一区二区三区| 亚洲男人的天堂av| av激情亚洲男人天堂| 26uuu精品一区二区| 欧美日韩一区二区三区不卡| 国产精品成人一区二区三区夜夜夜| 蜜桃精品在线观看| 欧美影视一区二区三区| 中文字幕日韩精品一区| 国产精品一区免费视频| 日韩一区二区精品| 亚洲成av人片一区二区三区| 在线观看成人免费视频| 亚洲欧洲成人精品av97| 顶级嫩模精品视频在线看| 精品成a人在线观看| 另类的小说在线视频另类成人小视频在线| 激情欧美日韩一区二区| 一区二区高清在线| 99精品视频免费在线观看| 国产精品全国免费观看高清| 国产精品一品二品| 欧美国产日韩一二三区| 国产成人免费视频一区| 中文字幕欧美区| www.亚洲免费av| 自拍av一区二区三区| 91在线视频观看| 亚洲丝袜制服诱惑| 色综合久久综合中文综合网| 亚洲视频一区在线| 在线亚洲一区二区| 亚洲国产日韩一级| 日韩无一区二区| 国精产品一区一区三区mba视频| 精品成人一区二区三区四区| 国产在线国偷精品产拍免费yy| 国产午夜一区二区三区| 99综合影院在线| 亚洲一二三区在线观看| 欧美丰满美乳xxx高潮www| 美女国产一区二区三区| 久久青草国产手机看片福利盒子| 国产不卡视频一区| 亚洲欧美乱综合| 欧美三级视频在线| 激情文学综合网| 自拍偷自拍亚洲精品播放| 欧美日韩免费一区二区三区视频| 日韩一区二区三区免费观看| 久久99在线观看| 亚洲国产精品t66y| 色系网站成人免费| 美女视频第一区二区三区免费观看网站| 久久久99精品免费观看| 色女孩综合影院| 麻豆成人免费电影|