我一直致力于一项将用于研究需求的计划。还有最后一步,我自己无法解决。
在图像上,您可以看到基于宏选择的两个ROI 链接:Automatically recognized objects transferred into ROIs in Imagej
对于我的进一步分析,我的所有投资回报率都必须触及图片的边缘。最好的解决方案是我会手动添加一个选择,然后将其与现有的ROI合并(是否可能?)。
如果句子更好的解决方案:如果ROI没有触及边缘,则将其设置得更大。但同样重要的是ROI的其他部分保持不变(因为ROI本身就是衡量标准之一)
答案 0 :(得分:0)
我想了解你的问题,但这里有一些命名问题: ROI in openCV is a rectangular region,例如,可以用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;
所有显示的遮罩细分至少触摸一次图片边框,但是如果您希望它们从两侧触摸它,则您需要在遮罩像素上循环,找到具有min,max x的像素(如果触摸左右边框)并且如果其中一些不是0,则width-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],......)