Fast Image Processing LIBrary by I.N.
高速画像処理ライブラリ FIPLIB 0.8
  2009.9.5

概要
 SSE2アセンブラ命令を使用した画像処理関数です.

動作確認を行った環境
  CPU:Athlon64 X2 4800+/Core2Duo 6850
  OS:WindowsXP SP3
  Compiler:Visual C++ 2008

関数リファレンス

void FIP_AbsDiffTh(unsigned char *dst, unsigned char *src, unsigned char th, int pxl);
//------------------------------------------------------------
//差分をとった後,しきい値で2値化する
//------------------------------------------------------------
//アルゴリズムの概要 if (abs(dst-src)>th) dst=255; else dst=0;
//------------------------------------------------------------
//入力
// dst:画像1(8bit)の先頭アドレス
// src:画像2(8bit)の先頭アドレス
// th:しきい値[0〜255]
// pxl:ピクセル数 (ただし,16の倍数)
//------------------------------------------------------------
//出力
// dst:出力画像(8bit)
//------------------------------------------------------------


void FIP_AbsDiff(unsigned char *dst, unsigned char *src, int pxl);
//------------------------------------------------------------
//差分をとるだけ
//------------------------------------------------------------
//アルゴリズムの概要 dst=abs(dst-src);
//------------------------------------------------------------
//入力
// dst:画像1(8bit)の先頭アドレス
// src:画像2(8bit)の先頭アドレス
// th:しきい値[0〜255]
// pxl:ピクセル数 (ただし,16の倍数)
//------------------------------------------------------------
//出力
// dst:出力画像(8bit)
//------------------------------------------------------------


void FIP_16to8x2(unsigned short *src, unsigned char *im1, unsigned char *im2, int pxl);
//------------------------------------------------------------
//16ビット混合画像を8ビット画像へ分割
//(画像入力ボード FDM-PCI 2CH のために作った)
//------------------------------------------------------------
//アルゴリズムの概要 src[15..0] -> im1[7..0] , im2[7..0]
//------------------------------------------------------------
//入力
// src:混合画像1(16ビット)の先頭アドレス
// pxl:ピクセル数 (ただし,16の倍数)
//------------------------------------------------------------
//出力
// im1:画像1(srcの下位8bit)の先頭アドレス
// im2:画像2(srcの上位8bit)の先頭アドレス
//------------------------------------------------------------


int FIP_SAD(unsigned char *d1, unsigned char *d2, int n);
//------------------------------------------------------------
//SAD相関
//------------------------------------------------------------
//アルゴリズムの概要 sum += abs(d1[i]-d2[i]) i=0..(n-1)
//------------------------------------------------------------
//入力
// d1:8ビットデータ配列の先頭アドレス
// d2:8ビットデータ配列の先頭アドレス
// n:データ数[単位:バイト] (ただし,16の倍数)
//------------------------------------------------------------
//戻り値
// SAD相関値
//------------------------------------------------------------
備考:時間を計ると,ふつうにC言語で書いたものと比較して,
    それほど高速でもない気がする.


