fw演算法
Ⅰ 寫出0/1背包問題的遞歸形式的回溯演算法
DKNAP(p2,w2,M2,n2)
float p2[],w2[];
float M2;
int n2;
{
int l,h,u,i,j,k,r,next;
int F[10],x[10];
float P[1000],W[1000],pp,ww,PX[10],WX[10],PY[10],c;
F[0]=1;
P[1]=W[1]=0;
l=h=1;
F[1]=next=2;
for (i=1; i<=n2; i++)
{
k=l;
r=l;
while (r<=h)
{
if (W[r]+w2[i]<=M2) r++;
else break;
}
u=r-1;
for (j=1; j<=u; j++)
{
pp=P[j]+p2[i];
ww=W[j]+w2[i];
while (k<=h && W[k]<ww)
{
P[next]=P[k];
W[next]=W[k];
next++;
k++;
}
if (k<鄭鉛瞎=h && W[k]==ww)
{
pp=max(pp,P[k]);
k++;
}
if (pp>P[next-1])
{
P[next]=pp;
W[next]=ww;
next++;
}
while (k<=h && P[k]<激洞=P[next-1]) k++;
}
while (k<=h)
{
P[next]=P[k];
W[next]=W[k];
next++;
k++;
}
//喊空對Si+1置初值
PX[i-1]=P[h];
WX[i-1]=W[h];
l=h+1;
h=next-1;
F[i+1]=next;
}
c=M2;
for (i=n2-1; i>=0;i--)
{
j=F[i];
while (j<=F[i+1]-1)
{
if (W[j]+w2[i+1]<=c) j++;
else break;
}
u=j-1;
if (u<F[i]) PY[i]=0;
else PY[i]=P[u]+p2[i+1];
if (PX[i]>PY[i]) x[i+1]=0;
else {x[i+1]=1; c=c-w2[i+1];}
//printf("%d",x[i+1]);
//printf("\n");
}
printf("0-1背包問題動態規劃方法的最優解x(n)如下:\n");
for (i=1;i<=n2;i++)
printf("%4d",x[i]);
printf("\n");
}
/////////////////////////////////////////////
BKNAP(p3,w3,M3,n3)
float p3[],w3[],M3;
int n3;
{
int k,i,j,y[10],x[10],b[10];
float cw,cp,fp,fw,a[10],s,t;
for (i=1;i<=n3;i++)
{
a[i]=p3[i]/w3[i];
b[i]=i;
}
for (j=1;j<=n3-1;j++)
{
for (i=1;i<=n3-j;i++)
if (a[i]<a[i+1])
{
s=a[i];a[i]=a[i+1];a[i+1]=s;
t=b[i];b[i]=b[i+1];b[i+1]=t;
};
}
for (i=1;i<=n3;i++)
printf("%4d\n",b[i]);
printf("\n");
cw=cp=0;
k=1;
fp=-1;
for (k=1;;k++)
{
while (k<=n3 && cw+w3[k]<=M3)
{
cw+=w3[k];
cp+=p3[k];
y[k]=1;
k++;
}
if (k>n3)
{
fp=cp;
fw=cw;
k=n3;
for (i=1;i<=k;i++)
x[b[i]]=y[i];
break;
}
else y[k]=0;
while (bound(cp,cw,k,M3,n3,w3,p3)<=fp)
{
while (k!=0 && y[k]!=1)
k-=1;
if (k==0) return;
y[k]=0;
cw-=w3[k];
cp-=p3[k];
}
}
printf("0-1背包問題回溯方法的最優解x(n)如下:\n");
for (i=1; i<=n3; i++)
{
//j=b[i];
printf("%4d",x[i]);
}
printf("\n");
printf("%4f,%4f",fp,fw);
printf("\n");
}
float bound(zp,zw,k,M4,n4,ww,pp)
float zp,zw,M4,ww[],pp[];
int k,n4;
{
int i;
float b,c;
b=zp;c=zw;
for (i=k+1;i<=n4;i++)
{
c+=ww[i];
if (c<=M4) b+=pp[i];
else return (b+(1-(c-M4)/ww[i])*pp[i]);
}
return (b);
}
Ⅱ 求用matlab實現fw演算法
把算式寫一下,表述太不具體。
Ⅲ 交通配流裡面的MSA方法是一種FW演算法嗎
不是,二者思想不同。
Ⅳ knn是什麼意思
作為一種非參數的分類演算法,K-近鄰(KNN)演算法是非常有效和容易實現的。它已經廣泛應用於分類、回歸和模式識別等。
在應用KNN演算法解決問題的時候,要注意兩個方面的問題——樣本權重和特徵權重。利用SVM來確定特徵的權重,提出了基於SVM的特徵加權演算法(FWKNN,featureweightedKNN)。實驗表明,在一定的條件下,FWKNN能夠極大地提高分類准確率。
(4)fw演算法擴展閱讀:
KNN(K- Nearest Neighbor)法即K最鄰近法,最初由 Cover和Hart於1968年提出,是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路非常簡單直觀:
如果一個樣本在特徵空間中的K個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
Ⅳ 國內有哪些好的數據可視化工具,推薦一下
誠然,數據可視化可謂是數據分析工作的最後一道工序,前面的作業做得再好,如果不能很好地展現出來,那就算是臨門一腳、功虧一簣了……下面給大家列出好用的數據可視化工具清單,希望可以為你的學習或工作帶來一些幫助。
1、強大的R可視化包-ggplot2
R是一款偏向於統計分析的腳本語言軟體,基於S語言開發,如果你是R語言忠實fans,我相信你一定不會不知道R里單獨的一個繪圖包—ggplot2,之所以給ggplot2「強大」的頭銜,一方面確實能夠輕松應付各個領域的圖像繪制,靜態的,動態的,說的出名字的,個性化特製的;另一方面小編就是學統計學的,自然相對熟悉這個包。
ggplot2由Hadley Wickham在2005年創造。受歡迎的原因是將圖形分解為語素(如尺度、圖層)的思想。ggplot2可以作為R語言基礎繪圖包的替代,同時ggplot2預設有多種印刷及網頁尺寸。
當然有些數據分析軟體也帶透視表、繪圖功能,如MySQL、SPSS,但數據可視化不作為主要功能,這里就不如上面較詳細說了。
Ⅵ 義大利格子乘法532×48演算法詳細點 謝謝
結果為:25536
解題過程:
解析:
先畫一個矩形,把它分成4×3個小格,在小格邊上依次寫下因數、因數的各位數字,再用對角線把小格一分為二,分別記錄上述各位數字相應乘積的十位數與個位數,把這些乘積由右到左,沿斜線方向相加,相加滿十時要向前進一。最後得到532×48=所列的答案25536。
(6)fw演算法擴展閱讀
運演算法則:
在四上數學書上有,先把因數分別寫在上和右邊,然後算6*7=42,寫在右上角的格子上,4寫左邊,2寫右邊,以此類推,填好格子;最後,把同一斜線上的數相加:0落下;2+3+0=5,5寫在下左方;4+8+2=14,向前進一位,4寫在左下方;2+1=3,3寫在左上方,因此得到:46*75=3450。
起源:
這種方法是最早記載在1150年印度數學家婆什迦羅的《麗羅娃提》一書中,12世紀以後廣泛流傳於阿拉伯地區,後來通過阿拉伯人傳人歐洲,並很快在歐洲流行,這種方法後來傳入中國,明朝數學家程大位在《演算法統宗》一書中把它稱為「鋪地錦」。
Ⅶ web前端開發都包括哪些技術
1、學會HTML
HTML是網頁內容的載體內容就是網頁製作者放在頁面上想要讓用戶瀏覽的信息,可以包含文字、圖片、視頻等。要熟練掌握div、table、ul li 、p、span等這些標簽,這些都是最常用的。
2、學習CSS(Cascading Style Sheets)—樣式。
一般看到web前端開發工程師的要求裡面,有一個會使用css+html 或者 css+div 來進行界面布局,所以css是用於輔助html來布局和展示的,
稱之為「css樣式」,CSS要熟練掌握float、position、width、height,以及對於的最大最小、會使用百分百、overflow、margin、padding,標題字體、顏色變化,或為標題加入背景圖片、邊框等等,這些都是跟布局有關系的樣式,必須要掌握的。
3、JS(java)—— 行為
java是用來實現網頁上的特效效果。如:滑鼠滑過彈出下拉菜單。或滑鼠滑過表格的背景顏色改變。還有焦點新聞(新聞圖片)的輪換。可以這么理解,有動畫的,有交互的一般都是用Java來實現的。
4、學習jquery
jquery是相當於把js封裝了一套的一個js插件,目的就是操作起來更方便,代碼寫的更少,jquery入門也很簡單,那些是入門需要學的和js一樣,只是換成了jq的代碼.其他的一樣網路就夠了。
5、最好會點後台語言,比如java、php,因為前台界面的數據都是從後台來的,如果會點後台代碼,就知道怎麼跟後台交互數據是最好的, 這樣節約時間,也可以讓前端代碼更規范.不然可能因為你的寫法和後端給來的數據不能結合上,那麼前端代碼又得重新寫,那就更麻煩了。
Ⅷ 求哈夫曼編碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//////////////////////////////////////////////////////////////////////////////
/*定義赫夫曼樹結點的結構體變數,存放結點的權值、字元、雙親、坐孩子和右孩子*/
typedef struct{
int weight;
char ch; //增加一個域嘩嘩用於存放該節點的字元
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode; //指向赫夫曼編碼的指針
//////////////////////////////////////////////////////////////////////////////
/*本程序用到的函數原型*/
void welcome(); //列印操作選擇界面
void HuffmanCoding(HuffmanTree &,char *,int *,int);//建立赫夫曼樹的演算法
void select(HuffmanTree HT,int j,int *s1,int *s2); //從目前已建好的赫夫曼樹中選擇parent為0且weight最小的兩個結點
void Init(); //輸入n個字元及其對應的權值,根據權值建立哈夫曼樹
void Coding(); //編碼
void Decoding(); //解碼
void Print_code(); //打扮蘆森印解碼好的代碼文件
void Print_tree(); //以凹凸表形式列印哈夫曼樹
int Read_tree(HuffmanTree &); //從文件中讀入赫夫曼樹
void find(HuffmanTree &HT,char *code,char *text,int i,int m);//解碼時根據01字元串尋找相應葉子節點的遞歸演算法
void Convert_tree(unsigned char T[100][100],int s,int *i,int j);//將內存中的赫夫曼樹轉換成凹凸表形式的赫夫曼樹
HuffmanTree HT; //全局變數,指向存放赫夫曼樹的存儲空間
int n=0; //全局變數,存放赫夫曼樹葉子結點的數目
int main()
{
char select;
while(1)
{
welcome();
scanf("%c",&select);
switch(select)
{
case 'i':
case 'I':Init();break;
case 'c':
case 'C':Coding();break;
case 'd':
case 'D':Decoding();break;
case 'p':
case 'P':Print_code();break;
case 't':
case 'T':Print_tree();break;
case 'e':
case 'E':exit(1);
default :printf("Input error!\n");
}
getchar();
}
return 0;
}
void welcome() //列印操作選擇界面
{
printf("*-----------------------------------------------------*\n");
printf("| What do you want to do? |\n");
printf("|-----------------------------------------------------|\n");
printf("| |\n");
printf("| I--------------------------Init the Huffman tree. |\n");
printf("| C--------------------------Code your file. |\n"廳畝);
printf("| D--------------------------Decode the code. |\n");
printf("| P--------------------------Print the codefile. |\n");
printf("| T--------------------------Print the Huffman tree. |\n");
printf("| |\n");
printf("*-----------------------------------------------------*\n");
}
//////////////////////////////////////////////////////////////////////////////////////
/*初始化函數,輸入n個字元及其對應的權值,根據權值建立哈夫曼樹,並將其存於文件hfmtree中*/
void Init()
{
FILE *fp;
int i,n,w[52]; //w數組存放n個字元的權值
char character[52]; //存放n個字元
printf("\n輸入字元個數 n:");
scanf("%d",&n); //輸入字元集大小
printf("輸入%d個字元及其對應的權值:\n",n);
for (i=0;i<n;i++)
{
char b=getchar();
scanf("%c",&character[i]);
scanf("%d",&w[i]); //輸入n個字元和對應的權值
}
HuffmanCoding(HT,character,w,n); //建立赫夫曼樹
if((fp=fopen("hfmtree.txt","w"))==NULL)
printf("Open file hfmtree.txt error!\n");
for (i=1;i<=2*n-1;i++)
{
if(fwrite(&HT[i],sizeof(HTNode),1,fp)!=1) //將建立的赫夫曼樹存入文件hfmtree.txt中
printf("File write error!\n");
}
printf("\n建立赫夫曼樹成功,已將其存於文件hfmtree.txt中\n");
fclose(fp);
}
///////////////////////////////////////////////////////////////////////////////////
//////建立赫夫曼樹的演算法///////////////////////////////////////////////////////////
void HuffmanCoding(HuffmanTree &HT,char *character,int *w,int n)
{
int m,i,s1,s2;
HuffmanTree p;
if(n<=1) return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1;i<=n;++i,++p,++character,++w)
{p->ch=*character;p->weight=*w;p->parent=0;p->lchild=0;p->rchild=0;}
for(;i<=m;++i,++p) {p->ch=0;p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;}
for(i=n+1;i<=m;++i)
{
select(HT,i-1,&s1,&s2);
HT[s1].parent=i;HT[s2].parent=i;
HT[i].lchild=s1;HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
}
///////////////////////////////////////////////////////////////////////////////
/*從HT[1]到HT[j]中選擇parent為0且weight最小的兩個結點,用s1和s2返回其序號*/
void select(HuffmanTree HT,int j,int *s1,int *s2)
{
int i;
//找weight最小的結點
for (i=1;i<=j;i++)
if (HT[i].parent==0)
{*s1=i;break;}
for (;i<=j;i++)
if ((HT[i].parent==0)&&(HT[i].weight<HT[*s1].weight))
*s1=i;
HT[*s1].parent=1;
//找weight次小的結點
for (i=1;i<=j;i++)
if (HT[i].parent==0)
{*s2=i;break;}
for (;i<=j;i++)
if ((HT[i].parent==0)&&(i!=*s1)&&(HT[i].weight<HT[*s2].weight))
*s2=i;
}
///////////////////////////////////////////////////////////////////////////////
/*對文件tobetrans中的正文進行編碼,然後將結果存入文件codefile中*/
void Coding()
{
FILE *fp,*fw;
int i,f,c,start;
char *cd;
HuffmanCode HC;
if(n==0)
n=Read_tree(HT);//從文件hfmtree.txt中讀入赫夫曼樹,返回葉子結點數
/////以下程序段求赫夫曼樹中各葉子節點的字元對應的的編碼,並存於HC指向的空間中
{
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;++i)
{
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
if(HT[f].lchild==c)
cd[--start]='0';
else cd[--start]='1';
HC[i]=(char *)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
}
/////////////////////////////////////////////////////////////////////////////////////
if((fp=fopen("tobetrans.txt","rb"))==NULL)
printf("Open file tobetrans.txt error!\n");
if((fw=fopen("codefile.txt","wb+"))==NULL)
printf("Open file codefile.txt error!\n");
char temp;
fscanf(fp,"%c",&temp); //從文件讀入第一個字元
while(!feof(fp))
{
for(i=1;i<=n;i++)
if(HT[i].ch==temp) break; //在赫夫曼樹中查找字元所在的位置
for(int r=0;HC[i][r]!='\0';r++) //將字元對應的編碼存入文件
fputc(HC[i][r],fw);
fscanf(fp,"%c",&temp); //從文件讀入下一個字元
}
fclose(fw);
fclose(fp);
printf("\n對文件hfmtree.txt編碼成功,結果已存入codefile.txt中。\n\n");
}
/////////////////////////////////////////////////////////////////////////
/*將文件codefile中的代碼進行解碼,結果存入文件textfile中*/
void Decoding()
{
FILE *fp,*fw;
int m,i;
char *code,*text,*p;
if(n==0)
n=Read_tree(HT);//從文件hfmtree.txt中讀入赫夫曼樹,返回葉子結點數
if((fp=fopen("codefile.txt","rb"))==NULL)
printf("Open file codefile.txt error!\n");
if((fw=fopen("textfile.txt","wb+"))==NULL)
printf("Open file textfile.txt error!\n");
code=(char *)malloc(sizeof(char));
fscanf(fp,"%c",code); //從文件讀入一個字元
for(i=1;!feof(fp);i++)
{
code=(char *)realloc(code,(i+1)*sizeof(char)); //增加空間
fscanf(fp,"%c",&code[i]); //從文件讀入下一個字元
}
code[i-1]='\0';
/////////到此codefile.txt文件中的字元已全部讀入,存放在code數組中
text=(char *)malloc(100*sizeof(char));
p=text;
m=2*n-1;
if(*code=='0')
find(HT,code,text,HT[m].lchild,m); //從根節點的左子樹去找
else
find(HT,code,text,HT[m].rchild,m); //從根節點的右子樹去找
for(i=0;p[i]!='\0';i++) //把解碼好的字元存入文件textfile.txt中
fputc(p[i],fw);
fclose(fp);
fclose(fw);
printf("\n對codefile.txt文件解碼成功,結果已存入textfile.txt文件。\n\n");
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
/*將文件codefi1e以緊湊格式顯示在終端上,每行50個代碼。同時將此字元形式的編碼文件寫入文件codeprint中。*/
void Print_code()
{
FILE *fp,*fw;
char temp;
int i;
if((fp=fopen("codefile.txt","rb"))==NULL)
printf("Open file codefile.txt error!\n");
if((fw=fopen("codeprint.txt","wb+"))==NULL)
printf("Open file codeprint.txt error!\n");
printf("\n文件codefi1e以緊湊格式顯示如下:\n");
fscanf(fp,"%c",&temp); //從文件讀入一個字元
for (i=1;!feof(fp);i++)
{
printf("%c",temp);
if(i%50==0) printf("\n");
fputc(temp,fw); //將該字元存入文件codeprint.txt中
fscanf(fp,"%c",&temp); //從文件讀入一個字元
}
printf("\n\n此字元形式的編碼已寫入文件codeprint.txt中.\n\n");
fclose(fp);
fclose(fw);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
/*將已在內存中的哈夫曼樹以凹凸表形式顯示在屏幕上,同時將此字元形式的哈夫曼樹寫入文件treeprint中。*/
void Print_tree()
{
unsigned char T[100][100];
int i,j,m=0;
FILE *fp;
if(n==0)
n=Read_tree(HT);//從文件hfmtree.txt中讀入赫夫曼樹,返回葉子結點數
Convert_tree(T,0,&m,2*n-1); //將內存中的赫夫曼樹轉換成凹凸表形式的樹,存於數組T中
if((fp=fopen("treeprint.txt","wb+"))==NULL)
printf("Open file treeprint.txt error!\n");
printf("\n以凹凸表形式列印已建好的赫夫曼樹:\n");
for(i=1;i<=2*n-1;i++)
{
for (j=0;T[i][j]!=0;j++)
{
if(T[i][j]==' ') {printf(" ");fputc(T[i][j],fp);}
else
{printf("%d",T[i][j]);fprintf(fp,"%d\n",T[i][j]);}
}
printf("\n");
}
fclose(fp);
printf("\n此字元形式的哈夫曼樹已寫入文件treeprint.txt中.\n\n");
}
//////////////////////////////////////////////////////////////////////////////////
/*從文件hfmtree.txt中讀入赫夫曼樹,返回葉子節點數*/
int Read_tree(HuffmanTree &HT)
{
FILE *fp;
int i,n;
HT=(HuffmanTree)malloc(sizeof(HTNode));
if((fp=fopen("hfmtree.txt","r"))==NULL)
printf("Open file hfmtree.txt error!\n");
for (i=1;!feof(fp);i++)
{
HT=(HuffmanTree)realloc(HT,(i+1)*sizeof(HTNode)); //增加空間
fread(&HT[i],sizeof(HTNode),1,fp); //讀入一個節點信息
}
fclose(fp);
n=(i-1)/2;
return n;
}
////////////////////////////////////////////////////////////////
/*解碼時根據01字元串尋找相應葉子節點的遞歸演算法*/
void find(HuffmanTree &HT,char *code,char *text,int i,int m)
{
if(*code!='\0') //若解碼未結束
{
code++;
if(HT[i].lchild==0&&HT[i].rchild==0) //若找到葉子節點
{
*text=HT[i].ch; //將葉子節點的字元存入text中
text++;
if((*code=='0'))
find(HT,code,text,HT[m].lchild,m); //繼續從根節點的左子樹找
else
find(HT,code,text,HT[m].rchild,m); //繼續從根節點的右子樹找
}
else //如果不是葉子節點
if(*code=='0')
find(HT,code,text,HT[i].lchild,m); //從該節點的左子樹去找
else
find(HT,code,text,HT[i].rchild,m); //從該節點的右子樹去找
}
else
*text='\0'; //解碼結束
}
////////////////////////////////////////////////////////////////////////
/*將內存中的赫夫曼樹轉換成凹凸表形式的赫夫曼樹*/
void Convert_tree(unsigned char T[100][100],int s,int *i,int j)
{
int k,l;
l=++(*i);
for(k=0;k<s;k++)
T[l][k]=' ';
T[l][k]=HT[j].weight;
if(HT[j].lchild)
Convert_tree(T,s+1,i,HT[j].lchild);
if(HT[j].rchild)
Convert_tree(T,s+1,i,HT[j].rchild);
T[l][++k]='\0';
}
自己改改吧!
Ⅸ java數字圖像處理常用演算法
一 讀取bmp圖片數據
// 獲取待檢測圖像 數據保存在數組 nData[] nB[] nG[] nR[]中
public void getBMPImage(String source) throws Exception { clearNData(); //清除數據保存區 FileInputStream fs = null; try { fs = new FileInputStream(source); int bfLen = ; byte bf[] = new byte[bfLen]; fs read(bf bfLen); // 讀取 位元組BMP文件頭 int biLen = ; byte bi[] = new byte[biLen]; fs read(bi biLen); // 讀取 位元組BMP信息頭
// 源圖寬度 nWidth = (((int) bi[ ] & xff) << ) | (((int) bi[ ] & xff) << ) | (((int) bi[ ] & xff) << ) | (int) bi[ ] & xff;
// 源圖高度 nHeight = (((int) bi[ ] & xff) << ) | (((int) bi[ ] & xff) << ) | (((int) bi[ ] & xff) << ) | (int) bi[ ] & xff;
// 位數 nBitCount = (((int) bi[ ] & xff) << ) | (int) bi[ ] & xff;
// 源圖大小 int nSizeImage = (((int) bi[ ] & xff) << ) | (((int) bi[ ] & xff) << ) | (((int) bi[ ] & xff) << ) | (int) bi[ ] & xff;
// 對 位BMP進行解析 if (nBitCount == ){ int nPad = (nSizeImage / nHeight) nWidth * ; nData = new int[nHeight * nWidth]; nB=new int[nHeight * nWidth]; nR=new int[nHeight * nWidth]; nG=new int[nHeight * nWidth];鍵帶 byte bRGB[] = new byte[(nWidth + nPad) * * nHeight]; fs read(bRGB (nWidth + nPad) * * nHeight); int nIndex = ; for (int j = ; j < nHeight; j++){ for (int i = ; i < nWidth; i++) { nData[nWidth * (nHeight j ) + i] = ( & xff) << | (((int) bRGB[nIndex + ] & xff) << ) | (((int) bRGB[nIndex + ] & xff) << ) | (int) bRGB[nIndex] & xff; nB[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex]& xff; nG[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex+ ]& xff; nR[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex+ ]& xff;稿物蘆 nIndex += ; } nIndex += nPad; }// Toolkit kit = Toolkit getDefaultToolkit();// image = kit createImage(new MemoryImageSource(nWidth nHeight // nData nWidth));
/*螞冊 //調試數據的讀取
FileWriter fw = new FileWriter( C:\Documents and Settings\Administrator\My Documents\nDataRaw txt );//創建新文件 PrintWriter out = new PrintWriter(fw); for(int j= ;j<nHeight;j++){ for(int i= ;i<nWidth;i++){ out print(( * +nData[nWidth * (nHeight j ) + i])+ _ +nR[nWidth * (nHeight j ) + i]+ _ +nG[nWidth * (nHeight j ) + i]+ _ +nB[nWidth * (nHeight j ) + i]+ ); } out println( ); } out close();*/ } } catch (Exception e) { e printStackTrace(); throw new Exception(e); } finally { if (fs != null) { fs close(); } } // return image; }
二由r g b 獲取灰度數組
public int[] getBrightnessData(int rData[] int gData[] int bData[]){ int brightnessData[]=new int[rData length]; if(rData length!=gData length || rData length!=bData length || bData length!=gData length){ return brightnessData; } else { for(int i= ;i<bData length;i++){ double temp= *rData[i]+ *gData[i]+ *bData[i]; brightnessData[i]=(int)(temp)+((temp (int)(temp))> ? : ); } return brightnessData; } }
三 直方圖均衡化
public int [] equilibrateGray(int[] PixelsGray int width int height) { int gray; int length=PixelsGray length; int FrequenceGray[]=new int[length]; int SumGray[]=new int[ ]; int ImageDestination[]=new int[length]; for(int i = ; i <length ;i++) { gray=PixelsGray[i]; FrequenceGray[gray]++; } // 灰度均衡化 SumGray[ ]=FrequenceGray[ ]; for(int i= ;i< ;i++){ SumGray[i]=SumGray[i ]+FrequenceGray[i]; } for(int i= ;i< ;i++) { SumGray[i]=(int)(SumGray[i]* /length); } for(int i= ;i<height;i++) { for(int j= ;j<width;j++) { int k=i*width+j; ImageDestination[k]= xFF | ((SumGray[PixelsGray[k]]<< ) | (SumGray[PixelsGray[k]]<< ) | SumGray[PixelsGray[k]]); } } return ImageDestination; }
四 laplace 階濾波 增強邊緣 圖像銳化
public int[] laplace DFileter(int []data int width int height){ int filterData[]=new int[data length]; int min= ; int max= ; for(int i= ;i<height;i++){ for(int j= ;j<width;j++){ if(i== || i==height || j== || j==width ) filterData[i*width+j]=data[i*width+j]; else filterData[i*width+j]= *data[i*width+j] data[i*width+j ] data[i*width+j+ ] data[(i )*width+j] data[(i )*width+j ] data[(i )*width+j+ ] data[(i+ )*width+j] data[(i+ )*width+j ] data[(i+ )*width+j+ ]; if(filterData[i*width+j]<min) min=filterData[i*width+j]; if(filterData[i*width+j]>max) max=filterData[i*width+j]; } }// System out println( max: +max);// System out println( min: +min); for(int i= ;i<width*height;i++){ filterData[i]=(filterData[i] min)* /(max min); } return filterData; }
五 laplace 階增強濾波 增強邊緣 增強系數delt
public int[] laplaceHigh DFileter(int []data int width int height double delt){ int filterData[]=new int[data length]; int min= ; int max= ; for(int i= ;i<height;i++){ for(int j= ;j<width;j++){ if(i== || i==height || j== || j==width ) filterData[i*width+j]=(int)(( +delt)*data[i*width+j]); else filterData[i*width+j]=(int)(( +delt)*data[i*width+j] data[i*width+j ]) data[i*width+j+ ] data[(i )*width+j] data[(i )*width+j ] data[(i )*width+j+ ] data[(i+ )*width+j] data[(i+ )*width+j ] data[(i+ )*width+j+ ]; if(filterData[i*width+j]<min) min=filterData[i*width+j]; if(filterData[i*width+j]>max) max=filterData[i*width+j]; } } for(int i= ;i<width*height;i++){ filterData[i]=(filterData[i] min)* /(max min); } return filterData; } 六 局部閾值處理 值化
// 局部閾值處理 值化 niblack s method /*原理 T(x y)=m(x y) + k*s(x y) 取一個寬度為w的矩形框 (x y)為這個框的中心 統計框內數據 T(x y)為閾值 m(x y)為均值 s(x y)為均方差 k為參數(推薦 )計算出t再對(x y)進行切割 / 這個演算法的優點是 速度快 效果好 缺點是 niblack s method會產生一定的雜訊 */ public int[] localThresholdProcess(int []data int width int height int w int h double coefficients double gate){ int[] processData=new int[data length]; for(int i= ;i<data length;i++){ processData[i]= ; } if(data length!=width*height) return processData; int wNum=width/w; int hNum=height/h; int delt[]=new int[w*h]; //System out println( w; +w+ h: +h+ wNum: +wNum+ hNum: +hNum); for(int j= ;j<hNum;j++){ for(int i= ;i<wNum;i++){ //for(int j= ;j< ;j++){ //for(int i= ;i< ;i++){ for(int n= ;n<h;n++) for(int k= ;k<w;k++){ delt[n*w+k]=data[(j*h+n)*width+i*w+k]; //System out print( delt[ +(n*w+k)+ ]: +delt[n*w+k]+ ); } //System out println(); /* for(int n= ;n<h;n++) for(int k= ;k<w;k++){ System out print( data[ +((j*h+n)*width+i*w+k)+ ]: +data[(j*h+n)*width+i*w+k]+ ); } System out println(); */ delt=thresholdProcess(delt w h coefficients gate); for(int n= ;n<h;n++) for(int k= ;k<w;k++){ processData[(j*h+n)*width+i*w+k]=delt[n*w+k]; // System out print( delt[ +(n*w+k)+ ]: +delt[n*w+k]+ ); } //System out println(); /* for(int n= ;n<h;n++) for(int k= ;k<w;k++){ System out print( processData[ +((j*h+n)*width+i*w+k)+ ]: +processData[(j*h+n)*width+i*w+k]+ ); } System out println(); */ } } return processData; }
七 全局閾值處理 值化
public int[] thresholdProcess(int []data int width int height double coefficients double gate){ int [] processData=new int[data length]; if(data length!=width*height) return processData; else{ double sum= ; double average= ; double variance= ; double threshold; if( gate!= ){ threshold=gate; } else{ for(int i= ;i<width*height;i++){ sum+=data[i]; } average=sum/(width*height); for(int i= ;i<width*height;i++){ variance+=(data[i] average)*(data[i] average); } variance=Math sqrt(variance); threshold=average coefficients*variance; } for(int i= ;i<width*height;i++){ if(data[i]>threshold) processData[i]= ; else processData[i]= ; } return processData; } }
八 垂直邊緣檢測 sobel運算元
public int[] verticleEdgeCheck(int []data int width int height int sobelCoefficients) throws Exception{ int filterData[]=new int[data length]; int min= ; int max= ; if(data length!=width*height) return filterData; try{ for(int i= ;i<height;i++){ for(int j= ;j<width;j++){ if(i== || i== || i==height || i==height ||j== || j== || j==width || j==width ){ filterData[i*width+j]=data[i*width+j]; } else{ double average; //中心的九個像素點 //average=data[i*width+j] Math sqrt( )*data[i*width+j ]+Math sqrt( )*data[i*width+j+ ] average=data[i*width+j] sobelCoefficients*data[i*width+j ]+sobelCoefficients*data[i*width+j+ ] data[(i )*width+j ]+data[(i )*width+j+ ] data[(i+ )*width+j ]+data[(i+ )*width+j+ ]; filterData[i*width+j]=(int)(average); } if(filterData[i*width+j]<min) min=filterData[i*width+j]; if(filterData[i*width+j]>max) max=filterData[i*width+j]; } } for(int i= ;i<width*height;i++){ filterData[i]=(filterData[i] min)* /(max min); } } catch (Exception e) { e printStackTrace(); throw new Exception(e); } return filterData; }
九 圖像平滑 * 掩模處理(平均處理) 降低雜訊
lishixin/Article/program/Java/hx/201311/26286