2011-06-24 34 views
5

Tôi cần lấy Trung tâm khối lượng (Centroid) cho các thành phần trong tập hợp các hình ảnh nhị phân có độ chính xác subpixel.Kết quả ComponentMeasurements [_, "Centroid"] offset

Mathematica 8 đi kèm với một bổ sung tốt đẹp:

i = [email protected]"http://i.stack.imgur.com/2pxrN.png"; 
m1 = ComponentMeasurements[MorphologicalComponents[i], "Centroid"] /. 
                   Rule[_, x_] -> x 
(* 
-> {{403.229, 453.551}, {660.404, 371.383}, {114.389, 434.646}, {295.5, 206.}} 
*) 

Nhưng tôi đã trải qua một số khó khăn khi những kết quả cho thấy một số mâu thuẫn với các tính toán khác được thực hiện ở nơi khác.

Vì vậy, tôi cuộn của riêng tôi, có lẽ không đẹp:

i = [email protected]"http://i.stack.imgur.com/2pxrN.png"; 
f[i_] := [email protected]{#[[2]], ImageDimensions[i][[2]] - #[[1]]} & /@ 
     (Mean /@ 
      Function[x, Map[ 
       Position[x, #, 2] &, 
       Complement[[email protected][x], {0}]]] 
      [MorphologicalComponents[i]]); 
f[i] 
Show[i, Graphics[{Red, Disk[#, 10] & /@ f[i]}]] 
(* 
-> {{403.729, 453.051}, {660.904, 370.883}, {114.889, 434.146}, {296., 205.5}} 
*) 

enter image description here

Bạn có thể thấy rằng có một .5 bù đắp giữa các kết quả này:

Thread[Subtract[m1, f[i]]] 
(* 
-> {{-0.5, -0.5, -0.5, -0.5}, {0.5, 0.5, 0.5, 0.5}} 
*) 

Tại tôi lần đầu tiên nghĩ rằng vấn đề có liên quan với kích thước hình ảnh thậm chí là lẻ hoặc lẻ, nhưng đó không phải là trường hợp.

Tôi muốn sử dụng ComponentMeasurements[ ..,"Centroid"] và sửa kết quả, nhưng tôi e ngại các phiên bản Mma trong tương lai có thể sửa đổi hành vi này và làm hỏng kết quả.

Tôi cũng có thể chạy "hiệu chỉnh" trước đó với hình ảnh đã biết và tính toán độ lệch, vì vậy nó sẽ tự động sửa, nhưng tôi muốn hiểu điều gì đang diễn ra trước.

Đây có phải là lỗi không?
Bất kỳ ý tưởng nào về việc tại sao điều này lại xảy ra?

+1

tôi đoán điều này có thể liên quan đến quy ước nơi các trung tâm pixel được đặt tương ứng với lưới tọa độ. Nếu một thuật toán giả định lưới tọa độ được liên kết với các ranh giới pixel và phương thức kia giả định lưới được căn chỉnh với các pixel-center bạn sẽ nhận được các kết quả không phù hợp. –

Trả lời

6

tôi cảm thấy trang doc cho ComponentMeasurements chứa các giải pháp:

Vị trí, diện tích, và thời gian đo được thực hiện trong các tiêu chuẩn hình hệ tọa độ nơi vị trí {0,0} tương ứng với đáy -left góc, x chạy từ 0 đến chiều rộng và y chạy từ 0 đến cao.

Bạn đang tính toàn bộ pixel và ComponentMeasurements đo pixel vị trí. Trong hệ thống này, trung tâm của điểm ảnh dưới cùng bên trái là {1/2,1/2}.

+0

Có vẻ như vậy. Tất nhiên tôi đã đọc nó trước khi đăng bài, nhưng tôi hiểu nó khi nó trang bị cho tôi. Bây giờ tôi phải chăm sóc ba hệ thống tọa độ khác nhau: một hệ thống được sử dụng bởi ImageData [], một cái khác được sử dụng bởi Graphics [], và cái này. Tôi sẽ cần hậu tố của tôi, hoặc tôi sẽ làm hỏng mọi thứ. Cảm ơn rất nhiều. –

+1

Đếm trong 'MatrixPlot' và' ArrayPlot'. Cái thứ hai có 'DataReversed' để thiết lập mọi thứ thẳng. –