2012-05-14 112 views
5

我之前提出过一个问题Marking an interest point in an image using c++。我使用了相同的解决方案,并使用自适应阈值和Blob Detection Algorithm(增长区域)获得了所需的点。我有原来的源身影,我想在中心检测矩形区域使用OpenCv检测图像中的矩形明亮区域

原始图像:

Original Image。但我所使用的算法后,我得到了这样的事情(如果你打开它的细节都可见在新标签)

标记图像:

enter image description here从矩形区域,其中开亮天的光照射斑点也是可见的。我已经使用了双边过滤,但仍然无法检测到矩形区域。但是,此算法适用于夜间图像,其背景更暗。

有人建议我同样的算法进行一些修改是否足够或任何其他有效的方法是可用..

感谢

回答

4

使用模糊 & 门槛的简单组合,我设法得到这样的结果(调整以便查看):

之后,应用侵蚀 & the squares.cpp technique(这是来自OpenCV的样本)输出:

这几乎是你正在寻找的结果:该矩形的底部部分被成功检测到。所有你需要做的是增加检测到的矩形(红色正方形)的高度以适合您感兴趣的区域。

代码:

Mat img = imread(argv[1]); 

    // Blur 
Mat new_img = img.clone(); 
medianBlur(new_img, new_img, 5); 

// Perform threshold 
double thres = 210; 
double color = 255; 
threshold(new_img, new_img, thres, color, CV_THRESH_BINARY); 
imwrite("thres.png", new_img); 

// Execute erosion to improve the detection 
int erosion_size = 4; 
Mat element = getStructuringElement(MORPH_CROSS, 
            Size(2 * erosion_size + 1, 2 * erosion_size + 1), 
            Point(erosion_size, erosion_size)); 
erode(new_img, new_img, element); 
imwrite("erode.png", new_img); 

vector<vector<Point> > squares; 
find_squares(new_img, squares); 
std::cout << "squares: " << squares.size() << std::endl; 

draw_squares(img, squares); 

imwrite("area.png", img); 

EDIT

find_squares()函数返回与所述图像中找到的所有方块的矢量。因为它在图像的每个通道上迭代,所以在您的示例中,它成功检测到每个通道中的矩形区域,因此打印squares.size()输出3

作为正方形可以看作是4(X,Y)坐标的矢量,OpenCV的表达这一概念作为vector<Point>允许您访问X和Y部分的坐标。

现在,印刷squares revelead在逆时针方向检测点:

1st ------ 4th 
|   | 
|   | 
|   | 
2nd ------ 3rd 

下面这个例子,它很明显,如果你需要增加矩形的高度则需要更改Y第一和第四点:

for (int i = 0; i < squares.size(); i++) 
{ 
    for (int j = 0; j < squares[i].size(); j++) 
    { 
    // std::cout << "# " << i << " " << squares[i][j].x << ","<< squares[i][j].y << std::endl; 
     if (j == 0 || j == 3) 
      squares[i][j].y = 0; 
    } 
} 

+0

@Karlphilip wow..Thats Great..Thanks很多关于您的HEL对于较暗的图像,我也得到了期望的结果,但硬编码阈值(约80)。如果它远离该区域,我找不到这些方块。所以我使用了Otsu阈值,但我必须添加30才能满意检测。任何其他方式来检测较暗和较亮的图像 – ShivShambo

+0

这是我能想到的唯一一个。 – karlphillip

+0

@ Karlphilip ..使用这种算法,我只想找到原始图中矩形区域中心的坐标。任何想法,我可以接近。 – ShivShambo

1

在上面显示的图片,我建议

  1. 要么正常的阈值操作,应该工作得很好或

  2. 一个线路链式代码“calculati on“或

  3. 在直方图中找到渐变。

会有很多其他解决方案。 如果这是一致的,我会考虑减去背景阴影。