如果两个区域相交则合并它们
merge two region if they intersect
我正在使用 skimage 为图像创建区域
from skimage.measure import regionprops
from skimage import measure
label_image = measure.label(binary_car_image)
for region in regionprops(label_image):
...
在某些情况下,这些区域可以相互交叉。如下图所示:
在此图像中有两个区域,但它们彼此相交。
在这种情况下,我需要将它们合并到一个区域而不是两个区域。
我发现这个 ,两个检查它们是否相互交叉。
所以我需要将这两个区域(或者在某些情况下可能超过 2 个)合并到一个区域。
谢谢
正如 fmw42 建议的那样,做这样的事情(这是未经测试的 C++ 代码,但它应该让您知道该怎么做):
首先,设置一些初始值:
int maxX = 0; // width of the contour + minimum x
int minX = 5000; // minimum x (big value)
int minY = 5000; // height of the contour + min y (big value)
int maxY = 0; // min y
然后,遍历所有 contours
,并通过 boundingRect
为每个 contour
计算其 bounding box
。 contours
存储在向量 contours
中,在 C++ 中它是 cv::Point
个向量的向量。
//loop through all the contours:
for( int i = 0; i < (int)contours.size(); i++ ){
//process the outter most contours only:
if ( hierarchy[i][3] == -1 ) {
//get the simple bounding box:
cv::Rect contourRect = cv::boundingRect( contours[i] );
//get the coordinates of the bounding box for x:
int countourMaximumX = contourRect.x + contourRect.width;
if ( countourMaximumX > maxX ){
maxX = countourMaximumX;
}
if ( contourRect.x < minX ){
minX = contourRect.x;
}
//get the coordinates of the bounding box for y:
int countourMaximumY = contourRect.y + contourRect.height;
if ( countourMaximumY > maxY ){
maxY = countourMaximumY;
}
if ( contourRect.y < minY ){
minY = contourRect.y;
}
}
}
最后,您可以获得 “复合”边界框 的最终 width
和 height
,如下所示:
//width and height of the composite box:
int width = maxX - minX;
int height = maxY - minY;
最终边界框的数据应该由minX
、minY
、width
和height
给出。
感谢 fmw42 的建议,我确实实现了 eldesgraciado 提出的 C++ 代码并且它的工作,这是我与 python 的实现,因为 python 中有相同问题的人:
label_image = measure.label(binary_car_image)
minY, minX, maxY, maxX = 5000, 5000, 0, 0
for region in regionprops(label_image):
if region.area < 50:
continue
min_row, min_col, max_row, max_col = region.bbox
region_height = max_row - min_row
region_width = max_col - min_col
countourMaximumY = max_row + region_height
if countourMaximumY > maxY:
maxY = countourMaximumY
countourMaximumX = max_col + region_width
if countourMaximumX > maxX:
maxX = countourMaximumX
if min_row < minY:
minY = min_row
if min_col < minX:
minX = min_col
并使用
min_row, min_col, max_row, max_col = minY, minX, maxY, maxX
而不是
min_row, min_col, max_row, max_col = region.bbox
我正在使用 skimage 为图像创建区域
from skimage.measure import regionprops
from skimage import measure
label_image = measure.label(binary_car_image)
for region in regionprops(label_image):
...
在某些情况下,这些区域可以相互交叉。如下图所示:
在此图像中有两个区域,但它们彼此相交。 在这种情况下,我需要将它们合并到一个区域而不是两个区域。
我发现这个
谢谢
正如 fmw42 建议的那样,做这样的事情(这是未经测试的 C++ 代码,但它应该让您知道该怎么做):
首先,设置一些初始值:
int maxX = 0; // width of the contour + minimum x
int minX = 5000; // minimum x (big value)
int minY = 5000; // height of the contour + min y (big value)
int maxY = 0; // min y
然后,遍历所有 contours
,并通过 boundingRect
为每个 contour
计算其 bounding box
。 contours
存储在向量 contours
中,在 C++ 中它是 cv::Point
个向量的向量。
//loop through all the contours:
for( int i = 0; i < (int)contours.size(); i++ ){
//process the outter most contours only:
if ( hierarchy[i][3] == -1 ) {
//get the simple bounding box:
cv::Rect contourRect = cv::boundingRect( contours[i] );
//get the coordinates of the bounding box for x:
int countourMaximumX = contourRect.x + contourRect.width;
if ( countourMaximumX > maxX ){
maxX = countourMaximumX;
}
if ( contourRect.x < minX ){
minX = contourRect.x;
}
//get the coordinates of the bounding box for y:
int countourMaximumY = contourRect.y + contourRect.height;
if ( countourMaximumY > maxY ){
maxY = countourMaximumY;
}
if ( contourRect.y < minY ){
minY = contourRect.y;
}
}
}
最后,您可以获得 “复合”边界框 的最终 width
和 height
,如下所示:
//width and height of the composite box:
int width = maxX - minX;
int height = maxY - minY;
最终边界框的数据应该由minX
、minY
、width
和height
给出。
感谢 fmw42 的建议,我确实实现了 eldesgraciado 提出的 C++ 代码并且它的工作,这是我与 python 的实现,因为 python 中有相同问题的人:
label_image = measure.label(binary_car_image)
minY, minX, maxY, maxX = 5000, 5000, 0, 0
for region in regionprops(label_image):
if region.area < 50:
continue
min_row, min_col, max_row, max_col = region.bbox
region_height = max_row - min_row
region_width = max_col - min_col
countourMaximumY = max_row + region_height
if countourMaximumY > maxY:
maxY = countourMaximumY
countourMaximumX = max_col + region_width
if countourMaximumX > maxX:
maxX = countourMaximumX
if min_row < minY:
minY = min_row
if min_col < minX:
minX = min_col
并使用
min_row, min_col, max_row, max_col = minY, minX, maxY, maxX
而不是
min_row, min_col, max_row, max_col = region.bbox