void FIP_cnv32to24_sse2(void *dst, void *src, int pxl);
void FIP_cnv32to24_asm4(void *dst, void *src, int pxl);
void FIP_cnv32to24_asm1(void *dst, void *src, int pxl);
void FIP_cnv32to24_c(unsigned char *dst, unsigned int *src, int pxl);
void FIP_cnv32to24_c2(unsigned char *dst, unsigned int *src, int pxl);
//------------------------------------------------------------
//32ビット→24ビット画像変換
// sse2 : SSE2命令を駆使したバージョン,8ピクセルずつ処理
// asm4 : 汎用レジスタバージョン,4ピクセルずつ処理
// asm1 : 汎用レジスタバージョン,1ピクセルずつ処理
// c   : C言語バージョンその1
// c2  : C言語バージョンその2
//------------------------------------------------------------
//アルゴリズムの概要 [B][G][R][0] -> [B][G][R]
//------------------------------------------------------------
//入力
// src:読み出す32ビット画像のアドレス
//  ただし,sse2では,srcは16バイト境界でアライメントされている必要がある.
//         例:__declspec(align(16)) unsigned int src[];
// pxl:ピクセル数
//  ただし,sse2では8の倍数,asm4では4の倍数
//------------------------------------------------------------
//出力
// dst:書き込む24ビット画像のアドレス
//------------------------------------------------------------
//処理時間 (CPU:Core2Duo6850, OS:WinXP)
// sse2: 0.32ms
// asm4: 0.39ms
// asm1: 0.36ms
// c : 0.45ms
// c2 : 0.46ms
//処理時間 (CPU:Athlon64 X2 4800+, OS:WinXP)
// sse2: 1.05ms
// asm4: 1.00ms
// asm1: 1.03ms
// c : 1.02ms
// c2 : 1.09ms


void FIP_cnv24to32_sse2(void *dst, void *src, int pxl);
void FIP_cnv24to32_asm4(void *dst, void *src, int pxl);
void FIP_cnv24to32_asm1(void *dst, void *src, int pxl);
void FIP_cnv24to32_c(unsigned int *dst, unsigned char *src, int pxl);
void FIP_cnv24to32_c2(unsigned int *dst, unsigned char *src, int pxl);

//------------------------------------------------------------
//24ビット→32ビット画像変換
// sse2 : SSE2命令を駆使したバージョン,8ピクセルずつ処理
// asm4 : 汎用レジスタバージョン,4ピクセルずつ処理
// asm1 : 汎用レジスタバージョン,1ピクセルずつ処理
// c   : C言語バージョンその1
// c2  : C言語バージョンその2
//------------------------------------------------------------
//アルゴリズムの概要 [B][G][R] -> [B][G][R][0]
//------------------------------------------------------------
//入力
// src:読み出す24ビット画像のアドレス
// pxl:ピクセル数
//   ただし,sse2では8の倍数,asm4では4の倍数
//------------------------------------------------------------
//出力
// dst:書き込む32ビット画像のアドレス
//  ただし,sse2では,dstは16バイト境界でアライメントされている必要がある.
//         例:__declspec(align(16)) unsigned int dst[];
//------------------------------------------------------------
//処理時間 (CPU:Core2Duo6850, OS:WinXP)
// sse2: 0.26ms
// asm4: 0.31ms
// asm1: 0.62ms
// c : 0.34ms
// c2 : 0.59ms
//処理時間 (CPU:Athlon64 X2 4800+, OS:WinXP)
// sse2: 1.17ms
// asm4: 1.07ms
// asm1: 1.13ms
// c : 1.12ms
// c2 : 1.20ms


void FIP_Quarter(void *dst, void *src, int wx, int wy);
//------------------------------------------------------------
//画像縮小:縦横半分(画素数1/4),モノクロ画像用
//------------------------------------------------------------
//アルゴリズムの概要 4画素輝度の平均(横平均のあと縦平均)
//------------------------------------------------------------
//入力
// src:読み出す8ビット画像のアドレス
// (srcは16バイト境界でアライメントされている必要がある)
// (例:__declspec(align(16)) unsigned char src[640*480];)
// wx:画像srcの幅(ピクセル)
// wy:画像srcの高さ(ピクセル)
//------------------------------------------------------------
//出力
// dst:書き込む8ビット画像のアドレス
// (dstは16バイト境界でアライメントされている必要がある)
// (例:__declspec(align(16)) unsigned char dst[320*240];)
//------------------------------------------------------------
//処理時間 CPU:Athlon64X2 4800+, OS:WinXP
// FIP_Quarter() : 0.06ms
// FIP_Quarter()_c : 0.22ms (C言語バージョン,速度比較用)


ダウンロード fiplib.h