在选定的 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