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

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

?? wavelet.c

?? “wavelet”目錄中存放的是API函數(shù)源程序 “wavelet_gui”目錄中存放的是JPEG2000應(yīng)用舉例的DELPHI調(diào)用 “可執(zhí)行應(yīng)用”目錄中存放的是筆者編譯成功的可執(zhí)行應(yīng)用程序
?? 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一区二区三区免费野_久草精品视频
亚洲美女区一区| 亚洲444eee在线观看| 成人h动漫精品| 国产日韩v精品一区二区| 精品中文字幕一区二区| 884aa四虎影成人精品一区| 亚洲综合精品久久| 欧美三片在线视频观看| 亚洲综合自拍偷拍| 欧美午夜精品久久久久久孕妇| 亚洲男人的天堂在线aⅴ视频| 91在线国内视频| 亚洲视频小说图片| 91丨九色丨国产丨porny| 亚洲欧洲另类国产综合| 91美女在线看| 亚洲国产日韩精品| 欧美精品18+| 奇米色777欧美一区二区| 欧美成人vps| 国产夫妻精品视频| 国产精品黄色在线观看| 色综合久久久久久久久久久| 亚洲国产一区二区在线播放| 欧美老肥妇做.爰bbww视频| 日韩—二三区免费观看av| 日韩欧美中文字幕制服| 国产激情视频一区二区在线观看| 国产精品国产三级国产aⅴ中文| 99久久国产综合精品色伊| 亚洲一区二区影院| 91精品国产综合久久久久久久久久| 免费观看日韩电影| 久久久久久久久久久久久久久99| 成人免费视频国产在线观看| 一区二区三区久久| 欧美一区二区在线不卡| 国产精品乡下勾搭老头1| 亚洲日本在线a| 777色狠狠一区二区三区| 黄色成人免费在线| 国产精品久久久久国产精品日日| 欧美日韩综合色| 老色鬼精品视频在线观看播放| 中文字幕va一区二区三区| 在线观看91精品国产入口| 免费成人在线影院| 国产精品免费人成网站| 欧美色图激情小说| 国产一区二区三区在线观看免费 | 91视视频在线观看入口直接观看www| 亚洲精品乱码久久久久久黑人| 日本国产一区二区| 久久精品国产精品青草| 国产精品免费观看视频| 欧美日韩亚洲不卡| 国产成人免费视频网站| 亚洲国产精品一区二区www在线 | 正在播放亚洲一区| 国产精华液一区二区三区| 亚洲一区二区三区影院| 久久综合久色欧美综合狠狠| 色综合久久中文字幕| 精品一区二区三区免费观看| 最新日韩av在线| 日韩欧美一卡二卡| 91年精品国产| 精品亚洲免费视频| 亚洲精品少妇30p| 久久久不卡网国产精品一区| 欧美调教femdomvk| 国产成人av自拍| 日韩精品亚洲专区| 亚洲欧洲三级电影| 久久综合色鬼综合色| 欧美色网一区二区| 成人精品小蝌蚪| 久久91精品久久久久久秒播| 亚洲一区二区在线免费看| 国产欧美日韩视频在线观看| 5566中文字幕一区二区电影| 成人精品国产一区二区4080| 日本不卡在线视频| 亚洲人成影院在线观看| 精品国产第一区二区三区观看体验| 欧美视频精品在线| www.欧美.com| 极品少妇xxxx精品少妇偷拍| 水野朝阳av一区二区三区| 亚洲欧洲成人自拍| 久久亚洲综合色| 日韩一区二区三区四区| 欧美性猛交xxxxxxxx| www.在线欧美| 国产成人精品午夜视频免费| 久久机这里只有精品| 午夜av一区二区| 亚洲色图视频网站| 国产人久久人人人人爽| 欧美大片国产精品| 91精品国产91久久久久久最新毛片| 97久久超碰精品国产| 盗摄精品av一区二区三区| 国产在线看一区| 久久激情综合网| 喷白浆一区二区| 性久久久久久久久久久久| 亚洲精品中文在线观看| 国产精品国模大尺度视频| 国产日韩精品一区| 国产亚洲一区二区在线观看| 日韩一区二区电影在线| 欧美精品乱码久久久久久| 欧洲av在线精品| 色狠狠桃花综合| 日本韩国一区二区三区| 日本高清不卡视频| 色婷婷精品大在线视频| 色综合久久综合中文综合网| 91麻豆自制传媒国产之光| 成人v精品蜜桃久久一区| 成人免费视频一区| 不卡av在线网| 成人av影视在线观看| 不卡一区在线观看| 99久免费精品视频在线观看| 成人久久视频在线观看| heyzo一本久久综合| www.欧美亚洲| 91网站最新地址| 91极品视觉盛宴| 在线看日韩精品电影| 欧美在线观看视频一区二区| 在线免费不卡电影| 欧美日韩国产首页在线观看| 欧美日韩在线播| 日韩一级片网址| 欧美成人女星排行榜| 久久一区二区三区四区| 久久久蜜桃精品| 久久久久国产精品麻豆ai换脸 | 欧美日韩你懂得| 91精品国产91综合久久蜜臀| 欧美成人一区二区三区片免费| 精品区一区二区| 久久久久久久久伊人| 国产精品视频九色porn| 亚洲欧美一区二区三区国产精品 | 日韩av电影免费观看高清完整版 | 色综合欧美在线| 欧美日韩一本到| 日韩欧美国产午夜精品| 久久午夜国产精品| 中文字幕成人av| 亚洲综合色成人| 蜜臀av性久久久久蜜臀av麻豆| 国产一区999| av网站一区二区三区| 精品视频1区2区3区| 欧美v国产在线一区二区三区| 日本一区二区三区高清不卡| 一区二区三区中文字幕在线观看| 午夜精品一区二区三区三上悠亚| 久久av资源站| eeuss鲁片一区二区三区| 欧美性一级生活| 日韩三级视频在线观看| 欧美经典一区二区三区| 一区二区三区四区高清精品免费观看| 婷婷久久综合九色国产成人| 国产美女视频91| 91麻豆成人久久精品二区三区| 欧美久久久久久久久中文字幕| 久久青草国产手机看片福利盒子 | 国产iv一区二区三区| 色婷婷亚洲精品| 精品久久久久久久久久久久久久久 | 秋霞午夜鲁丝一区二区老狼| 国产成人精品亚洲777人妖| 欧美亚洲国产一区在线观看网站| 欧美一二三区在线观看| 中文字幕在线观看不卡视频| 丝袜亚洲另类欧美综合| 国产成人综合网站| 欧美日韩精品一区二区在线播放| 国产日韩av一区| 午夜久久电影网| 成人黄色大片在线观看| 欧美高清激情brazzers| 亚洲国产精品t66y| 三级影片在线观看欧美日韩一区二区 | 亚洲成人激情av| 国产精品91一区二区| 欧美日韩在线免费视频| 欧美激情综合五月色丁香| 午夜电影一区二区三区| 不卡av在线免费观看| 欧美r级在线观看| 一区二区三区视频在线看| 国产一区 二区|