Hi Michael, thank you for digging out about the inconsistency and for pointing out my mistake in specifying the end coordinates of a line.
Best, Giovanni -----Original Message----- From: Michael Schmid <[email protected]> Sent: Friday, 11 October 2024 18:43 To: [email protected] Subject: Re: Number of points in a horizontal Line Roi different when line width > 1 Hi Giovanni, a line between points (x, y) and (x + n, y) has (n + 1) points, because both end points are included. Pixel coordinates in ImageJ range from 0 to (width - 1), so you should use roi = Line(0, int(h/2), w-1, int(h/2)) For lines of a width different from the image width, this works consistently. The inconsistent behavior only occurs for horizontal lines with a width equal to the image width or vertical lines with a length equal to the image height. (Irrespective of whether the starting point is 0 or not). It is caused by ImageProcessor.getLine: https://github.com/imagej/ImageJ/blob/master/ij/process/ImageProcessor.java#L1120 In this code, the case of horizontal lines with a length equal to the image width or vertical lines with a length equal to the image height is an exception; the end point is not included (for a reason that I do not understand). BTW, for the non-python users, I paste a javascript version of a similar macro below. Michael ________________________________________________________________ imp = IJ.openImage("http://imagej.net/images/Cell_Colony.jpg"); imp.show(); h = imp.getHeight(); w = imp.getWidth(); for (i=1; i<=5; i++) { roi = new Line(0.0,Math.floor(h/2),406.0,Math.floor(h/2)); roi.setLineWidth(i); imp.setRoi(roi); y = roi.getPixels(); print("Line thickness: "+i+" - Number of points on the X axis: "+y.length); } ________________________________________________________________ On 11.10.24 17:01, Cardone, Giovanni wrote: > Hi, > > I discovered that when tracing an horizontal line on an image and retrieving > the profile intensity, the number of points is artificially increased by one > when setting a line width larger than one. > Here is a python script that reproduces the issue > > from ij import IJ > > from ij.gui import Line > > imp = IJ.openImage("http://imagej.net/images/Cell_Colony.jpg") > > imp.show() > > h = imp.getHeight() > > w = imp.getWidth() > > for line_thickness in (1, 5): > > roi = Line(0,int(h/2),w,int(h/2)) > > roi.setLineWidth(line_thickness) > > imp.setRoi(roi) > > y = roi.getPixels() > > print("Line thickness: %d - Number of points on the X axis: > %d"%(line_thickness,len(y))) > > This inconsistency only happens when the line is perfectly horizontal. I > looked at the code and it seems that the extra point at the end of the > profile is generated by the function PolygonRoi.fitSplineForStraightening() > called by Straightener.straightenLine(). > In my tests I could see this happening only when the Line Roi is horizontal, > and it affects also a profile plot (e.g. when calling IJ.run(imp, "Plot > Profile", "")). > > In my script I was able to bypass the issue by using instead a rectangular > Roi with height equal to the line thickness, but I thought it was important > to be aware of this anomaly. > > Best, > Giovanni > > -- > ImageJ mailing list: http://imagej.nih.gov/ij/list.html -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html -- ImageJ mailing list: http://imagej.nih.gov/ij/list.html
