cvDilate/cvErode:如何避免分离的对象之间的连接?
问题描述:
我想分开OpenCv中的对象,如下图所示: 但是,如果我使用cvDilate或cvErode对象一起成长...如何用OpenCv做到这一点?cvDilate/cvErode:如何避免分离的对象之间的连接?
答
据我所知,OpenCV没有“XOR扩张”(虽然这将是非常好的)。
为了得到相似的结果,您可以尝试侵蚀(如'd'),并使用被侵蚀的中心作为Voronoi分割的种子,然后您可以与原始图像进行“与”运算。
答
侵蚀和扩张后试图阈值的图像消除弱元素。只有强大的地区应该留下来,从而改善物体分离。顺便说一下,您可以更清楚地了解您的cvDilate或cvErode问题。
答
看起来你需要编写自己的扩张功能,然后自己添加xor功能。
每OpenCV的文档,这里是cvdilate使用规则:
DST =扩张(SRC,元素):DST(X,Y)= MAX((X 'Y')的元素)) SRC(X + X 'Y + Y')
这里是一个起点伪代码(这不包括XOR码):
void my_dilate(img) {
for(i = 0; i < img.height; i++) {
for(j = 0; j < img.width; j++) {
max_pixel = get_max_pixel_in_window(img, i, j);
img.pixel(i,j) = max_pixel;
}
}
}
int get_max_pixel_in_window(img, center_row, center_col) {
int window_size = 3;
int cur_max = 0;
for(i = -window_size; i <= window_size; i++) {
for(j = -window_size; j <= window_size; j++) {
int cur_col = center_col + i;
int cur_row = center_row + j;
if(out_of_bounds(img, cur_col, cur_row)) {
continue;
}
int cur_pix = img.pixel(center_row + i, center_col + j);
if(cur_pix > cur_max) {
cur_max = cur_pix;
}
}
}
return cur_max;
}
// returns true if the x, y coordinate is outside of the image
int out_of_bounds(img, x, y) {
if(x >= img.width || x < 0 || y >= img.height || y <= 0) {
return 1;
}
return 0;
}
你能告诉我使用这个功能的“out_of_bounds (img,cur_col,cur_row)“。 如果你编写它的伪代码,这将是一件好事。 – RidaSana 2012-02-12 23:57:34