harris 演算法的python實現,harrispython
harris 作為最常用的特徵點檢測演算法。
第一個檔案harris.py
<pre name="code" class="python">from scipy.ndimage import filtersfrom numpy import *from pylab import *def compute_harris_response(im,sigma=3): imx=zeros(im.shape)#計算導數 filters.gaussian_filter(im,(sigma,sigma),(0,1),imx) imy=zeros(im.shape) filters.gaussian_filter(im,(sigma,sigma),(1,0),imy) Wxx=filters.gaussian_filter(imx*imx,sigma) #計算harris矩陣分量 Wxy=filters.gaussian_filter(imx*imy,sigma) Wyy=filters.gaussian_filter(imy*imy,sigma) Wdet=Wxx*Wyy-Wxy**2 #計算矩陣的特徵值和跡 Wtr=Wxx+Wyy return Wdet/Wtrdef get_harris_points(harrisim,min_dist=10,threshold=0.1): conner_threshold=harrisim.max()*threshold harrisim_t=(harrisim>conner_threshold)*1 coords=array(harrisim_t.nonzero()).T candidate_values=[harrisim[c[0],c[1]] for c in coords] index=argsort(candidate_values) allowed_locations=zeros(harrisim.shape) allowed_locations[min_dist:-min_dist,min_dist:-min_dist]=1 filtered_coords=[] for i in index: if allowed_locations[coords[i,0],coords[i,1]]==1: filtered_coords.append(coords[i]) allowed_locations[(coords[i,0]-min_dist):(coords[i,0]+min_dist),(coords[i,1]-min_dist):(coords[i,1]+min_dist)]=0#此處保證min_dist*min_dist只有一個harris特徵點 return filtered_coordsdef plot_harris_points(image,filtered_coords): figure() gray() imshow(image) plot([p[1] for p in filtered_coords],[p[0]for p in filtered_coords],'+') axis('off') show()
第二個檔案測試演算法
from PIL import Imagefrom numpy import *import harrisfrom pylab import *from scipy.ndimage import filtersim=array(Image.open('33.jpg').convert('L'))harrisim=harris.compute_harris_response(im)filtered_coords=harris.get_harris_points(harrisim)harris.plot_harris_points(im,filtered_coords)
用Python怎 實現DES演算法
原創的嘛,自己寫唄。DES安全性沒其他演算法那麼高,應該不會很複雜、
Python中prim演算法或kruscal演算法的實現
kruskal:
#include "stdio.h"
#include "stdlib.h"
#include "iostream"
using namespace std;
#define MAXE 100 //MAXE為最大的邊數
struct edges
{
int bv,tv,w; //邊集類型,儲存一條邊的起始頂點bv、終止頂點tv和權w
}edges;
typedef struct edges edgeset[MAXE];
//尋找v所在的連通集
int seeks(int set[],int v)
{
int i=v;
while (set[i]>0)
i=set[i];
return i;
}
void kruskal(edgeset ge,int n,int e)
{
int set[MAXE],v1,v2,i,j;
for(i=1;i<=n;i++)
set[i]=0;
i=1; //i表示待擷取的產生樹中的邊數,初值為1
j=1; //j表示ge中的下標,初值為1
while(j<n&&i<=e)//按邊權遞增順序,逐邊檢查該邊是否應加入到產生樹中
{
v1=seeks(set,ge[i].bv); //確定頂點v所在的連通集
v2=seeks(set,ge[i].tv);
cout<<ge[i].bv<<":"<<v1<<", "<<ge[i].tv<<":"<<v2<<endl;
if(v1!=v2) //當v1,v2不在同一頂點集合,確定該邊應當選入產生樹
{
cout<<"("<<ge[i].bv<<", "<<ge[i].tv<<") "<<ge[i].w<<endl;
set[v1]=v2;
j++;
}
i++;
}
}
int main()
{
edgeset ee;
int n,e; //n是圖的結點數,e是圖的邊數
n=6;
e=3;
for(int i=1;i<=e;i++)
{
scanf_s("%d",&ee[i].bv);
scanf_s("%d",&ee[i].tv);
scanf_s("%d",&ee[i].w);
}
//ee表示的邊集圖是按權值從小到大排列的
printf("最小產生樹邊集及它的權值: \n");
kruskal(ee,n,e);
system(......餘下全文>>