我对OpenCV很陌生,但经过几个小时的努力,我开始了解它的运作方式。我正在使用Java中的OpenCV-2.4.11处理叶子识别功能,但由于光反射存在一些问题。 以下是原始图片:
我已对其应用了一些变换以获得轮廓,但光反射导致问题。 我使用了以下命令:
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);
缺陷是由光反射引起的,我不知道如何处理它。
我尝试使用HLS色彩空间将L通道值(原始图像)减少到其原始值的60%,因此图像变为如下所示:
在那之后,我运行了以下命令`
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);
由于我对OpenCV或图像处理知之甚少,所以我坚持这个问题。
有谁知道如何解决(或缓解)这个问题? 提前谢谢!
答案 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;
}
结果图像(您可以轻松找到外部轮廓)