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

Reply via email to