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 那么外面区域会有一些噪音......
这是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)
它给出了输出图像(之后才找到轮廓).
