首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >噪声图像中拓扑图的识别

噪声图像中拓扑图的识别
EN

Stack Overflow用户
提问于 2014-04-17 06:53:04
回答 2查看 163关注 0票数 4

我完全没有机器学习或图像处理的经验,所以我希望有人能在这个问题上给出一些初步的想法:

下图是番茄植株叶片照片的一个例子。我们有上千个这样的系统。我们需要追踪静脉并输出一个图表。我们已经让本科生手工绘制了几百条血管,所以我假设这可以作为机器学习方法的训练集。

所以我的问题是:什么类型的过滤器/分类器会立即出现在脑海中?你有什么推荐给我读或看的吗?

我们的第一个想法是,看看方向导数。每个像素都可以被分类为在给定角度的边缘上或不在边缘上,如果一个像素在许多不同的角度,那么它可能是一个斑点而不是静脉。然后,可以通过学习来调整梯度阈值和角度变化的参数,但这可能不是最好的方法。

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

发布于 2014-04-17 16:49:48

两种方法立即浮现在脑海中

  1. 滑动窗口神经网络classifier
  2. identifying设置图像中暗/亮像素的阈值(这可以使用机器学习或可能简单的计算来完成),然后进行泛洪填充以识别图像中的区域。

第二种方法应该更简单,更快,所以我可能会先制作原型,看看它是否提供了足够好的答案。

在任何情况下,我的直觉是,它将更容易解决对偶问题-不是试图找到图的边和节点,而是找到它的面。由此,您可以很容易地获得图形本身。

票数 2
EN

Stack Overflow用户

发布于 2014-04-20 10:55:07

我做了一个非常简单的程序,用opencv过滤静脉区域。我已经添加了注释来解释这些操作。保存中间步骤的结果图像。希望能有所帮助。

代码语言:javascript
运行
复制
#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;
}

所提供的示例图像的输出如下所示:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23121609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档