使用opencv在种植园航拍图像中分割树的最佳方法

时间:2015-07-09 07:02:43

标签: opencv image-processing computer-vision image-segmentation opencv3.0

所以我想从空中图像中分割出一棵树

样本图像(原始图像):

originalimage

我希望结果像这样(或更好):

result after using photoshop b&w filter first

我做的第一件事就是在opencv中使用阈值功能而我没有得到预期的结果(它无法分割树冠),然后我在photoshop中使用黑白过滤器使用一些调整后的参数(结果如下所示,并进行阈值和形态滤波,得到如上所示的结果。

photoshop b&w

我的问题是,是否有一些方法可以在不使用photoshop的情况下对图像进行分割,并像第二张图像(或更好)一样生成分割图像?或者有没有办法像第三张图像那样制作图像?

ps:你可以在这里阅读photoshop b& w过滤问题:https://dsp.stackexchange.com/questions/688/whats-the-algorithm-behind-photoshops-black-and-white-adjustment-layer

2 个答案:

答案 0 :(得分:5)

可以在OpenCV中执行此操作。下面的代码基本上与您在Photoshop中执行的操作相同。您可能需要调整一些参数以使完全您想要的内容。

#include "opencv2\opencv.hpp"
using namespace cv;

int main(int, char**)
{
    Mat3b img = imread("path_to_image");

    // Use HSV color to threshold the image
    Mat3b hsv;
    cvtColor(img, hsv, COLOR_BGR2HSV);

    // Apply a treshold
    // HSV values in OpenCV are not in [0,100], but:
    // H in [0,180]
    // S,V in [0,255]

    Mat1b res;
    inRange(hsv, Scalar(100, 80, 100), Scalar(120, 255, 255), res);

    // Negate the image
    res = ~res;

    // Apply morphology 
    Mat element = getStructuringElement( MORPH_ELLIPSE, Size(5,5));
    morphologyEx(res, res, MORPH_ERODE, element, Point(-1,-1), 2);
    morphologyEx(res, res, MORPH_OPEN, element);

    // Blending
    Mat3b green(res.size(), Vec3b(0,0,0));
    for(int r=0; r<res.rows; ++r) {
        for(int c=0; c<res.cols; ++c) {
            if(res(r,c)) { green(r,c)[1] = uchar(255); }
        }
    }

    Mat3b blend;
    addWeighted(img, 0.7, green, 0.3, 0.0, blend);

    imshow("result", res);
    imshow("blend", blend);
    waitKey();

    return 0;
}

生成的图像是:

enter image description here

混合图像是:

enter image description here

答案 1 :(得分:2)

这在过去一直是一个有趣的研究课题 - 主要是在遥感文献中。

虽然使用OpenCV提出的形态学方法在某些情况下会起作用,但您可能需要考虑更复杂的方法(取决于您的数据的变量以及您想要构建的检测器的稳健性)。

例如,this paperthose who cite it - 让您了解所尝试的内容。

从语用上讲 - 我认为一个简洁的解决方案将更多地建立在统计纹理分析上。有许多方法可以将图像的区域分类(然后计数)为属于纹理(共同出现矩阵,滤波器组,纹理,小波等等)。

可悲的是,这是一个OpenCV相当缺乏的领域 - 它只提供了一些有用算法的子集......但是,这里有一些简单的想法(我没有直接尝试过,只是我和# 39; m知道基于潜在的OpenCV):

无论如何,我希望你能得到适合你目的的东西!