在MATLAB中提供了简单的边缘检测

时间:2014-03-24 10:05:10

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

我有以下图片:我想检测一下直观易读的音符轮廓,但是当我尝试这样做时,它实际上并不是那样的容易。

为了快速进行原型设计,我首先开始使用MATLAB(但后来我想用Java做这件事,因此我不想在MATLAB中使用太多特殊算法,而是尝试使用基本的图像处理算法(prewitt / sobel) / canny / adaptive thresholds / hough trafo)也可以用其他语言轻松获得(例如opencv等)..

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

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

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

当手动将阈值设置为标量时(至.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 显然看起来不太容易。 :)也许你有一些新想法可以开始。

1 个答案:

答案 0 :(得分:5)

这是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;
}

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

enter image description here