我有以下图片:我想检测一下直观易读的音符轮廓,但是当我尝试这样做时,它实际上并不是那样的容易。
为了快速进行原型设计,我首先开始使用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 显然看起来不太容易。 :)也许你有一些新想法可以开始。
答案 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;
}
它给出了输出图像(之后才找到轮廓)。