【发布时间】:2014-08-17 14:04:35
【问题描述】:
对于我的大学项目,我需要通过检测叶子的边缘来从植物叶子的形状中识别出一种植物。 (我使用 OpenCV 2.4.9 和 C++),但源图像是在植物的真实环境中拍摄的,并且有不止一片叶子。请参见下面的示例图像。所以这里我只需要提取一片叶子的边缘图案进行进一步处理。
使用 Canny Edge Detector 我可以识别整个图像的边缘。
但我不知道如何从这里着手提取仅一片叶子的边缘图案,可能会更清晰完整。我不知道这是否也可能。谁能告诉我这是否可能如何提取一片叶子的边缘我只想知道我需要应用于图像的图像处理步骤。我不想要任何代码示例。我是图像处理和 OpenCV 以及通过实验学习的新手。
提前致谢。
编辑
正如 Luis 所说,在使用 Canny 边缘检测进行边缘检测后,我已经对图像进行了形态学接近,但我似乎仍然很难从图像中找到最大的轮廓。 这是我处理图像所采取的步骤
-
应用双边滤波器降低噪音
bilateralFilter(img_src, img_blur, 31, 31 * 2, 31 / 2); -
通过直方图均衡调整对比度
cvtColor(img_blur,img_equalized,CV_BGR2GRAY); -
应用 Canny 边缘检测器
Canny(img_equalized, img_edge_detected, 20, 60, 3); -
阈值二值图像去除一些背景数据
threshold(img_edge_detected, img_threshold, 1, 255,THRESH_BINARY_INV); -
图像的形态接近
morphologyEx(img_threshold, img_closed, MORPH_CLOSE, getStructuringElement(MORPH_ELLIPSE, Size(2, 2)));
以下是我得到的结果图像。
我为上面的原始图像得到的这个结果
源图像和第二张图像的结果
来源:
结果:
有什么方法可以检测出最大的轮廓并从图像中提取出来?
请注意,我的最终目标是创建一个使用真实环境图像的植物识别系统,但在这里我不能使用模板匹配或遮罩之类的东西,因为用户必须拍摄图像并上传,因此系统没有关于叶子的任何先前的想法。
这是完整的代码
#include <opencv\cv.h>
#include <opencv\highgui.h>
using namespace cv;
int main()
{
Mat img_src, img_blur,img_gray,img_equalized,img_edge_detected,img_threshold,img_closed;
//Load original image
img_src = imread("E:\\IMAG0196.jpg");
//Apply Bilateral Filter to reduce noise
bilateralFilter(img_src, img_blur, 31, 31 * 2, 31 / 2);
//Adjust contrast by histogram equaliztion
cvtColor(img_blur,img_equalized,CV_BGR2GRAY);
//Apply Canny edge detector
Canny(img_equalized, img_edge_detected, 20, 60, 3);
//Threshold binary image to remove some background data
threshold(img_edge_detected, img_threshold, 15, 255,THRESH_BINARY_INV);
//Morphological close of the image
morphologyEx(img_threshold, img_closed, MORPH_CLOSE, getStructuringElement(MORPH_ELLIPSE, Size(2, 2)));
imshow("Result", img_closed);
waitKey(0);
return 0;
}
谢谢。
【问题讨论】:
-
您可能需要采用更模糊的方法。想想不完美的边缘检测可以做什么。 (这似乎也是大部分作业)
-
您可能会增加阈值以排除背景中的对象,然后查看剩余部分的分割
-
是的,我可以更改阈值并获得清晰的边缘,但问题是如何获得一片叶子的边缘?
-
@Drew Dormann 你能解释一下什么是模糊方法吗?谢谢你的评论
-
嗨,@Grant。我建议您不必担心获得一片叶子的完美轮廓,看看您可以对已经生成的图像进行哪些分析。
标签: c++ opencv image-processing feature-detection edge-detection