在选定的 ROI 中随机生成图像中的点。 (图 J 宏)
Randomly generate points in an Image in a selected ROI. (Image J macro)
我正在尝试使用宏在图像中的选定 ROI 上随机放置 n 个点;
Roi.getBounds(x,y,w,h);
count = 0;
while (count < n) {
roiManager( "select", 0 ); // select the first, "big" ROI
x1 = random() * w + x;
y1 = random() * h + y;
if (selectionContains(x1, y1) == true ) { // if coordinates are inside the "big" ROI
makePoint(x1, y1); // generate random point
roiManager("Add");// add the point to the ROI Manager
count++; // ONLY increase count when point is added
}
}
但是现在,我想要一个条件,即我不应该在 (x-1,y-1), (x+1,y+1) 邻域中得到 (x,y)。我怎样才能在代码中写这些? (没有 2 个点应该更接近 1 个像素)。
我添加了一个函数,计算新点和所有现有点之间的距离(它实际上计算距离的平方,但这并不重要)。如果两个点是邻居,则函数 returns true
,如果不是,则函数 false
。
Roi.getBounds(x,y,w,h);
count = 0;
n=3;
allx=newArray(n); // creates array where all of the points will be stored
ally=newArray(n); // creates array where all of the points will be stored
// function that calculates distance between all of the selected points
function is_neighbour(array_x, array_y, x1, y1){
for (elem=0; elem<array_x.length; elem++){
x2 = array_x[elem];
y2 = array_y[elem];
distance = (x1 - x2)*(x1 - x2) + (y1-y2)*(y1-y2);
if (distance < 3) return true;
}
return false;
}
while (count < n) {
roiManager( "select", 0 ); // select the first, "big" ROI
x1 = random() * w + x;
y1 = random() * h + y;
if (selectionContains(x1, y1) == true ) { // if coordinates are inside the "big" ROI
if ( !is_neighbour(allx, ally, x1, y1 ) ){
makePoint(x1, y1); // generate random point
roiManager("Add"); // add the point to the ROI Manager
allx[count] = x1; // add x1 to array of all x
ally[count] = y1; // add y1 to array of all y
count++; // ONLY increase count when point is added
}
}
你的代码中有些东西对我不起作用,所以我无法真正测试它。但是 is_neighbour
函数有效。
哦,我将邻居定义为所有接触的点(甚至是对角线):
如果您只对轻读的感兴趣,只需更改distance < 2
。
我正在尝试使用宏在图像中的选定 ROI 上随机放置 n 个点;
Roi.getBounds(x,y,w,h);
count = 0;
while (count < n) {
roiManager( "select", 0 ); // select the first, "big" ROI
x1 = random() * w + x;
y1 = random() * h + y;
if (selectionContains(x1, y1) == true ) { // if coordinates are inside the "big" ROI
makePoint(x1, y1); // generate random point
roiManager("Add");// add the point to the ROI Manager
count++; // ONLY increase count when point is added
}
}
但是现在,我想要一个条件,即我不应该在 (x-1,y-1), (x+1,y+1) 邻域中得到 (x,y)。我怎样才能在代码中写这些? (没有 2 个点应该更接近 1 个像素)。
我添加了一个函数,计算新点和所有现有点之间的距离(它实际上计算距离的平方,但这并不重要)。如果两个点是邻居,则函数 returns true
,如果不是,则函数 false
。
Roi.getBounds(x,y,w,h);
count = 0;
n=3;
allx=newArray(n); // creates array where all of the points will be stored
ally=newArray(n); // creates array where all of the points will be stored
// function that calculates distance between all of the selected points
function is_neighbour(array_x, array_y, x1, y1){
for (elem=0; elem<array_x.length; elem++){
x2 = array_x[elem];
y2 = array_y[elem];
distance = (x1 - x2)*(x1 - x2) + (y1-y2)*(y1-y2);
if (distance < 3) return true;
}
return false;
}
while (count < n) {
roiManager( "select", 0 ); // select the first, "big" ROI
x1 = random() * w + x;
y1 = random() * h + y;
if (selectionContains(x1, y1) == true ) { // if coordinates are inside the "big" ROI
if ( !is_neighbour(allx, ally, x1, y1 ) ){
makePoint(x1, y1); // generate random point
roiManager("Add"); // add the point to the ROI Manager
allx[count] = x1; // add x1 to array of all x
ally[count] = y1; // add y1 to array of all y
count++; // ONLY increase count when point is added
}
}
你的代码中有些东西对我不起作用,所以我无法真正测试它。但是 is_neighbour
函数有效。
哦,我将邻居定义为所有接触的点(甚至是对角线):
如果您只对轻读的感兴趣,只需更改distance < 2
。