Как эффективно изменить мои ROI

Автоматически распознаваемые ROI

Я работаю над программой, которая будет использоваться для моих исследовательских нужд. Остался последний шаг, который я не могу решить самостоятельно.

На изображении вы можете увидеть две ROI, которые были выбраны на основе ссылки макроса: Автоматически распознанные объекты переносятся в области интереса в Imagej

Для моего дальнейшего анализа важно, чтобы все мои области интереса касались края изображения. Лучшее решение состоит в том, что я бы вручную добавил выделение, а затем объединил его с существующим ROI (возможно ли это?).

Еще лучшее решение для предложения if: если ROI не касается края, сделайте его больше. Но также важно, чтобы другие части ROI оставались неизменными (поскольку сам ROI является одним из измерений).


person JerryTheForester    schedule 19.03.2014    source источник


Ответы (1)


Я пытаюсь понять ваш вопрос, но здесь есть некоторые проблемы с именами: ROI в openCV — это прямоугольная область, которую можно описать, например, классом Rect:

int x=3, y=5, width=10, height=15;
Rect roi(x, y, width, height);
Mat m(100, 100, CV_8UC3);
m = Scalar(0);
m(roi) = 255;

введите описание изображения здесьТо, что вы здесь показываете, выглядит как маска, не ограниченная прямоугольной формой, например:

Mat mask, img;
img = mask & img;

Все показанные сегменты маски касаются границы изображения хотя бы один раз, но если вы хотите, чтобы они касались ее с обеих сторон, у вас слишком много циклов по пикселям маски, найдите пиксели с минимальным, максимальным значением x (если касаться левого и правого границ), и если некоторые из них не равны 0, ширина-1 каким-то образом соединяет соответствующие точки с границей (тонкой линией?). И, конечно же, вам нужно перебрать все сегменты, которые вы называете roi (в приведенном ниже коде я просто выбираю нижнюю половину для работы с нижним сегментом):

Mat I = imread("roi.jpg", 0);
imshow("input", I);
int h=I.rows;
int w=I.cols;

//select lower half of the mask
Rect rect(0, h/2, w, h/2);
Mat I2 = I(rect).clone();
int xmin=w, xmax=0;
int ymin, ymax;
for (int i=0; i<I2.rows; i++) {
    uchar* imgrow = I2.ptr<uchar>(i);
    for (int j=0; j<I2.cols; j++) {
        if (xmin>j){
                xmin=j;
                ymin=i;
            }
            if (xmax<j) {
                xmax=j;
                ymax=i;
            }
    }
}
cout<<Point(xmin, ymin)<<", "<<Point(xmax, ymax)<<endl;

if (xmin>0) {
    // connect
}
if (xmax<I2.cols) {
    // connect
}
waitKey(-1);

Код выводит две точки: [24, 536], [1535, 409], причем первую нужно как-то связать с границей, так как у нее x!=0. Например, строка (I2, [24, 536], [0, 536], ...)

person Vlad    schedule 23.03.2014