Beginner 影像處理

以下內容是閱讀母校鍾教授的影像處理與電腦視覺 ,前幾章所寫的粗略程式。用Mathematica 可以快速入門做一次,有合適時機,再深入探討,用Mathematica 做影像處理第一章的 Hough Transform 的直線偵側的初階練習.

我的程式可以把原圖(左),,判斷標記為粉紅色直線(右)

令iimage 等於你的圖檔 ,邊緣偵測用內建的Canny檢測.

使用ParallelTable指令做影像處理的平行運算, 每個點做houghTransform ,gatherSamePoint收集相同的值.

程式碼如下

iimage =(*your picture*);
m = iimage // ImageDimensions // Max;
reImage = ImageResize[iimage, m];
reImage // ImageDimensions
edageImage = EdgeDetect[reImage, 2, 0.2`, Method -> "Canny"];
edageImagePoint = ImageValuePositions[edageImage, 1];
n = Sqrt[edageImagePoint // Length] // Floor;
{m, n}
HighlightImage[reImage, edageImagePoint]
\[Theta]\[Rho]xy[\[Theta]_, point_List] :=
 {\[Theta] // 
   N, (5 (point[[1]] Cos[\[Theta]] + point[[2]]*Sin[\[Theta]]) // 
    Floor), point}
houghTransform = 
  ParallelTable[\[Theta]\[Rho]xy[\[Theta], point], {\[Theta], 
    0, \[Pi], \[Pi]/(0.9 n)}, {point, edageImagePoint}];
gatherSamePoint = Table[GatherBy[i, #[[2]] &], {i, houghTransform}];
selectMorePoints = 
  Table[Select[gatherSamePoint[[i]], Length@# > 15 &], {i, 1, 
      Length@gatherSamePoint}] /. {} -> Nothing /. {x_?NumericQ, y_, 
     list_List} -> list;
selectLinePoint = 
  Map[SortBy[#, Total][[{1, 2}]] &, selectMorePoints, {2}];
lines = Map[InfiniteLine, selectLinePoint, {2}] // Flatten;
HighlightImage[reimage, lines]

自己摸一次之後,才知影像處理博大精深,要交給專業的來。下次去停車場看到柵欄舉不起來,要體諒寫程式的工程師。

發表留言