Posted by
Kenneth Sloan-2 on
Jan 19, 2018; 3:01pm
URL: http://imagej.273.s1.nabble.com/question-on-edge-detection-tp5019908p5019910.html
Welcome to image processing (and image understanding).
Yours is a classic problem. I alway taught my students to call the low level process "edge-element detection".
This is a bottom-up, local operation that produces little pieces of edges.
Linking these edge elements into larger, higher level structures requires moving up one level of abstraction. You cannot profitably think of the data as an "image" anymore. Instead, you have a collection of edge-elements. What *you* want in this particular case is a set of arteries, characterized by a central spine and a width (probably indicated by continuous boundaries on either side. (I suppose you *could* still structure this information as "images", but I don't personally think that's the right idea)
A lot depends on the form of imagery you have, but a common first step is to try to link edge-elements into longer curvilinear features. Branching introduces another level of complexity - which you might choose to avoid at this stage. You are looking first for long chains of edge-elements. You might then look for matching CHAINS (the two sides of the same artery). At this stage, I would settle for identifying unbranching sections of artery.
For your problem, I suspect this is as far as you need to go.
Others might then consider building a graph structure showing how these tubes connect together into a branching structure.
In all of these steps (except the first one), you may not need to look at the image once you have detected a large pile of "edge-elements". The processing becomes more symbolic. On the other hand, sophisticated version of these processes may refer back to the image data to confirm or refute hypotheses about where the arteries are.
So...action items:
a) search for plugins that talk about vasculature
b) write your own code to accept a set of edge elements (which should include x,y location and dx,dy orientation) and output long chains of consistent edge-elements (endpoints match, orientations agree). Call these "boundary-segments". Orientation matters here, too (which side is "inside" and which side is "outside")
c) write your own code to look for matching boundary-segments that are roughly parallel, but have opposite orientation. You now have "tube-segments".
For your problem, I think you are done - you can analyze each tube-segment and measure artery width at each point along each tube-segment.
-------------------
Now...backing away from this...it is possible to measure the CHANGE in artery wall position using much lower level information (staying at the image level). Given two images in a sequence, find edge-elements in each and then try to pair edge elements in one image with those in the second. Some of them will be in approximately the same place, at the same orientation. These might be considered to be pieces of artery wall that have moved.
You can do the same thing with longer boundary-segments. Try to match boundary-segments in image A with those in
image B.
The approach outlined at the top takes you all the way to matching tube-segments.
------------------
Approach 3 - at the lowest level, you can estimate local MOTION of "whatever is there" by looking at pairs (or sequences) of images. This is a very low level, image processing approach that produces an image where the pixels have values (dx,dy) giving the estimated motion from image A to image B. This can reliably detect motion of everything you can see in the image. That includes vessel walls - but might include other stuff as well..
Now, you are back to the question of linking up curvilinear features with consistent information, perhaps even finding "motion-tube-sequences" which indicate a pair of boundaries moving towards/away from each other.
You might do a literature search on "OCT-A" to find current application of this sort of motion processing (although there, they are measuring blood flow and not artery pulsing).
I think it's unlikely that you will find anything "off-the-shelf" (but I am largely ignorant of what's available in ImageJ-plugin form. Every problem is just different enough that you will have to roll your own. My main point is that you probably need to move away from a pure image-based solution, and deal with data structures more complicated than an image array of pixels.
I hope this helps.
--
Kenneth Sloan
[hidden email]
Vision is the art of seeing what is invisible to others.
> On 18 Jan 2018, at 16:01 , David Schaffer <
[hidden email]> wrote:
>
> Dear all on ImageJ listserve.
>
> I am pretty new to image processing and this is my 1st post.
>
> We have some images of arteries in mouse brains.
> We want to locate the artery edges with some precision as we want to
> measure the waveforms that result from the heartbeats.
>
> We anticipate that no off-the-shelf edge detector algorithm will do
> the whole job, so we're prepared to learn to do some programming in
> ImageJ.
>
> To start, we have applied the Canny edge detector.
> The results can be rather good, but still some false positives for the
> edge we want, and some of that edge is missing.
> Not surprising -- one set of parameters can't work for the whole image.
>
> Question: are there approaches to extending a given edge?
> I hope such approaches might be able to adjust the local parameters
> as they go, just guessing as best they can using local data.
>
> Is this just a pipe dream?
>
> Thanks,
> Dave
>
>
> --
> J. David Schaffer
> Visiting Research Professor
> College of Community and Public Affairs
> Binghamton University
> Binghamton, NY 13902-6000
>
[hidden email]
> 607-777-9145
>
> --
> ImageJ mailing list:
http://imagej.nih.gov/ij/list.html--
ImageJ mailing list:
http://imagej.nih.gov/ij/list.html