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

tim*_*tim 2 algorithm matlab opencv image-processing edge-detection

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

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

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

I = double(rgb2gray(imread('img.jpg')));
bw = edge(I, 'canny');
imshow(bw)
Run Code Online (Sandbox Code Playgroud)

我认为在使用自动模式时,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);
Run Code Online (Sandbox Code Playgroud)

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

任何想法如何改善它?此外,我想稍后将图像取消扭曲为矩形.关于如何做的任何想法?霍夫变换不适用于像上图那样的非直线轮廓,因为它会产生直线...

非常感谢!

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

Edit2:刚发现算法检测照片的纸张角落显然看起来不太容易.:)也许你有一些新的想法开始.

And*_*dov 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;
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述