想象一个普通的矩形位图,例如,1024x768像素,填充白色。在位图上绘制了一些(非重叠的)精灵:圆形,正方形和三角形。
是否有算法(可能甚至是C ++实现),给定位图和背景颜色(白色,在上例中),产生一个包含每个精灵的最小边界矩形的列表?
以下是一些示例:在左侧,您可以看到我的代码所在的示例位图(以及“背景”为白色的信息)。在右侧,您可以看到相同的图像以及四个形状的边界矩形(红色);我正在寻找的算法计算这些矩形的几何形状。
Input picture http://s1.directupload.net/images/111215/ruycwlgl.png Output picture http://s1.directupload.net/images/111215/encr84ps.png
一些绘画程序具有类似的选择形状的特征:它们甚至可以计算看似任意的边界多边形。您可以单击“背景”(背景和不是由某个阈值确定的内容),而不是手动拖动选择矩形,然后工具会自动计算绘制到背景上的对象的形状。我需要这样的东西,除非我只有对象的矩形边界区域,我就完全没问题了。
我开始意识到OpenCV;它似乎是相关的(它似乎是一个包含我能想到的所有图形算法的库 - 然后是一些)但是在快速的信息量中我无法找到通向我想到的算法的方法。如果OpenCV无法做到这一点,我会感到惊讶,但我担心你必须拥有一名博士才能使用它。 : - )
答案 0 :(得分:2)
这是我的第一个想法,没有复杂的,除了边缘检测
For each square,
if it's not-white
mark as "found"
if you havn't found one next to it already
add it to points list
for each point in the points list
use basic edge detection to find outline
keep track of bounds while doing so
add bounds to shapes list
remove duplicates from shapes list. (this can happen for concave shapes)
我刚刚意识到这会考虑白色的“洞”(就像样品中最左边的圆圈一样)是它自己的形状。如果第一个“循环”是泛洪填充,它没有这个问题,但会慢得多/需要更多的内存。
我想到的基本边缘检测很简单:
given eight cardinal directions left, downleft, etc...
given two relative directions cw(direction-1) and ccw(direction+1)
starting with a point "begin"
set bounds to point
find direction d, where the begin+d is not white, and begin+cw(d) is white.
set current to begin+d
do
if current is outside of bounds, increase bounds
set d = cw(d)
while(cur+d is white or cur+ccw(d) is not white)
d = ccw(d)
cur = cur + d;
while(cur != begin
这里没有考虑相当多的边缘情况:如果开始是单个点,如果它运行到图片的边缘怎么办,如果起始点只有1 px宽,但是有两边的blob,可能是其他人......但基本算法并不复杂。
答案 1 :(得分:2)