當前位置:首頁 » 操作系統 » 分割演算法

分割演算法

發布時間: 2022-01-25 19:47:47

① 圖像分割演算法分為幾類

從學術角度講圖像分割主要分成3大類,一是基於邊緣的,二是基於區域的,三是基於紋理的。由於基於紋理的也可以看成是基於區域的,所以有些專家也把分割方法分成基於邊緣和基於區域兩大類。
選擇演算法的時候主要參考你要分割的圖像樣本的特點。
如果圖像的邊界特別分明,比如綠葉和紅花,在邊界處紅綠明顯不同,可以精確提取到邊界,這時候用基於邊緣的方法就可行。但如果是像醫學圖像一樣,輪廓不是特別明顯,比如心臟圖像,左心房和左心室顏色比較接近,它們之間的隔膜僅僅是顏色比它們深一些,但是色彩上來說很接近,這時候用基於邊緣的方法就不合適了,用基於區域的方法更好。再比如帶紋理的圖像,例如條紋衫,如果用基於邊緣的方法很可能就把每一條紋都分割成一個物體,但實際上衣服是一個整體,這時候用基於紋理的方法就能把紋理相同或相似的區域分成一個整體。
不過總體來說,基於區域的方法近些年更熱一些,如Meanshift分割方法、測地線活動輪廓模型、JSEG等。

② 分割演算法

x沒有定義就使用了,定義一下,
要不然把Seg=zeros(x,y)
那句話不要了,只是一個初始化的命令,好像可以不要

③ 一段代碼,求教.k-means演算法的分割

A=imread('1.jpg');
figure;
imshow(A);
title('Hawk');
cform=makecform('srgb2lab');
lab_A=applycform(A,cform); 這里為什麼要轉去lab空間,其他的轉換不好用嗎?對於顏色分割的吧 lab空間相互分量聯系性比較小 利於分割
ab = double(lab_A(:,:,2:3));
nrows = size(ab,1);
ncols = size(ab,2);
ab = reshape(ab,nrows*ncols,2);矩陣轉換類型轉換為double型,這里的轉換有其他的靈活用法嗎?
nColors =2;
% 採用k-means方法實現聚類,重復三次
[cluster_idx cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...
'Replicates',3); 這一段東西後面的省略號是啥意思啊?省略號表示一行寫不完 分行的 意思就是kmeans(ab,nColors,'distance','sqEuclidean', 'Replicates',3); 一樣的
%對不同的類別進行標志

④ 計算機圖形學:線段剪裁中點分割演算法,要求用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");
希望能夠幫助到你,望採納,謝謝!

⑤ 如何分析一個圖像分割演算法

論文閱讀筆記:圖像分割方法deeplab以及Hole演算法解析
deeplab發表在ICLR
2015上。論文下載地址:Semantic
Image
Segmentation
with
Deep
Convolutional
Nets
and
Fully
Connected
CRFS.
deeplab方法概述
deeplab方法分為兩步走,第一步仍然採用了FCN得到
coarse
score
map並插值到原圖像大小,然後第二步借用fully
connected
CRF對從FCN得到的分割結果進行細節上的refine。
下面這張圖很清楚地展示了整個結構:
然後這張圖展示了CRF處理前後的效果對比,可以看出用了CRF以後,細節確實改善了很多:
deeplab對FCN更加優雅的處理方式
在第一步中,deeplab仍然採用了FCN來得到score
map,並且也是在VGG網路上進行fine-tuning。但是在得到score
map的處理方式上,要比原FCN處理的優雅很多。
還記得CVPR
2015的FCN中是怎麼得到一個更加dense的score
map的嗎?
是一張500x500的輸入圖像,直接在第一個卷積層上conv1_1來了一個100的大padding。最終在fc7層勉強得到一個16x16的score
map。雖然處理上稍顯粗糙,但是畢竟人家是第一次將圖像分割在CNN上搞成end-to-end,並且在當時performance是state-of-the-art,也很理解。
deeplab摒棄了這種做法,取而代之的是對VGG的網路結構上做了小改動:將VGG網路的pool4和pool5層的stride由原來的2改為了1。就是這樣一個改動,使得vgg網路總的stride由原來的32變成8,進而使得在輸入圖像為514x514,正常的padding時,fc7能得到67x67的score
map,
要比FCN確實要dense很多很多。
但是這種改變網路結果的做法也帶來了一個問題:
stride改變以後,如果想繼續利用vgg
model進行fine
tuning,會導致後面filter作用的區域發生改變,換句話說就是感受野發生變化。這個問題在下圖(a)
(b)中通過花括弧體現出來了:
Hole演算法
於是乎,作者想出了一招,來解決兩個看似有點矛盾的問題:
既想利用已經訓練好的模型進行fine-tuning,又想改變網路結構得到更加dense的score
map.
這個解決辦法就是採用Hole演算法。如下圖(a)
(b)所示,在以往的卷積或者pooling中,一個filter中相鄰的權重作用在feature
map上的位置都是物理上連續的。如下圖(c)所示,為了保證感受野不發生變化,某一層的stride由2變為1以後,後面的層需要採用hole演算法,具體來講就是將連續的連接關系是根據hole
size大小變成skip連接的(圖(c)為了顯示方便直接畫在本層上了)。不要被(c)中的padding為2嚇著了,其實2個padding不會同時和一個filter相連。
pool4的stride由2變為1,則緊接著的conv5_1,
conv5_2和conv5_3中hole
size為2。接著pool5由2變為1,
則後面的fc6中hole
size為4。
代碼
主要是im2col(前傳)和col2im(反傳)中做了改動
(增加了hole_w,
hole_h),這里只貼cpu的用於理解:

