Java 分割区域内的区域分割

Java 分割区域内的区域分割,java,image-processing,opencv,javacv,Java,Image Processing,Opencv,Javacv,这是一张图片: 我想知道如何将黑色圆圈设置为白色,其余圆圈设置为黑色。 (因此,在白色区域内分割黑色圆圈) 我知道我可以反转图像,圆圈将是白色的。。。但在这张图片中看到的整个黑色部分也是如此 如果我必须在matlab中这样做,我会做一个连接组件操作,并检查斑点的圆度。虽然我必须在opencv(确切地说是javacv)中完成这项工作 在opencv(javacv)中有没有一种简单的方法可以做到这一点 Thx预先您可以使用openCV库(通过java适配器)检测图像上的图像对象;为此,您需要为圆圈

这是一张图片:

我想知道如何将黑色圆圈设置为白色,其余圆圈设置为黑色。

(因此,在白色区域内分割黑色圆圈)

我知道我可以反转图像,圆圈将是白色的。。。但在这张图片中看到的整个黑色部分也是如此

如果我必须在matlab中这样做,我会做一个连接组件操作,并检查斑点的圆度。虽然我必须在opencv(确切地说是javacv)中完成这项工作

在opencv(javacv)中有没有一种简单的方法可以做到这一点


Thx预先

您可以使用openCV库(通过java适配器)检测图像上的图像对象;为此,您需要为圆圈训练网络

考虑到您的具体情况(此解决方案可能不是通用的),您可以将图像分段,并使用“作为条件-颜色更改”,请参见下面的伪代码:

//build color switching list
List<Point> colorSwitches = ...
for(each horizontal line from image){
    for(each pixel from line){
        if(color of previous pixel != color of current pixel){
            colorSwitches.add(currentPoint)
        }
    }    
}
// so, you have detected margins of your image objects; now we need to merge neighbor pixels into image objects, where image object is collection of margin points(you should create this class)
List<ImageObject> imageObjects = ...
for(each color switch){
    if(current pixel is connected with pixels from existing image objects){
        // returns image object neared with current point
        getRelatedImageObject(imageObjects).add(currentPoint);
    }else{
        imageObjects.add(new ImageObject(currentPixel));
    }
}
// now we have list of objects from image, and we need to match objects
//构建颜色切换列表
列表颜色开关=。。。
对于(图像中的每条水平线){
对于(每行的每个像素){
if(上一个像素的颜色!=当前像素的颜色){
颜色开关。添加(currentPoint)
}
}    
}
//因此,您已检测到图像对象的边距;现在我们需要将相邻像素合并到图像对象中,其中图像对象是边距点的集合(您应该创建这个类)
列出imageObjects=。。。
用于(每个颜色开关){
if(当前像素与现有图像对象中的像素连接){
//返回与当前点接近的图像对象
getRelatedImageObject(imageObjects).add(currentPoint);
}否则{
添加(新的ImageObject(currentPixel));
}
}
//现在我们有了图像中的对象列表,我们需要匹配对象
好的,它的一般路线如何做你需要的,如果你需要更准确,我会尝试解释更详细。你也可以直接联系我


希望它能对您有所帮助。

在OpenCV中有一种简单的方法,使用
findContours()
drawContours()
。如果使用层次结构版本的
findContours()
,则可以查看层次结构并仅绘制(填充)白色四边形的子轮廓。这还有一个额外的优点,即您可以在必要时进行一些完整性检查(例如,检查轮廓的大小,以查看它是否与您期望的大小近似)。我不知道java或javaV,但是你可以看看OpenCV中包含的FixToCror C++例子吗?