2012-01-12 46 views
5

Tôi có một số kinh nghiệm với R là nền tảng thống kê, nhưng thiếu kinh nghiệm về toán học dựa trên hình ảnh. Tôi có một loạt các bức ảnh (định dạng tiff, px/µm được biết) với các lỗ và đường cong không đều. Tôi muốn đo khoảng cách ngắn nhất giữa một lỗ và đường cong gần nhất cho lỗ cụ thể đó. Tôi muốn làm điều này cho mỗi lỗ trong một bức ảnh. Các lỗ không phải là thường xuyên, vì vậy có lẽ tôi cần phải nói cho chương trình những gì là lỗ và những gì là đường cong (ImageJ có một điểm và phân đoạn chức năng dòng).R/ImageJ: Đo khoảng cách ngắn nhất giữa các điểm và đường cong

Bất kỳ ý tưởng nào về cách thực hiện việc này? Tôi nên sử dụng gói nào trong R? Bạn có đề xuất một chương trình khác cho loại tác vụ này không?

Example image

+2

Tắt đầu của tôi, tôi sẽ đi với ImageJ trước. Tôi không phải là một chuyên gia với công cụ đó, nhưng nó có vẻ là tốt trong việc tìm kiếm các điểm và làm việc với họ. –

+0

Có thể Bio7 có thể tốt cho nhiệm vụ này. Có bất kỳ người dùng Bio7 nào không? Chương trình thực hiện rất nhiều, thật khó để tìm ra nó thực sự làm gì =) – Mikko

Trả lời

2

EDIT: Thực hiện việc này hiện có thể sử dụng gói sclero. Gói hiện có sẵn trên GitHub và quy trình được mô tả chi tiết trong the tutorial. Chỉ để minh họa, tôi sử dụng một ví dụ từ hướng dẫn:

library(devtools) 
install_github("MikkoVihtakari/sclero", dependencies = TRUE) 
library(sclero) 
path <- file.path(system.file("extdata", package = "sclero"), "shellspots.zip") 
dat <- read.ijdata(path, scale = 0.7812, unit = "um") 
shell <- convert.ijdata(dat) 
aligned <- spot.dist(shell) 
plot(aligned) 

enter image description here

Nó cũng có thể thêm kích thước chỗ mẫu sử dụng các chức năng được cung cấp bởi các gói sclero. Vui lòng xem Phần 2.5 trong hướng dẫn.

1

Có một công cụ để phát hiện cạnh bằng văn bản cho hình ảnh J có thể giúp đầu tiên bạn tìm thấy những lỗ hổng và các đường, và làm rõ chúng. Bạn tìm thấy nó ở

http://imagejdocu.tudor.lu/doku.php?id=plugin:filter:edge_detection:start

Chơi xung quanh với các cài đặt cho các tresholding và trễ có thể giúp để có được những dòng và lỗ được tìm thấy. Thật khó để nói liệu điều này có nhiều cơ hội làm việc mà không nhìn thấy các bức ảnh thực tế của bạn, nhưng một đồng nghiệp của tôi có kết quả tốt bằng cách sử dụng công cụ này trên hình ảnh FRAP. Tôi đã lập trình một công cụ ImageJ có thể tính toán các hồi phục trong phân tích FRAP dựa trên những hình ảnh đó. Bạn có thể nhận được một số ý tưởng cho chính mình khi xem mã (xem: http://imagejdocu.tudor.lu/doku.php?id=plugin:analysis:frap_normalization:start)

Cách duy nhất tôi biết bạn có thể làm việc với hình ảnh là sử dụng EBImage trong hệ thống bioconductor. Gói Rimage là mồ côi, vì vậy không còn được duy trì.

Để tìm khoảng cách ngắn nhất: một khi bạn có tọa độ của các đường và lỗ, bạn có thể đi theo phương pháp shotgun: tính khoảng cách giữa tất cả các điểm và đường kẻ, và sau đó lấy mức tối thiểu. Một minh họa về điều đó trong R:

x <- -100:100 
x2 <- seq(-70,-50,length.out=length(x)/4) 

a.line <- list(x = x, 
       y = 4*x + 5) 

a.hole <- list(
    x = c(x2,rev(x2)), 
    y = c(200 + sqrt(100-(x2+60)^2), 
     rev(200 - sqrt(100-(x2+60)^2))) 
) 

plot(a.line,type='l') 
lines(a.hole,col='red') 

calc.distance <- function(line,hole){ 

    mline <- matrix(unlist(line),ncol=2) 
    mhole <- matrix(unlist(hole),ncol=2) 

    id1 <- rep(1:nrow(mline),nrow(mhole)) 
    id2 <- rep(1:nrow(mhole), each=nrow(mline)) 

    min(
    sqrt(
     (mline[id1,1]-mhole[id2,1])^2 + 
     (mline[id1,2]-mhole[id2,2])^2 
    ) 
) 
} 

Sau đó:

> calc.distance(a.line,a.hole) 
[1] 95.51649 

Mà bạn có thể kiểm tra toán học bằng cách bắt nguồn từ các phương trình đường tròn và đường kẻ. Điều này đủ nhanh nếu bạn không có hàng triệu điểm mô tả hàng ngàn đường và lỗ.

+0

Cảm ơn câu trả lời hữu ích Joris! Tôi đã thay thế hình minh họa bằng một bức ảnh thật. Tôi đã thử plugin của bạn, nhưng nghi ngờ rằng nó có thể tách các dòng, mà tôi đã đánh dấu bằng màu đỏ.Bạn có biết, nếu nó có thể tự định nghĩa các điểm và dòng và sau đó nhập chúng vào EBImage? – Mikko

+1

@Largh: thực sự, hãy quên đi việc tìm kiếm những dòng đó trong bức ảnh đó. Bạn cũng có thể thực hiện điều đó một cách thủ công trong ImageJ và sau đó xuất tọa độ của các dòng đó trong một tệp csv. Tập tin đó bạn có thể đọc với R. Tương tự cho các vòng tròn (mà EdgeDetection sẽ dễ dàng tìm thấy). Tôi không thể nhớ từ đầu của tôi như thế nào để làm điều đó trong ImageJ, nó đã được một vài năm kể từ khi tôi đã làm việc với nó, nhưng có Burge và Burgers cuốn sách (mà là tuyệt vời: http: //www.imagingbook .com /) và họ cũng có một hướng dẫn ImageJ ở bên cạnh. Thêm vào đó, có rất nhiều thông tin về điều này trên web. –

+0

Cảm ơn một lần nữa Joris. Tôi tự hỏi làm thế nào để chuyển điểm và phân đoạn dòng thông tin từ ImageJ hoặc EBImage để R mà không mất thông tin điểm ảnh (hoặc sau đó chuyển đổi điểm ảnh để µm trước khi chuyển giao). Bio7 có thể có thể làm điều này, nhưng nó khá phức tạp để sử dụng (rất nhiều cách nhấp). – Mikko