gpt4 book ai didi

java - 使用 OpenCV 使用 find Contours() 减轻光反射?

转载 作者:太空宇宙 更新时间:2023-11-03 22:54:42 24 4
gpt4 key购买 nike

我是 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 channel 值减少到其原始值的 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 或图像处理的了解不多,所以我被困在这个问题上。

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

最佳答案

我的试用代码基于 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

关于java - 使用 OpenCV 使用 find Contours() 减轻光反射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33068274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com