使用OpenCV使用findCountours()减轻光反射?

时间:2015-10-11 17:57:56

标签: java image opencv contour

我对OpenCV很陌生,但经过几个小时的努力,我开始了解它的运作方式。我正在使用Java中的OpenCV-2.4.11处理叶子识别功能,但由于光反射存在一些问题。 以下是原始图片:original leaf image

我已对其应用了一些变换以获得轮廓,但光反射导致问题。 我使用了以下命令:

Imgproc.cvtColor(dst, dst, Imgproc.COLOR_BGR2GRAY);
Imgproc.threshold(dst, dst, 0, 255, Imgproc.THRESH_BINARY_INV + Imgproc.THRESH_OTSU);

它产生了以下结果:enter image description here

现在,由于我对轮廓感兴趣,我申请了

ArrayList<MatOfPoint> points = new ArrayList<>();
Imgproc.findContours(dst, points, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.drawContours(dst, points, -1, new Scalar(255, 0, 0), 1);

它给了我enter image description here

缺陷是由光反射引起的,我不知道如何处理它。

我尝试使用HLS色彩空间将L通道值(原始图像)减少到其原始值的60%,因此图像变为如下所示: enter image description here

在那之后,我运行了以下命令`

Imgproc.cvtColor(dst, dst, Imgproc.COLOR_BGR2GRAY);
Imgproc.threshold(dst, dst, 0, 255, Imgproc.THRESH_BINARY_INV + Imgproc.THRESH_OTSU);
ArrayList<MatOfPoint> points = new ArrayList<>();
Imgproc.findContours(dst, points, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.drawContours(dst, points, -1, new Scalar(255, 0, 0), 1);

导致enter image description here

由于我对OpenCV或图像处理知之甚少,所以我坚持这个问题。

有谁知道如何解决(或缓解)这个问题? 提前谢谢!

1 个答案:

答案 0 :(得分:1)

我的试用代码基于HoughLinesP,如下所示。我希望它有所帮助。

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

using namespace cv;
using namespace std;

    int main(int argc, char** argv)
    {
        Mat src, src_gray, edges;

        char* filename = argc >= 2 ? argv[1] : (char*)"ibqYp.jpg";
        src = imread( filename, 1 );

        if( src.empty() )
        {
            return -1;
        }

        cvtColor( src, src_gray, COLOR_RGB2GRAY );
        Canny( src_gray, edges, 50, 200, 3 );

        vector<Vec4i> p_lines;

        HoughLinesP( edges, p_lines, 1, CV_PI/180, 50, 30, 10 );

        for( size_t i = 0; i < p_lines.size(); i++ )
        {
            Vec4i l = p_lines[i];
            if( abs(l[2]-l[0]) > abs(l[3]-l[1])* 3 ) // this is for filter vertical lines
                line( src, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,255,0), 1, LINE_AA);
        }
         cvtColor( src, src_gray, COLOR_RGB2GRAY );
         src_gray = src_gray < 190;
        imshow("result", src_gray );
        waitKey(0);
        return 0;
    }

结果图像(您可以轻松找到外部轮廓)

enter image description here