分割的演算法
『壹』 圖像分割演算法能對每個圖像分割嗎
我當時做過用k-means進行圖像分割(當然是根據RGB在顏色空間中進行聚類 然後分割) 如果是指根據顏色對圖像進行分割的話 k-means應該是應用最廣泛的一種演算法了吧(因為簡單高效) 當然其他聚類演算法也可行 不過還是一樣 k-means的應用最廣泛 而且也有很多文章在討論濾波 降噪 把亮度 邊界效應 等因素考慮進來使分割效果更好 從我們當時的圖像分割的結果來看 k-means演算法的性能還是不錯的(實驗樣本採用的是UC Irvine Machine Learning Repository 主要測試了 CMU Face Images 和 Wine)
『貳』 在圖像處理中,有什麼演算法可以將目標分割成幾個部分
可以用閾值化技術、邊緣檢測、邊界跟蹤等等
至於演算法,有分水嶺演算法、各種門限運算元
灰度門限法(最大類間方差、最大後驗概率、最小風險法...)
『叄』 分割演算法
x沒有定義就使用了,定義一下,
要不然把Seg=zeros(x,y)
那句話不要了,只是一個初始化的命令,好像可以不要
『肆』 跪求圖像分割snake演算法詳細解釋
主要公式為曲線能量Esnake(公式1);Esnake由內部能量Eint(公式2)及外部能量Eext(公式3)組成;而根據公式2內部能量Eint是由一階導得到的平滑性約束(彈性繩子)二階導得到的氣球約束(剛性棍子)共同決定;根據公式3外部能Eext由梯度場決定(另一個分量不考慮)那麼粗略表示為Esnake=Vs+Vss+Eext;可以認為當Esnake的能量達到最小時snake曲線和物體的邊緣一致。
上面這些基本是每個論文上面都有的,下面照我的理解來講。結合很多論文上用的那個U形物體,snake檢測它的輪廓時,預先以一個圓形的像素圈套住它作為初始的snake線,可以取一定個數的點來離散化snake線,那麼這時就可以求這條snake線與原始圖像間的曲線能量Esnake了;Vs對應的是一階的平滑性,可轉化為snake線中相鄰像素之間的坐標差;差值越大能量越大平滑性也就越差;Vss對應的是二階的剛性;可轉化為snake線中某點和它相鄰的線上點間的法線方向的增長度量;Eext是梯度場能量,是由原本的灰度圖決定的,可轉化為snake中某點在灰度圖中的鄰域梯度。求出了這三個;再以一定的方式進行循環逼近那個使Esnake最小的snake線就找到了輪廓。
過獎了~我也是在研究中,你留個郵箱,我發個程序給你,看實例好理解點
『伍』 meanshift分割演算法
1.識別靜態的整個人體較難;即使識別出來結果也不可靠,所以現在主要以手勢/人臉識別為主;這是因為手和臉上面有比較獨特的特徵點。你說的濾波歸根結底還是要找出具有灰度跳變的高頻部分作為人體;這除非背景中除了人以外沒有其他突出的物體;否則光憑濾波二值法檢測人體是不太現實。
2 兩張圖片中人要是產生相對運動,檢測起來就容易多了;利用幀間差分找到圖像中灰度相差大的部分(你用的濾波也是一種手段);然後二值化區域連通;要是圖像中沒有其他移動物體計算連通區域的變動方向就是人的運動方向。
你可以去PUDN上搜搜相關的目標檢測的代碼;完全和你這個對應是不可能的。照你說的情況可以先建立起靜態背景的模型(或者直接在沒人的時候拍張);然後不斷的與這個背景做差,原理和幀間差分一樣。建議你先從典型的幀間差分常式開始下手(比如移動車輛的檢測,這個比較多)。
你在二值化之後加上一個區域連通的步驟;即使用膨脹或者閉運算;這樣你的輪廓就是連續的了;用matlab的話bwlabel可以統計連通區域裡面像素的個數也就是人體面積大小。質心就是橫豎坐標的平均值;取所有人體點的橫豎坐標分別累加;除以坐標總數得到的x和y平均值;這個就是質心了
『陸』 閾值分割的演算法或源代碼
http://www.tianyablog.com/blogger/post_show.asp?BlogID=282197&PostID=3491592&idWriter=0&Key=0
『柒』 計算機圖形學:線段剪裁中點分割演算法,要求用C++做,急求源代碼啊,謝謝! 752512212
#include <GL/glut.h>#include <stdlib.h>#include "iostream.h"int x0,y0,x1,y1;int Max(int a,int b,int c){ if(a>b) { if(a>c) return a; else return c; } else { if(b>c) return b; else return c; }}int Min(int a,int b,int c){ if(a<b) { if(a<c) return a; else return c; } else { if(b<c) return b; else return c; }}void DrawLine1(int x0,int y0,int x1,int y1){ int d,temp; temp=y0; d=2*(y1-y0)-(x1-x0); glBegin(GL_POINTS); glVertex2d(x0,y0); glEnd(); for(int k=x0+1;k<x1;k++) { if(d>=0) { glBegin(GL_POINTS); glVertex2d(k,temp+1); glEnd(); d=d+2*(y1-y0)-2*(x1-x0); temp=temp+1; } else { glBegin(GL_POINTS); glVertex2d(k,temp); glEnd(); d=d+2*(y1-y0); temp=temp; } } glBegin(GL_POINTS); glVertex2d(x1,y1); glEnd();}void DrawLine2(int x0,int y0,int x1,int y1){ int d,temp; temp=x0; d=2*(x1-x0)-(y1-y0); glBegin(GL_POINTS); glVertex2d(x0,y0); glEnd(); for(int k=y0+1;k<y1;k++) { if(d>=0) { glBegin(GL_POINTS); glVertex2d(temp+1,k); glEnd(); d=d+2*(x1-x0)-2*(y1-y0); temp=temp+1; } else { glBegin(GL_POINTS); glVertex2d(temp,k); glEnd(); d=d+2*(x1-x0); temp=temp; } } glBegin(GL_POINTS); glVertex2d(x1,y1); glEnd();}void DrawTriangle(int x0,int y0,int x1,int y1,int x2,int y2){ int xmin,xmax,ymin,ymax; float a,b,c; xmin=Min(x0,x1,x2); xmax=Max(x0,x1,x2); ymin=Min(y0,y1,y2); ymax=Max(y0,y1,y2); glColor3f(1.0f,0.0f,0.0f); glBegin(GL_POINTS); glVertex2d(x0,y0); glEnd(); glColor3f(0.0f,1.0f,0.0f); glBegin(GL_POINTS); glVertex2d(x1,y1); glEnd(); glColor3f(0.0f,0.0f,1.0f); glBegin(GL_POINTS); glVertex2d(x2,y2); glEnd(); for(float n=ymin;n<=ymax;n++) for(float m=xmin;m<xmax;m++) { a=((y1-y2)*m+(x2-x1)*n+x1*y2-x2*y1)/((y1-y2)*x0+(x2-x1)*y0+x1*y2-x2*y1); b=((y2-y0)*m+(x0-x2)*n+x2*y0-x0*y2)/((y2-y0)*x1+(x0-x2)*y1+x2*y0-x0*y2); c=((y0-y1)*m+(x1-x0)*n+x0*y1-x1*y0)/((y0-y1)*x2+(x1-x0)*y2+x0*y1-x1*y0); if(a>0 && b>0 && c>0) { float color0=a*1.0; float color1=b*1.0; float color2=c*1.0; glColor3f(color0,color1,color2); glBegin(GL_POINTS); glVertex2d(m,n); glEnd(); } } }void display(){/* clear all pixels */ glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glBegin(GL_POINTS); glVertex2d(x,y); 中間是點的坐標 glEnd(); */ /*下面的語句是畫一個白色的正方形*/ if((y1-y0)/(x1-x0)<=1) { DrawLine1(x0,y0,x1,y1); } else { DrawLine2(x0,y0,x1,y1); } DrawTriangle(35,35,135,185,235,35);/* don't wait! * start processing buffered OpenGL routines */ glFlush ();}void init (void) {/* select clearing color */ glClearColor (0.0, 0.0, 0.0, 0.0);/* initialize viewing values */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, 600, 0, 600);}/* * Declare initial window size, position, and display mode * (single buffer and RGBA). Open window with "hello" * in its title bar. Call initialization routines. * Register callback function to display graphics. * Enter main loop and process events. */int main(int argc, char** argv){ cout<<"input x0,y0,x1,y1 :"<<endl; cin>>x0>>y0>>x1>>y1; glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); //設置窗口大小,以像素為單位 glutInitWindowSize (600, 600); glutInitWindowPosition (100, 100); glutCreateWindow ("hello");
希望能夠幫助到你,望採納,謝謝!
『捌』 音樂分割演算法是什麼意思
摘要 你好,音樂分割演算法應該指的是切分音,切分音是一種節奏形式:三個組成音的第一個音與第三個音的時值總和、跟中間那個音的時值相等。