2014-09-20 377 views
1

我想用Matlab解釋我的問題。我的目標是在從照片坦克獲得自由液麪而要做到這一點,我已經使用這個算法:Matlab - 從邊緣創建x,y曲線

A = 'C:\foto\img3.bmp'; 
B = imread(A, 'bmp'); 
figure(1), imshow(B); 
C = rgb2gray(B); 
level = graythresh(C); 
bw = im2bw(C,level); 
bw = bwareaopen(bw, 50); 
figure, imshow(bw); 
BW1 = edge(bw,'canny'); 
figure(2), imshow(BW1); 
imwrite(BW1, 'C:\foto\im1_edge.bmp', 'bmp') 

現在我有表面邊緣爲白色,與黑色的背景。 接下來我也只能檢測白色像素的位置:

I= imread('C:\foto\img3_edge.bmp'); 
imshow(I); 
[r c] =size(I); 
for j=1:c 
    for i=1:r 
    if(I(i,j)==1)     
    [i j] 
    end 
    end 
end 

在這一點上,我怎麼可以報告(含宏,自動可能)每對夫婦座標的笛卡爾(x,y)平面?我的目標是從邊緣獲得重建的類型「y = f(x)」的函數。 我和另一個邊緣嘗試,並用油漆修改,刪除所有無用像素的圖像,例子是這樣的一個:

http://i59.tinypic.com/20jh1g2.jpg

與代碼:

I = im2bw(I); 

它返回我的錯誤「警告:輸入圖像已經是二進制。」接下來使用的代碼:

[r c] = find(I), output = [r c]; 
plot(r,c,'.') 

我得到這一個:

http://i59.tinypic.com/2iqmqvl.jpg

此外,當我嘗試在cftool插入R作爲XDATA和c如YDATA,我得到了同樣的問題,並且當我使用「Interpolant」裝配,它會返回一個錯誤.....爲什麼?

請幫助我,謝謝大家! :-) PS:對不起,太長的帖子:)

+0

使用'polynomial'這種類型的曲線 – Hoki 2014-09-20 10:16:56

+0

您可以簡化您的白點檢測裝修:取而代之的是兩個for循環使用:* [行col] = find(I == 1)* – zinjaai 2014-09-20 12:23:02

回答

2

我不知道你想適用於你的數據是什麼類型的適合。以下代碼將適合數據上的三階多項式。

I = imread('20jh1g2.jpg'); 
I = im2bw(I); 
imshow(I); 

[r, c] = find(I); 
figure; 
plot(c,r,'.'); 
hold on; 
f = fit(c, r, 'poly3'); 
plot((min(c):max(c)),f(min(c):max(c)), 'red', 'LineWidth', 3); 

將產生:

3rd order polynomial fit

旋轉可以由軸是如何定義進行說明。在您的圖像中,Y軸從頂部的0開始到底部的374。您可以使用以下代碼將您的擬合結果轉換回二進制映像;

x = (min(c):max(c))'; 
y = round(f(x)); 
I = zeros(size(I)); 
I(y +((x-1)*size(I,1))) = 1; 
figure 
imshow(I); 

將產生:

binary image of fit

擬合的結果,f存儲在cfit對象。您可以通過爲其提供x的值來評估此功能,如上所示。函數係數可以通過在命令窗口中打印cfit對象的字段來找到;

f = 

    Linear model Poly3: 
    f(x) = p1*x^3 + p2*x^2 + p3*x + p4 
    Coefficients (with 95% confidence bounds): 
     p1 = -6.252e-06 (-6.542e-06, -5.963e-06) 
     p2 = 0.001753 (0.001588, 0.001918) 
     p3 =  -0.3667 (-0.3932, -0.3401) 
     p4 =  290.4 (289.3, 291.6) 

要翻轉參考框架內的函數並計算質心,您可以使用它;

I = imread('20jh1g2.jpg'); 
I = im2bw(I); 

[r, c] = find(I); 
r = -r + size(I,1); 
f = polyfit(c, r, 3); 
plot((min(c):max(c)),polyval(f,(min(c):max(c))), 'red', 'LineWidth', 3); 
hold on; 

xf = [f 0]; 
fx2 = sym2poly(poly2sym(f)^2); 
centroid = 1/polyval(polyint(f),size(I,2)) * [polyval(polyint(xf),size(I,2)) 1/2 * polyval(polyint(fx2),size(I,2))]; 
plot(centroid(1),centroid(2),'X'); 

將產生:

3rd order polynomial fit with centroid

+0

感謝@ 0xMB的幫助,這個結果是一個很好的觀點!但是我怎樣才能明確地設置旋轉的曲線?因爲如果我使用** plot(f)**曲線結果旋轉了。而且,我可以檢測曲線下方區域的質量質心嗎? – Firefly 2014-09-21 09:48:27

+0

螢火蟲,你能否詳細解釋一下你想要達到的目標?你爲什麼要畫陰影?不管你如何繪製擬合,因爲x和y之間的關係是相同的。一旦獲得多項式的係數,找到曲線下面積的質心就是簡單的數學運算。 – 0xMB 2014-09-22 07:21:44

+0

0xMB抱歉我的英文不好,可能我沒有解釋清楚。我的目標是通過實驗測試(照片)比較2個無水錶面:1和模擬Fluent(或Flow3D)的其他1個水錶面。我只想獲得2條曲線(沒有圖像的其餘部分),所以我可以比較它們,以米(罐的長度)爲單位設置座標(x,y),並驗證通過Fluent模擬得出的誤差百分比。接下來,我還想獲得瞬態模擬中每個時間步的質量質心,所以我可以繪製一條通過所有這些點的曲線 – Firefly 2014-09-22 08:14:18