2014-07-26 78 views
2

我對這個社區很陌生,對R很陌生,但對編程(C,VB,Matlab,APDL等)並不陌生。我正在爲產品創建一個工程評估工具,需要量化葉片邊緣的質量。我將每次使用帶網絡攝像頭的自動化平臺在完全相同的位置評估數百個這樣的葉片 - 因此將執行統計圖像分析。我對統計並不陌生,但對於R和數字圖像處理來說,這是全新的。 (我選擇了R,因爲它是免費的,我應該可以在其中編寫腳本,如果有更好的方法可以做到這一點,請告訴我,Matlab是第二選擇,因爲費用)R中的邊緣檢測,圖像處理和最終數據提取

原始圖像顯示如下:Link

一些基本的腳本後:

library(EBImage) 
original=readImage("original.jpg") 
fhi=matrix(1,nc=3,nr=3) 
fhi[2,2]=-8 
filtered=filter2(original,fhi) 

我選擇了EBImage庫的基礎上,一些初始讀數在線。建議替代品,如果更好,請。

過濾的圖像看起來是這樣的:Link

我需要做的:

  1. 獲取X,Y座標上的「邊緣2」的所有點,「邊緣1」之間的謊言, '邊緣3'。 X,Y原點可以假定爲照片的左下角,但理想情況下,我希望它是邊1和邊2的交點。
  2. 將X,Y座標存儲在矩陣中葉片編號的標識符。 (「葉片1」,「葉片2」,或只是1,2,...等)

我很迷茫,我從哪裏出發。欣賞任何指針。

+0

什麼定義了葉片的質量?直線?還有別的嗎?作爲下一步處理,您將如何處理X,Y座標? –

+0

馬克,有很多事情會用XY座標完成 - 組件內每個葉片的比較(視覺,基本統計數據),每個產品系列內的比較,公差疊加的影響/缺陷顯示在組件的一側比較另一個......名單繼續。一旦我有了原始的X,Y數據,可能性就很大。 – Rahul

回答

0

我有些喜歡在ImageMagick的Canny邊緣檢測,並得到了你輸入的照片下面,使用此命令:

convert photo.jpg -canny 0x12+10%+30% out.jpg 

enter image description here

我當時曾與HoughLinesP來自OpenCV的一個嘗試,並得到了下面的圖片:

enter image description here

使用此代碼這在很大程度上來自OpenCV的網站借:

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 

using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 
    const char* filename = argc >= 2 ? argv[1] : "in.jpg"; 

    Mat src = imread(filename, 0); 
    if(src.empty()) 
    { 
     cout << "can not open " << filename << endl; 
     return -1; 
    } 

    Mat dst, cdst; 
    dst=src; 
    cvtColor(src, cdst, CV_GRAY2BGR); 

    vector<Vec4i> lines; 
    HoughLinesP(dst, lines, 1, CV_PI/90, 150, 300, 50); 

    printf("Lines detected: %d\n",(int)lines.size()); 
    for(size_t i = 0; i < lines.size(); i++) 
    { 
     Vec4i l = lines[i]; 
     line(cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA); 
    } 

    imshow("source", src); 
    imshow("detected lines", cdst); 

    waitKey(); 
    return 0; 
} 

額外的材料

感謝@dlemstra關於支持HoughLines的ImageMagick輸入,以及這個建議,我在ImageMagick的單次調用中做了以下操作(不使用O penCV):

convert photo.jpg \ 
\(+clone -canny 0x5+10%+30% -write photo_canny.jpg \ 
-background none -fill red -stroke red -strokewidth 2 \ 
-hough-lines 9x9+150 -write photo_lines.jpg \) -composite photo_hough.jpg 

它看起來是這樣的:

enter image description here

我想知道尋找長直立邊,使其垂直後的圖像旋轉,然後切割圖像沿該線並尋找左下角的水平邊緣,使用不同的參數或拉伸後的圖像寬度強調水平線...

+1

ImageMagick的新版本也支持'Hough lines'。 – dlemstra

+0

@dlemstra非常感謝您分享您的知識 - 我已相應更新。 –

+0

哇,謝謝@MarkSetchell。很多很好的信息在這裏。我會花一些時間來處理這個,看看我可以如何在我的代碼中實現這一點。非常感謝。 – Rahul

0

這是我找到的最好的邊緣座標。這是一個相當粗糙的方法,但它應該給你一些想法。讓我通過說我幾乎對圖像處理幾乎一無所知。所以,在邊緣檢測方面,我可能比我做得更好。我使用了biOps包。

library(biOps) 
original <- readJpeg("original.jpg") 

# I did not try hard to detect edges as I don't know what I'm doing. 
# If you can do better on the edge detecting, you'll get better results 
test <- imgHomogeneityEdgeDetection(imgCanny(original, 2)) 

# did this to work with one of the three (i.e. red, green, blue) 
reds <- imgRedBand(test) # reds only contains values 32 and 255. 255 is "edges" 

# find the indices of the "edges" 
edgelocations <- which(reds!=32, arr.ind=TRUE) 

原點始於原始圖像的左上角。見plot(edgelocations)

所以,你可以翻轉它改變的由來:

edgelocations <- which(t(r)[,nrow(r):1]!=32, arr.ind=TRUE) 
plot(edgelocations) 

enter image description here

+0

很多很多謝謝@Frank。我會處理這個,看看我可以如何利用這個。 – Rahul