⑥ 在圖像處理中,有什麼演算法可以將目標分割成幾個部分

可以用閾值化技術、邊緣檢測、邊界跟蹤等等
至於演算法,有分水嶺演算法、各種門限運算元
灰度門限法(最大類間方差、最大後驗概率、最小風險法...)

⑦ 哪位大神有多目標的自動分割演算法一幅圖中有幾個目標,把這幾個自動分割出來。求程序.. 急,,

你這要求太高了。你要做機槍塔么,就算航天用的目標識別也是放射型元素識別而不是圖像識別額。

你可以參考下超市的條碼。這是最實際的應用了。

一般計算機要識別東西是要有標定點的。比如游戲動作捕捉身上就有色塊。

現在鋼鐵俠的助手機器人離我們還很遠。


批處理切割圖片倒是可以做到。

如果只是圖片指定位置的切割,也可以。

只能傳一個

⑧ 聚類的圖像分割演算法

《C語言數值演算法程序大全》第二版,定價88元,樓主掏點金子吧,我手頭有一本,不過你看不著。

⑨ meanshift分割演算法


1.識別靜態的整個人體較難;即使識別出來結果也不可靠,所以現在主要以手勢/人臉識別為主;這是因為手和臉上面有比較獨特的特徵點。你說的濾波歸根結底還是要找出具有灰度跳變的高頻部分作為人體;這除非背景中除了人以外沒有其他突出的物體;否則光憑濾波二值法檢測人體是不太現實。

2 兩張圖片中人要是產生相對運動,檢測起來就容易多了;利用幀間差分找到圖像中灰度相差大的部分(你用的濾波也是一種手段);然後二值化區域連通;要是圖像中沒有其他移動物體計算連通區域的變動方向就是人的運動方向。

你可以去PUDN上搜搜相關的目標檢測的代碼;完全和你這個對應是不可能的。照你說的情況可以先建立起靜態背景的模型(或者直接在沒人的時候拍張);然後不斷的與這個背景做差,原理和幀間差分一樣。建議你先從典型的幀間差分常式開始下手(比如移動車輛的檢測,這個比較多)。

你在二值化之後加上一個區域連通的步驟;即使用膨脹或者閉運算;這樣你的輪廓就是連續的了;用matlab的話bwlabel可以統計連通區域裡面像素的個數也就是人體面積大小。質心就是橫豎坐標的平均值;取所有人體點的橫豎坐標分別累加;除以坐標總數得到的x和y平均值;這個就是質心了

熱點內容
db2新建資料庫 發布:2024-09-08 08:10:19 瀏覽:170
頻率計源碼 發布:2024-09-08 07:40:26 瀏覽:778
奧迪a6哪個配置帶後排加熱 發布:2024-09-08 07:06:32 瀏覽:100
linux修改apache埠 發布:2024-09-08 07:05:49 瀏覽:208
有多少個不同的密碼子 發布:2024-09-08 07:00:46 瀏覽:566
linux搭建mysql伺服器配置 發布:2024-09-08 06:50:02 瀏覽:995
加上www不能訪問 發布:2024-09-08 06:39:52 瀏覽:811
銀行支付密碼器怎麼用 發布:2024-09-08 06:39:52 瀏覽:513
蘋果手機清理瀏覽器緩存怎麼清理緩存 發布:2024-09-08 06:31:32 瀏覽:554
雲伺服器的優點與缺點 發布:2024-09-08 06:30:34 瀏覽:734