我完全没有机器学习或图像处理的经验,所以我希望有人能在这个问题上给出一些初步的想法:
下图是番茄植株叶片照片的一个例子。我们有上千个这样的系统。我们需要追踪静脉并输出一个图表。我们已经让本科生手工绘制了几百条血管,所以我假设这可以作为机器学习方法的训练集。

所以我的问题是:什么类型的过滤器/分类器会立即出现在脑海中?你有什么推荐给我读或看的吗?
我们的第一个想法是,看看方向导数。每个像素都可以被分类为在给定角度的边缘上或不在边缘上,如果一个像素在许多不同的角度,那么它可能是一个斑点而不是静脉。然后,可以通过学习来调整梯度阈值和角度变化的参数,但这可能不是最好的方法。
谢谢你的帮助!
发布于 2014-04-17 16:49:48
两种方法立即浮现在脑海中
第二种方法应该更简单,更快,所以我可能会先制作原型,看看它是否提供了足够好的答案。
在任何情况下,我的直觉是,它将更容易解决对偶问题-不是试图找到图的边和节点,而是找到它的面。由此,您可以很容易地获得图形本身。
发布于 2014-04-20 10:55:07
我做了一个非常简单的程序,用opencv过滤静脉区域。我已经添加了注释来解释这些操作。保存中间步骤的结果图像。希望能有所帮助。
#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
#define INPUT_FILE "wMTjH3L.png"
#define OUTPUT_FOLDER_PATH string("")
#define CONTOUR_AREA_THRESHOLD 30.0
int _tmain(int argc, _TCHAR* argv[])
{
// read image as grayscale
Mat im = imread(INPUT_FILE, CV_LOAD_IMAGE_GRAYSCALE);
imwrite(OUTPUT_FOLDER_PATH + string("gray.jpg"), im);
// smooth the image with a gaussian filter
Mat blurred;
GaussianBlur(im, blurred, Size(3, 3), 1.5);
imwrite(OUTPUT_FOLDER_PATH + string("blurred.jpg"), blurred);
// flatten lighter regions while retaining the darker vein regions using morphological opening
Mat morph;
Mat morphKernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));
morphologyEx(blurred, morph, MORPH_OPEN, morphKernel);
imwrite(OUTPUT_FOLDER_PATH + string("morph.jpg"), morph);
// apply adaptive thresholding
Mat adaptTh;
adaptiveThreshold(morph, adaptTh, 255.0, ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY_INV, 7, 2.0);
imwrite(OUTPUT_FOLDER_PATH + string("adaptth.jpg"), adaptTh);
// morphological closing to merge disjoint regions
Mat morphBin;
Mat morphKernelBin = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
morphologyEx(adaptTh, morphBin, MORPH_CLOSE, morphKernelBin);
imwrite(OUTPUT_FOLDER_PATH + string("adptmorph.jpg"), morphBin);
// find contours
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(morphBin, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
// filter contours by region areas and draw
RNG rng(12345);
Mat drawing = Mat::zeros(morphBin.size(), CV_8UC3);
for(int idx = 0; idx >= 0; idx = hierarchy[idx][0])
{
if (contourArea(contours[idx]) > CONTOUR_AREA_THRESHOLD)
{
Scalar color( rand()&255, rand()&255, rand()&255 );
drawContours( drawing, contours, idx, color, CV_FILLED, 8, hierarchy );
}
}
imwrite(OUTPUT_FOLDER_PATH + string("cont.jpg"), drawing);
return 0;
}所提供的示例图像的输出如下所示:

https://stackoverflow.com/questions/23121609
复制相似问题