【问题标题】:Supposed easy edge detection in MATLAB假设在 MATLAB 中进行简单的边缘检测
【发布时间】:2014-05-01 14:54:03
【问题描述】:

我有以下图像:,我想检测一下直觉上看起来很容易的音符轮廓,但是当我尝试这样做时,实际上并不那么容易。

为了快速原型设计,我首先开始使用 MATLAB(但后来我想在 Java 中进行,因此我不想在 MATLAB 中使用太多特殊算法,而是尝试使用基本的图像处理算法(prewitt / sobel / canny / 自适应阈值 / hough trafo)也很容易以另一种语言提供(例如 opencv 等)..

最容易开始的代码是(但我认为这应该已经相当不错了,因为与内部相比,外部边缘看起来更强大):

I = double(rgb2gray(imread('img.jpg')));
bw = edge(I, 'canny');
imshow(bw)

我认为matlab在使用自动模式时会很好地选择canny过滤器中的阈值。但实际上并没有:http://i.imgur.com/LeKPgso.png

当手动将阈值设置为标量时(例如设置为 0.4),内部文本的渐变仍然太多,而外部边框已经太不完整/不完整:http://i.imgur.com/p68CVIU.png

我尝试使用 prewitt 过滤器(在 x 和 y 方向):

I = double(rgb2gray(imread('img.jpg')));
f1 = double(fspecial('prewitt'));
x = conv2(I, f);
y = conv2(I, f');
bw = (x.^2+y.^2).^0.5;
colormap(gray(256))
imagesc(bw);

导致:http://i.imgur.com/Jd9Fqpn.png 所以也不是很好... 它看起来更好,但外面仍然很不完整:(

任何想法如何改进它? 此外,我想稍后将图像展开为矩形。关于如何做的任何想法?霍夫变换不适用于像上图这样的非直线轮廓,因为它会产生直线...

非常感谢!

编辑:好吧,我发现斑驳的外观来自 MATLAB... 放大时,它好多了,斑驳更少,请参阅:http://i.imgur.com/UrPd8me.png 我可以想象通过缩小外轮廓来找到轮廓,因为在这种情况下它是全黑的(某种边界框)。但我不想假设因为这些照片并不总是打开手电筒拍摄,例如:http://i.imgur.com/nfqygmA.jpg 那么外围区域会有一些噪音...

Edit2:刚找到Algorithm to detect corners of paper sheet in photo 显然看起来不太容易。 :) 也许你有一些新的想法可以开始。

【问题讨论】:

    标签: algorithm matlab opencv image-processing edge-detection


    【解决方案1】:

    这是 C++ 中的原型:

    #include <iostream>
    #include <vector>
    #include <stdio.h>
    #include <stdarg.h>
    #include "opencv2/opencv.hpp"
    #include "fstream"
    #include "iostream"
    using namespace std;
    using namespace cv;
    //-----------------------------------------------------------------------------------------------------
    // 
    //-----------------------------------------------------------------------------------------------------
    int main( int argc, char** argv )
    {
        namedWindow("Img");
        Mat Img=imread("Test2.JPG",0);
        cv::resize(Img,Img,Size(Img.cols/8,Img.rows/8));
        cv::threshold(Img,Img,100,255,cv::THRESH_OTSU);
        cv::dilate(Img,Img,cv::Mat::ones(3,3,CV_8UC1));
        cv::erode(Img,Img,cv::Mat::ones(23,23,CV_8UC1));
        cv::resize(Img,Img,Size(Img.cols*8,Img.rows*8));
        imshow("Img",Img);
        waitKey(0);
        return 0;
    }
    

    它给出输出图像(之后只找到轮廓)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 2012-09-17
      相关资源
      最近更新 更多